Лучший способ Sanitize / Filter Комментарии пользователей?

В настоящее время я использую этот процесс для Sanitize / Filter comment, введенного пользователями ->
Этот используется для удаления косых черт … и

if (get_magic_quotes_gpc()) { function stripslashes_deep($value) { $value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); return $value; } $_POST = array_map('stripslashes_deep', $_POST); $_GET = array_map('stripslashes_deep', $_GET); $_COOKIE = array_map('stripslashes_deep', $_COOKIE); $_REQUEST = array_map('stripslashes_deep', $_REQUEST); } 

Затем комментарий проходит через эту функцию для дезинфекции данных …

  function my_strip_tags($str) { $strs=explode('<',$str); $res=$strs[0]; for($i=1;$i<count($strs);$i++) { if(!strpos($strs[$i],'>')) $res = $res.'&lt;'.$strs[$i]; else $res = $res.'<'.$strs[$i]; } return strip_tags($res); } ,  function my_strip_tags($str) { $strs=explode('<',$str); $res=$strs[0]; for($i=1;$i<count($strs);$i++) { if(!strpos($strs[$i],'>')) $res = $res.'&lt;'.$strs[$i]; else $res = $res.'<'.$strs[$i]; } return strip_tags($res); } 

После этого он поступает прямо в базу данных с помощью подготовленного оператора.

 function add_comment($comment,$type,$update_id,$user_id){ $query="INSERT INTO comment_updates (updateid,userid,comment) VALUES(?,?,?)"; if($stmt=$this->conn->prepare($query)) { $stmt->bind_param('sss',$update_id,$user_id,$comment); $stmt->execute(); if($this->conn->affected_rows==1){ $stmt->close(); return true; } } } 

Я просто хотел знать, достаточно ли это безопасно или если у них есть другие лучшие альтернативы … Спасибо

Solutions Collecting From Web of "Лучший способ Sanitize / Filter Комментарии пользователей?"

Не пишите свой собственный дезинфицирующее средство для HTML. Вы создадите отверстия XSS.

Если вы собираетесь писать свои собственные, по крайней мере, запустите ha.ckers.org xss smoketests против него

Между этими тестами и сопоставлением фильтров htmlpurifier вы должны быть в состоянии получить представление о том, насколько сложна html-санизация – и почему вы должны оставить ее профессионалам.

Самое главное, когда вы думаете о хранении данных в базе данных, – это избежать этого; используя mysql_real_escape_string или mysqli_real_escape_string или PDO::quote , в зависимости от используемой вами базы данных (или других функций для oracle / pg / …)

Другим решением было бы использовать подготовленные операторы (см. mysqli::prepare и / или PDO::prepare – те, которые не поддерживаются старым расширением mysql_* ), которые будут касаться экранирования данных на вашем месте 😉

Когда вы думаете о выходе HTML, у вас есть два решения:

  • принять HTML и использовать некоторую библиотеку, такую ​​как HTMLPurifier, для фильтрации / очистки; он позволит точно указать, какие теги и атрибуты разрешены, и даст вам чистый и действительный HTML как вывод.
  • попробуйте удалить HTML, как вы doinig – не всегда хорошо работает (что, если вы забудете какой-то специальный случай?)
  • escape HTML, с htmlentities или htmlspecialchars : не обязательно выглядит красиво, но вывод будет выглядеть как вход пользователя.

Я бы пошел либо с первым, либо с последним решением; ваш чувствует себя более «опасным», но это всего лишь чувство ^ (общая идея «не изобретать велосипед»)

Ваша магическая обработка кавычек прекрасна, хотя, если вы создаете параметры получения с помощью кавычек, вам нужно также stripslashes ключи. 🙂

Что касается полос-тегов, вам лучше с реальной библиотекой фильтров HTML. Существует так много поводов, связанных с html, что вы просто не должны доверять всему, что только что делаете, и забыть о них. Люди тратят время на создание этих фильтров HTML, поэтому используют их работу в ваших интересах.

Что касается «прямо в БД», хорошо в связанных параметрах, конечно, это здорово. Вы можете спокойно помещать что-либо в связанный параметр. В строке с кавычками я надеюсь, что вы избегаете результата.

Побег всех символов при вводе в базу данных. При извлечении и отображении обязательно <sometag> форматирования html, такого как <sometag> чтобы он отображался вместо того, чтобы обрабатываться как код.

PHP имеет малоизвестные, но мощные встроенные функции санитарии. Я бы рекомендовал использовать их:

Вводная фильтрация в PHP

filter_input и filter_var