PHP.SU

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

Страниц (4): [1] 2 3 4 »

> Найдено сообщений: 51
resik Отправлено: 01 Августа, 2016 - 20:36:50 • Тема: Спец. символы в урл • Форум: Вопросы новичков

Ответов: 11
Просмотров: 459
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.  
resik Отправлено: 28 Июля, 2016 - 02:45:16 • Тема: Спец. символы в урл • Форум: Вопросы новичков

Ответов: 11
Просмотров: 459
Решил сделать так:
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.  


Может и не правильный подход, но вроде как желаемое достигнуто Улыбка
resik Отправлено: 27 Июля, 2016 - 23:01:52 • Тема: Спец. символы в урл • Форум: Вопросы новичков

Ответов: 11
Просмотров: 459
Мелкий, за ссылки на исходники функций при много благодарен.
resik Отправлено: 27 Июля, 2016 - 21:46:11 • Тема: Спец. символы в урл • Форум: Вопросы новичков

Ответов: 11
Просмотров: 459
Мелкий пишет:
Не лезть и ничего не менять. Правильны оба. Потому что 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, который корректно разберёт оба варианта.


Что значит не лезть? Я же не какой то левый двиг переписываю. По этому хочется разобраться что преобразовывать, что вырезать и чем.
resik Отправлено: 27 Июля, 2016 - 20:22:13 • Тема: Спец. символы в урл • Форум: Вопросы новичков

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

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_* ? Ох уж эти урлы Закатив глазки
resik Отправлено: 27 Июля, 2016 - 10:26:02 • Тема: Спец. символы в урл • Форум: Вопросы новичков

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

К примеру имеем статью с название:
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.  
resik Отправлено: 25 Мая, 2016 - 22:46:02 • Тема: rawurlencode - как им пользоватся? • Форум: Вопросы новичков

Ответов: 4
Просмотров: 206
Мелкий пишет:
Поисковики нормально жрут даже URI, грубо нарушающие стандарты.

resik пишет:
Сбивает с толку то, что mediawiki например по каким то не понятным причинам в своих урлах меняет пробелы на _ за место %20 ( стало быть не просто так ).

Для читаемости урла человеком. _ и выглядит как _, нет необходимости воспринимать отличие %20 от %26 того же.
Название статьи и её url хранятся (и порой редактируются) раздельно как раз поэтому.


Какой в этом смысл если в современных браузерах в адресной строке и при наведении на подобные ссылки как бы уже происходит rawurldecode.

Конечно если это не недобраузер IE8 Радость
resik Отправлено: 25 Мая, 2016 - 20:32:24 • Тема: rawurlencode - как им пользоватся? • Форум: Вопросы новичков

Ответов: 4
Просмотров: 206
Это не столько решение задачи, сколько попытки избежать возможные проблемы связанные с такими урл.

Перефразирую свой вопрос: одинаково ли будут относится поисковики к данным символам в урл, будь то они как есть или замененные на шестнадцатеричную пару?

Сбивает с толку то, что mediawiki например по каким то не понятным причинам в своих урлах меняет пробелы на _ за место %20 ( стало быть не просто так ).
resik Отправлено: 25 Мая, 2016 - 14:39:37 • Тема: rawurlencode - как им пользоватся? • Форум: Вопросы новичков

Ответов: 4
Просмотров: 206
Здравствуйте.

Есть ли смысл заменять не зарезервированные символы ( "-" / "." / "_" / "~" ) после функции rawurlencode для определенных частей урла. Интересует мнение тех, кто сталкивался с данным вопросом.

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $name = 'новая-._~статья';
  4.  
  5. $url = rawurlencode( $name );
  6.        
  7. // RFC 3986 - 2.3.  ( replace unreserved characters )
  8. $url = str_replace( array( '-', '.', '_', '~' ), array( '%2D', '%2E', '%5F', '%7E' ), $url );
  9.  
  10. echo '<a href="/article/'.$url.'/">'.$name.'</a>';
  11.  
  12. ?>
resik Отправлено: 27 Апреля, 2016 - 18:49:36 • Тема: Почему кодировка в html письме неверная • Форум: Вопросы новичков

Ответов: 3
Просмотров: 282
Вот функция, попробуйте:
PHP:
скопировать код в буфер обмена
  1.  
  2. function sendMail( $to, $subject, $message, $mail_from = false ) {
  3.  
  4.         $mail_from      =       (!$mail_from) ? "noreply@".str_replace("www.", "", $_SERVER['SERVER_NAME']) : $mail_from;
  5.         $uniqid         =       md5(uniqid(time()));
  6.  
  7.         $headers = 'From: '.$mail_from."\n";
  8.         $headers.= 'Reply-to: '.$mail_from."\n";
  9.         $headers.= 'Return-Path: '.$mail_from."\n";
  10.         $headers.= 'Message-ID: <'.$uniqid.'@'.$_SERVER['SERVER_NAME'].">\n";
  11.         $headers.= 'MIME-Version: 1.0'."\n";
  12.         $headers.= 'Date: '.gmdate('D, d M Y H:i:s', time())."\n";
  13.         $headers.= 'X-Priority: 3'."\n";
  14.         $headers.= 'X-MSMail-Priority: Normal'."\n";
  15.         $headers.= 'X-Mailer: MyCMS : 1.0'."\n";
  16.         $headers.= 'X-MimeOLE: MyCMS : 1.0'."\n";
  17.         $headers.= 'Content-Type: multipart/mixed;boundary="----------'.$uniqid.'"'."\n\n";
  18.         $headers.= '------------'.$uniqid."\n";
  19.         $headers.= 'Content-Type: text/html;charset=utf-8'."\n";
  20.         $headers.= 'Content-Transfer-Encoding: 8bit';
  21.  
  22.         return @mail( $to, $subject, $message, $headers );
  23. }
  24.  
