Лучший способ дезинфицировать / фильтровать комментарии от пользователей? - PullRequest
2 голосов
/ 18 сентября 2009

В настоящее время я использую этот процесс для очистки / фильтрации комментариев, введенных пользователями ->
Этот используется для удаления косой черты ... и

 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 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;
                    }
            }
        }

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

Ответы [ 5 ]

5 голосов
/ 18 сентября 2009

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

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


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

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

Я бы выбрал первое или последнее решение; твое кажется более "опасным" - но это только чувство ^^ (общая идея - "не изобретай велосипед")

3 голосов
/ 18 сентября 2009

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

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

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

0 голосов
/ 19 сентября 2009

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

Фильтрация ввода в PHP

фильтр_вход и фильтр_вар

0 голосов
/ 18 сентября 2009

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

0 голосов
/ 18 сентября 2009

С вашими магическими кавычками все в порядке, хотя, если вы создаете параметры get с кавычками, вам также необходимо разделить ключи. :)

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

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

...