Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Спец. символы в урл

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
resik
Отправлено: 27 Июля, 2016 - 10:26:02
Post Id



Новичок


Покинул форум
Сообщений всего: 51
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Подскажите, какие из символов лучше вырезать, а какие кодировать.

К примеру имеем статью с название:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Новая статья~!@#$&*%^()=-_:\/,:;|?{}+"'`<>
  3.  


Формируем урл статьи из ее названия функцией:
PHP:
скопировать код в буфер обмена
  1.  
  2. /**
  3. * @param $str - название статьи
  4. * @return кодированная часть для урл
  5. */
  6. function str2url( $str )
  7. {
  8.     // какие не желательные вырезать
  9.     // какие кодировать
  10.  
  11.     return strtolower( rawurlencode( $str ) );
  12. }
  13.  

(Отредактировано автором: 27 Июля, 2016 - 10:29:47)

 
 Top
Мелкий Супермодератор
Отправлено: 27 Июля, 2016 - 11:16:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




urlencode и rawurlencode обеспечивают корректное представление в URI любых данных. Даже бинарных.


-----
PostgreSQL DBA
 
 Top
resik
Отправлено: 27 Июля, 2016 - 20:22:13
Post Id



Новичок


Покинул форум
Сообщений всего: 51
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Сравнил работу этих функций, и понял, что ни чего не понял Радость

PHP:
скопировать код в буфер обмена
  1.  
  2. $str = 'Новая статья~!@#$&*%^()=-_:\/,:;|?{}+"\'`<>';
  3.  
  4. echo urlencode( $str );
  5. // %D0%9D%D0%BE%D0%B2%D0%B0%D1%8F+%D1%81%D1%82%D0%B0%D1%82%D1%8C%D1%8F%7E%21%40%23%24%26%2A%25%5E%28%29%3D-_%3A%5C%2F%2C%3A%3B%7C%3F%7B%7D%2B%22%27%60%3C%3E
  6.  
  7. echo rawurlencode( $str );
  8. // %D0%9D%D0%BE%D0%B2%D0%B0%D1%8F%20%D1%81%D1%82%D0%B0%D1%82%D1%8C%D1%8F~%21%40%23%24%26%2A%25%5E%28%29%3D-_%3A%5C%2F%2C%3A%3B%7C%3F%7B%7D%2B%22%27%60%3C%3E
  9.  


Как то не совсем понятно, почему rawurlencode не кодирует тильду.
Еще не устраивает замена пробела на + у urlencode.

Что лучше, менять пробел на %20 при urlencode, или же тильду на %7E при rawurlencode?

Или присмотреться к FILTER_SANITIZE_* ? Ох уж эти урлы Закатив глазки

(Отредактировано автором: 27 Июля, 2016 - 20:26:53)

 
 Top
Мелкий Супермодератор
Отправлено: 27 Июля, 2016 - 21:28:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Не лезть и ничего не менять. Правильны оба. Потому что RFC разные.
http://www[dot]faqs[dot]org/rfcs/rfc3986[dot]html
http://www[dot]faqs[dot]org/rfcs/rfc1738[dot]html

php распаковывает входящий query string через urldecode, который корректно разберёт оба варианта.


-----
PostgreSQL DBA
 
 Top
Fart
Отправлено: 27 Июля, 2016 - 21:45:17
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




символы тебе нужно фильтровать на сервере.

1. какие именно в ссылке вырезать?
тот кто тебя будет ломать, он не будет использовать твои ссылки. подделать ссылку хацкеру не составит труда.

2. какие символы вырезать?
вырезайте те, которые тебе не нравятся. можно не вырезать, а экранировать или менять их на хтмл представления.

3. кодировать ссылки? незачем. просто тебе могут прислать кодированную ссылку, а ты ее должен раскодировать из за известных причин!!!
 
 Top
resik
Отправлено: 27 Июля, 2016 - 21:46:11
Post Id



Новичок


Покинул форум
Сообщений всего: 51
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Мелкий пишет:
Не лезть и ничего не менять. Правильны оба. Потому что RFC разные.
http://www[dot]faqs[dot]org/rfcs/rfc3986[dot]html
http://www[dot]faqs[dot]org/rfcs/rfc1738[dot]html

php распаковывает входящий query string через urldecode, который корректно разберёт оба варианта.


Что значит не лезть? Я же не какой то левый двиг переписываю. По этому хочется разобраться что преобразовывать, что вырезать и чем.
 
 Top
Мелкий Супермодератор
Отправлено: 27 Июля, 2016 - 22:38:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




resik пишет:
По этому хочется разобраться что преобразовывать

Ну так вот RFC. Разбирайте.

Реализация:
rawurlencode https://github[dot]com/php/php-src/b[dot][dot][dot]ndard/url[dot]c#L624
urlencode https://github[dot]com/php/php-src/b[dot][dot][dot]ndard/url[dot]c#L502


