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

StackOverflow https://stackoverflow.com/questions/1446431

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Не пишите свое собственное средство для дезинфекции 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 и используйте какую-нибудь библиотеку, например Htmlочиститель чтобы отфильтровать / очистить его ;это позволит точно указать, какие теги и атрибуты разрешены, и выдаст вам чистый и корректный HTML-код в качестве выходных данных.
  • попробуйте удалить HTML, как вы это делаете сейчас - не всегда работает хорошо (что, если вы забудете какой-то особый случай?)
  • escape HTML, с помощью htmlentities или htmlspecialchars :не обязательно выглядеть красиво, но выходные данные будут выглядеть так же, как входные данные пользователя.

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

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

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

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

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

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

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

filter_input и filter_var

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top