Вопрос по filter, php, sanitize – Лучший способ дезинфицировать / фильтровать комментарии от пользователей?

2

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

 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   ответов
0

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

0

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

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

filter_input а такжеfilter_var

3

отверстия XSS.

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

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

«Не пишите свое собственное средство для дезинфекции HTML. Вы создадите дыры в XSS». Согласно вашему утверждению, невозможно построить один без дырок, если вы используете 1, который сделали другие, это означало бы, что у него также есть дыры, если он был построен человеком. Так что я не согласен на 100% JasonDavis
@jasondavis - что если кто-то написал дезинфицирующее средство для кого-то другого? :) Ben
Я только сказалон создать отверстия. Я не говорил, что все будут. XSS сложен - поэтому даже самые большие сайты постоянно становятся его жертвами. Если вам нужно спросить «это безопасно?», То вы никудавозле достаточно осведомлен, чтобы написать что-то настолько важное для безопасности вашего приложения. Санацию HTML сложно сделать правильно даже для самых опытных разработчиков. Frank Farmer
5

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

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


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

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

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

Что делать, если я использую подготовленные операторы для вставки данных (* постредактирование) ... Должен ли я использовать mysql_real_escape_string ?? halocursed
Нет. Подготовленные заявления обрабатывают побег для вас. ceejayoz
0

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

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

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

У вас есть ссылки на какие-либо хорошие библиотеки HTML-фильтров, которые вы упомянули? halocursed
Я не хотел ничего перечислять, потому что я действительно использовал только htmLawed, поэтому я не могу привести более одного примера. Но есть и другие. Google: «Библиотека HTML-фильтров PHP» jmucchiello

Похожие вопросы