resik Отправлено: 27 Апреля, 2016 - 10:14:04 • Тема: Обертка PDO • Форум: Вопросы новичков

Ответов: 6
Просмотров: 431
Ch_chov пишет:
От задачи зависит. Для чего вам вообще обёртка?


Для добавления своих методов класса к дополнению уже существующих от PDO, обработка исключений, логирование ошибок, сбор запросов и все такое.
resik Отправлено: 27 Апреля, 2016 - 08:59:58 • Тема: Обертка PDO • Форум: Вопросы новичков

Ответов: 6
Просмотров: 431
Ch_chov пишет:
Первая обёртка реализованна через наследование, вторая через фабрику. В текущем виде обе реализации не имеют никакого смысла.


Какой стиль использовать лучше и почему, подскажите, если не сложно.
resik Отправлено: 26 Апреля, 2016 - 23:17:56 • Тема: Обертка PDO • Форум: Вопросы новичков

Ответов: 6
Просмотров: 431
Здравствуйте.

Может кто пояснить смысл двух разных реализация обертки для PDO.
В примерах опущены блоки try catch и прочее.

Пример 1:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. class DB extends PDO
  3. {
  4.         public function __construct()
  5.         {
  6.                 parent::__construct( $dsn );
  7.         }
  8.        
  9.         public function query( $sql )
  10.         {
  11.                 return parent::query( $sql );
  12.         }
  13. }
  14.  
  15. $db = new DB();
  16.  
  17. $db->query( /*SQL*/ );
  18.  


Пример 2:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. class DB
  3. {
  4.         private $_instance;
  5.        
  6.         public function __construct()
  7.         {
  8.                 $this->_instance = new PDO( $dsn );
  9.         }
  10.        
  11.         public function query( $sql )
  12.         {
  13.                 return $this->_instance->query( $sql );
  14.         }
  15. }
  16.  
  17. $db = new DB();
  18.  
  19. $db->query( /*SQL*/ );
  20.  
resik Отправлено: 16 Марта, 2016 - 00:08:34 • Тема: Кража сессии или паранойя? • Форум: Вопросы новичков

Ответов: 20
Просмотров: 964
Хотелось бы вернутся к вопросы.

PHP:
скопировать код в буфер обмена
  1.  
  2. class Member
  3. {
  4.         public static function signedIn()
  5.         {
  6.                 if ( isset( $_SESSION['member'] ) ) {
  7.                         if ( $_SESSION['member']['ip'] == getIP() ) {
  8.                                 return $_SESSION['member'];
  9.                         }
  10.                         self::signOut();
  11.                 }
  12.                 return false;
  13.         }
  14.  
  15.         public static function signIn( $login, $password )
  16.         {
  17.                 global $db, $config;
  18.  
  19.                 $hash = self::encode( $password );
  20.                
  21.                 $sql = "SELECT * FROM `{$config['sql_dbname']}`.`members` WHERE login=? AND hash=?";
  22.                 $bindValues = array( 1 => $login, 2 => $hash );
  23.                
  24.                 if ( $user = $db->result( $sql, $bindValues ) ) {
  25.                         $_SESSION['member'] = array();
  26.                         foreach ( $user as $key => $value ) {
  27.                                 $_SESSION['member'][$key] = $value;
  28.                         }
  29.                         $_SESSION['member']['ip'] = getIP();
  30.                         return true;
  31.                 }
  32.                 return false;
  33.         }
  34.        
  35.         public static function signOut()
  36.         {
  37.                 unset( $_SESSION['member'] );
  38.         }
  39.        
  40.         private static function encode( $str )
  41.         {
  42.                 return base64_encode( hash( 'whirlpool', $str, true ) );
  43.         }
  44. }
  45.  
  46. if ( $member = Member::signedIn() ) {
  47.         // вошли
  48. } else {
  49.         // предлогаем войти
  50. }
  51.  


Надежен ли такой вариант? Или все таки лучше дополнительно добавить проверку с клиент стороны ( куки ) ?
resik Отправлено: 09 Марта, 2016 - 23:06:07 • Тема: Кража сессии или паранойя? • Форум: Вопросы новичков

Ответов: 20
Просмотров: 964
Теперь в конец запутался Не понял

При удачной авторизации пишу все значения полей пользователя в определенный массив сессии.
PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [id] => айди
  4.     [login] => логин
  5.     [hash] => хэш пароля
  6.     [name] => нэйм
  7.     [email] => мыло
  8.     [create_time] => дата реги
  9.     [last_entry_time] => дата последнего входа
  10.     [group_id] => айди группа
  11. )
  12.  


Проверяю авторизацию на существование определенного массива сессии.

Вариант не безопасен?

Страниц (4): [1] 2 3 4 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB