Нужно ли как-то обрабатывать данные в форме обратной связи?

В скриптах, где юзеры отсылают письма ко мне на ящик или на другие email фильтрую так:
Код:
        /* [!] Stop XSS */
        foreach ($_POST as $i => $val)
            $_POST[$i] = urldecode(htmlspecialchars($val));
Как я понимаю массив $_POST в php, urldecode() здесь не нужен из-за того, что переменные в $_POST передаются уже не в сериализованом виде. То есть, грубо говоря, urldecode() выполняется автоматически в недрах самого php до того, как формируется $_POST.
И кстати, какую функцию все же использовать htmlspecialchars или htmlentities ? На сайте кодировка utf-8
htmlspecialchars() преобразует в сущности все спецсимволы (кавычки, слеши и проч.). В вашем случае этой функции хватит.
htmlentities() преобразует в сущности все спецсимволы и все символы "не-ascii" (например, русские символы). Это бывает полезно, например, когда работаешь на одной странице с разными кодировками.
 
В итоге поставил на сайт такую фильтрацию:
В самом начале файла common.php (он подключается абсолютно ко всем страницам сайта) ф-ю stream_wrapper_unregister
Код:
stream_wrapper_unregister();

В скриптах, где юзеры отсылают письма ко мне на ящик или на другие email фильтрую так:
Код:
        /* [!] Stop XSS */
        foreach ($_POST as $i => $val)
            $_POST[$i] = urldecode(htmlspecialchars($val));

И кстати, какую функцию все же использовать htmlspecialchars или htmlentities ? На сайте кодировка utf-8
Пример на php.net показывает, что htmlentities чистит вообще все сущности (в том числе ',`), в то время как htmlspecialchars - только знаки &,",<,>
PHP:
<?php
$str = "A 'quote' is <b>bold</b>";
 
// Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);
 
// Outputs: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str, ENT_QUOTES);
?>
 
Как я понимаю массив $_POST в php, urldecode() здесь не нужен из-за того, что переменные в $_POST передаются уже не в сериализованом виде. То есть, грубо говоря, urldecode() выполняется автоматически в недрах самого php до того, как формируется $_POST.
Для просмотра ссылки Войди или Зарегистрируйсяс вами не согласен:
The superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results.
 
Для просмотра ссылки Войди или Зарегистрируйсяс вами не согласен:
Вы что-то перепутали. Я сказал на русском языке тоже самое, и вы вставили цитату на английском. Смысл:
urldecode() Декодирует любые %## кодированные последовательности в данной строке.
В массиве $_POST такие последовательности уже преобразованы в вид исходной строки.
 
Вы что-то перепутали. Я сказал на русском языке тоже самое, и вы вставили цитату на английском. Смысл:
urldecode() Декодирует любые %## кодированные последовательности в данной строке.
В массиве $_POST такие последовательности уже преобразованы в вид исходной строки.
Cоздай файлик check.php с содержимым
PHP:
<?php
 
if (isset($_POST['data']))
    echo $_POST['data'];
else {
    echo '<html><body><form action="check.php" method="POST"><input type="text" name="data"><input type="submit"></form></body></html>';
}
?>
и скорми ему текст Hello%2C+world%3Cbr%3E (Hello, world<br>), и сам увидишь, декодируется ли $_POST или нет.
 
Cоздай файлик check.php с содержимым
PHP:
<?php
 
if (isset($_POST['data']))
    echo $_POST['data'];
else {
    echo '<html><body><form action="check.php" method="POST"><input type="text" name="data"><input type="submit"></form></body></html>';
}
?>
и скорми ему текст Hello%2C+world%3Cbr%3E (Hello, world<br>), и сам увидишь, декодируется ли $_POST или нет.
создал копируя полностью.
Не знаю как вставить скриншот в форум.
Вот тут Для просмотра ссылки Войди или Зарегистрируйся
 
и скорми ему текст Hello%2C+world%3Cbr%3E
То, о чем ты говоришь - application/x-www-form-urlencoded, только ты не учитываешь, что в x-www-form-urlencoded-поле можно вставить уже urlencoded-строку, которая после распаковки формы успешно пройдет валидацию на спецсимволы и целиком войдет в отправляемый на мыло мессадж. Кроме того, в опере можно отредактировать форму до вида <form enctype="multipart/form-data">, и тогда вообще никакие фильтры налагаться не будут.
 
То, о чем ты говоришь - application/x-www-form-urlencoded, только ты не учитываешь, что в x-www-form-urlencoded-поле можно вставить уже urlencoded-строку, которая после распаковки формы успешно пройдет валидацию на спецсимволы и целиком войдет в отправляемый на мыло мессадж. Кроме того, в опере можно отредактировать форму до вида <form enctype="multipart/form-data">, и тогда вообще никакие фильтры налагаться не будут.
Видимо, я что-то не понимаю. В вашем примере, все что вы пишете в форме, все в таком же виде отображается.
Если ввести Hello, world<br>, то отобразится Hello, world<br>
Если ввести Hello%2C+world%3Cbr%3E, отобразится Hello%2C+world%3Cbr%3E
Вот и никак не могу понять смысл этого преобразования. Валидация - совсем уже другой разговор. Числовые значения проверяйте
is_numeric(). Строковые значения проверяете preg_match().
 
Это все майор паранойя, не парьтесь, используйте preg_match() )
 
Назад
Сверху