-----
PostgreSQL DBA
 
 Top
resik
Отправлено: 27 Июля, 2016 - 23:01:52
Post Id



Новичок


Покинул форум
Сообщений всего: 51
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Мелкий, за ссылки на исходники функций при много благодарен.

(Отредактировано автором: 27 Июля, 2016 - 23:02:55)

 
 Top
resik
Отправлено: 28 Июля, 2016 - 02:45:16
Post Id



Новичок


Покинул форум
Сообщений всего: 51
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Решил сделать так:
PHP:
скопировать код в буфер обмена
  1.  
  2. function str2url( $str )
  3. {
  4.         $pattern = preg_quote( '#$%^&*!@()_&+=`-[]\';,./{}|\":<>?~', '#' );
  5.        
  6.         $str = preg_replace( "#[{$pattern}]#", '-', $str );
  7.  
  8.         $str = preg_replace( '/\\s+/', '-', $str );
  9.        
  10.         $str = preg_replace( '/-+/', '-', $str );
  11.        
  12.         return strtolower( rawurlencode( trim( $str, '-' ) ) );
  13. }
  14.  
  15. $name = "-Новая - статья~!@#$&*%^()=-_:\/,:;|{}+\"\'`?var=val-";
  16. $url = str2url( $name );
  17.  
  18. echo '<a href="/article/'.$url.'/">'.$name.'</a>';
  19. // html: <a href="/article/%d0%9d%d0%be%d0%b2%d0%b0%d1%8f-%d1%81%d1%82%d0%b0%d1%82%d1%8c%d1%8f-var-val/">-Новая - статья~!@#$&*%^()=-_:\/,:;|{}+"\'`?var=val-</a>
  20. // при наведении и в адресной строке: site.ru/article/Новая-статья-var-val/
  21.  


Может и не правильный подход, но вроде как желаемое достигнуто Улыбка

(Отредактировано автором: 28 Июля, 2016 - 07:30:20)

 
 Top
Fart
Отправлено: 31 Июля, 2016 - 10:41:03
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




если ты такой код будешь добавлять себе на сайт, то юзер с XSS будет очень рад тебя удивить!!!

вот результат твоей выборки

PHP:
скопировать код в буфер обмена
  1. function str2url( $str )
  2. {
  3.         $pattern = preg_quote( '#$%^&*!@()_&+=`-[]\';,./{}|\":<>?~', '#' );
  4.        
  5.         $str = preg_replace( "#[{$pattern}]#", '-', $str );
  6.  
  7.         $str = preg_replace( '/\\s+/', '-', $str );
  8.        
  9.         $str = preg_replace( '/-+/', '-', $str );
  10.        
  11.         return strtolower( rawurlencode( trim( $str, '-' ) ) );
  12. }
  13.  
  14. $name = "<script>alert('Ты взломан');</script>";
  15. $url = str2url( $name );
  16.  
  17. echo '<a href="/article/'.$url.'/">'.$name.'</a>';

(Отредактировано автором: 31 Июля, 2016 - 10:43:32)

 
 Top
resik
Отправлено: 01 Августа, 2016 - 20:36:50
Post Id



Новичок


Покинул форум
Сообщений всего: 51
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Fart пишет:
если ты такой код будешь добавлять себе на сайт, то юзер с XSS будет очень рад тебя удивить!!!

вот результат твоей выборки

PHP:
скопировать код в буфер обмена
  1. function str2url( $str )
  2. {
  3.         $pattern = preg_quote( '#$%^&*!@()_&+=`-[]\';,./{}|\":<>?~', '#' );
  4.        
  5.         $str = preg_replace( "#[{$pattern}]#", '-', $str );
  6.  
  7.         $str = preg_replace( '/\\s+/', '-', $str );
  8.        
  9.         $str = preg_replace( '/-+/', '-', $str );
  10.        
  11.         return strtolower( rawurlencode( trim( $str, '-' ) ) );
  12. }
  13.  
  14. $name = "<script>alert('Ты взломан');</script>";
  15. $url = str2url( $name );
  16.  
  17. echo '<a href="/article/'.$url.'/">'.$name.'</a>';


А причем тут юзер? Данная функция доступна только админу при добавлении статьи.
Вы сами то будете писать XSS в заголовки своих статей? Радость

Ну а если замучает паранойя, отфильтрую примерно так:

PHP:
скопировать код в буфер обмена
  1. $name = "<script>alert('Ты взломан');</script>";
  2.  
  3. $name = htmlspecialchars( strip_tags( $name ) );
  4.  
 
 Top
Fart
Отправлено: 01 Августа, 2016 - 22:27:55
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




Не думаю, что твой ресурс кому то будет нужен, ну, если только поржать чисто, а вот социальную инженерию никто не отменял. Интересно будет на твой ресурс поглядеть, когда тебя коснется эта тема, с такой то логикой

(Отредактировано автором: 01 Августа, 2016 - 22:29:42)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB