фильтрация входных данных - PullRequest
       52

фильтрация входных данных

1 голос
/ 25 сентября 2010

У меня есть простая контактная форма с именем, адресом электронной почты, списком выбора и текстовой областью. В своем почтовом php-скрипте я пытаюсь добавить простой фильтр, чтобы предотвратить внедрение SQL или другие формы взлома.

Например, я использую

$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_SPECIAL_CHARS);

Это хорошо?

Ответы [ 4 ]

1 голос
/ 25 сентября 2010

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

Во-первых, если кто-то отправляет данные на ваш сайт, например $_POST['name'], и вы хотите использовать это значение обратно на html-стороне, например <p>The following string: {$_POST['name']} is invalid</p>, тогда вы ВСЕГДА должны убедиться, что это значение имеетчерез htmlspecialchars , это защитит большинство попыток XSS

Далее идет внедрение, если значение $_POST['name'] входит в вашу базу данных, просто убедитесь, что выиспользуйте mysql_real_escape_string для этого значения.

, что обеспечит вам 100% защиту от SQL-инъекций, но все это означает, что ваша БД не может выполнять команды от пользователя, что не означает, что текстчто это должно быть.

Функции, которые вы всегда должны использовать перед вставкой данных в базу данных:

Это называется Проверка и необходима только для того, чтобы вы могли убедиться, что данные, отправляемые пользователем, соответствуют вашим запросам, например filter_var будет использоваться для проверки того, что введенная ими электронная почта является электронной почтой, а не просто бла-бла

Что я обычно делаю в палатке, так это запускаю чистую функцию, чтобы убедиться, что все вмененные данныечист с htmlspecialchars

пример:

function clean($array)
{
    foreach($array as $key => $val)
    {
        if(is_array($val))
        {
            $array[$key] = clean($val); //Recursive 
        }else
        {
            $array[$key] = htmlspecialchars($val, ENT_QUOTES);
        }
    }
    return $array;
}

Затем сделайте следующее, чтобы убедиться, что ваш сейф от XSS:

$_GET = clean($_GET);
$_POST = clean($_POST);

Так что если кто-то попытался отправить <a href='test'>Test</a>, тогда значение будет преобразовано в &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt

0 голосов
/ 30 апреля 2013

FILTER_SANITIZE_SPECIAL_CHARS делает HTML-escape '"<> & и символы со значением ASCII меньше 32. Чтобы иметь полный эквивалент htmlspecialchars(), используйте FILTER_SANITIZE_FULL_SPECIAL_CHARS, что эквивалентно вызову htmlspecialchars () с установленным ENT_QUOTES. Использование этой функции должно сделать использование mysql_real_escape_string () устаревшим, но безопасность прежде всего:)

см. Также: http://php.net/manual/en/filter.filters.sanitize.php для получения дополнительной информации.

0 голосов
/ 25 сентября 2010

Лучшим вариантом является использование расширений mysqli и подготовленных операторов. Однако существует функция mysql_real_escape_string(), которая специально "экранирует специальные символы в строке для использования в операторе SQL".

0 голосов
/ 25 сентября 2010

Чтобы проверить эффективность, попробуйте атаковать свой собственный сайт с помощью SQL-инъекций. По сути, попробуйте передать такие строки, как ' || 1=1 и посмотреть, если вы получите ошибку. Если вы получили ошибку или неожиданный результат, ваш сайт открыт для атак. В противном случае, это, вероятно, работает; но чтобы быть уверенным, убедитесь, что вы делаете много испытаний.

...