Выходящие пользователи отправляли данные? - PullRequest
2 голосов
/ 13 декабря 2010

Это одна из вещей, которую я действительно не понимаю.Я знаю, что очень важно избежать любых данных, отправленных пользователем.Есть много способов, как это сделать: stripslashes() (удаляет обратную косую черту), strip_tags (удаляет теги HTML и PHP), htmlSpecialChars (например, изменить & на &), регулярное выражение (preg_match())запретить процессу «плохие» данные.

Когда использовать, как использовать, зачем использовать?

Ответы [ 4 ]

2 голосов
/ 13 декабря 2010

Если вы возьмете содержимое, скажем, $_POST['album_name'], и поместите его прямо на вашу страницу, тогда кто-то может отправить HTML и JavaScript, которые затем станут частью страницы, и теперь ваш сайт взломан.

Или вы можете взять содержимое $_POST['album_name'] и поместить его в запрос SQL. Но пользователь написал свой собственный SQL-запрос, который вы уже запустили, и теперь ваша база данных взломана.

http://xkcd.com/327/

1 голос
/ 13 декабря 2010

Кстати: лучший метод фильтрации пользовательских вводимых данных в PHP - это filter_input.

Примеры:

$userId = filter_input(INPUT_GET, 'user_id', FILTER_SANITIZE_NUMBER_INT);
$username = filter_input(INPUT_GET, 'username', FILTER_SANITIZE_SPECIAL_CHARS);
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);

Дополнительные константы фильтров здесь .

1 голос
/ 13 декабря 2010

Этот вопрос очень широкий. Это действительно зависит от того, для чего вы избегаете данных.

В каждом примере, использование stripslashes и strip_tags хорошо для экранирования данных, отображаемых в веб-браузере. Но это плохо для запросов к базе данных.

С другой стороны, механизмы экранирования базы данных хороши при отправке пользовательских данных в механизм базы данных, но они не годятся при попытке предотвратить атаки XSS.

Каждая экранирующая функция имеет определенный контекст, в котором она должна использоваться.

0 голосов
/ 13 декабря 2010

Если ваши данные поступают в базу данных, вы должны запретить пользователям отправлять данные, которые выйдут из вашего обычного запроса, чтобы нарушить или изменить этот запрос.Использование MySQLi с привязкой параметров - лучший способ защитить вашу базу данных.До тех пор, пока вы также используете строку или preg replace.Так что целочисленный идентификатор должен быть просто int.Вы хотите удалить из своих данных столько символов, сколько можете логически.

Если ваши данные будут помещены между тегами, то рекомендуется использовать strip_tags и htmlentities.Однако, если вы можете использовать белый список, сделайте.Если вы знаете, что вывод должен быть только int, убедитесь, что это так.echo htmlentities(strip_tags($value));

Если вы помещаете эти данные в тег <a href='<?php echo $value; ?>'>, вышеприведенного недостаточно.Вы также должны заменить одинарные кавычки.Здесь еще более важно, чтобы вы не допустили попадания отравленных данных. Если бы $ value было что-то вроде ' onClick='alert("oops");', вы могли бы быть в серьезном затруднении.Здесь вы должны обязательно использовать белый список и разрешать отображение введенного пользователем контента, только если это абсолютно необходимо.

Если вы хотите вывести в JavaScript.Не.Вы не должны делать это, даже если вы работали с безопасностью в течение многих лет.Тем не мение.Единственное исключение может быть сделано для ОЧЕНЬ определенных значений.Целые.Строки, которые привязаны к A-Za-z0-9 и пробелу с прегом, заменяют.Тем не мение.Это ОЧЕНЬ опасно и может серьезно скомпрометировать вашу систему.

Если вы хотите поместить переменные в eval или exec.ПРОСТО НЕ.Вы не достаточно умны, чтобы предотвратить атаку.Я тоже. Никого нет.Это просто вопрос времени, когда кто-то найдет способ.А если код, как он был написан, был в порядке?Через некоторое время код изменится и больше не будет в порядке.Просто не делай этого.Период.Или однажды вы будете сидеть в тюрьме, задаваясь вопросом: «Но я не взломал Пентагон ...»

...