12

Как санировать пользовательский ввод с помощью PHP?

7

Есть ли универсальная функция, которая хорошо подходит для санитации пользовательского ввода с целью защиты от SQL-инъекций и атак XSS, при этом позволяя использовать определенные HTML-теги?

3 ответ(ов)

2

Не пытайтесь предотвратить SQL-инъекцию, очищая входные данные.

Вместо этого не позволяйте данным использоваться для создания вашего SQL-кода. Используйте подготовленные выражения (Prepared Statements), то есть применяйте параметры в шаблонном запросе с привязанными переменными. Это единственный надежный способ защититься от SQL-инъекции.

Дополнительную информацию о предотвращении SQL-инъекций можно найти на моем сайте http://bobby-tables.com/.

0

Нет, вы не можете универсально фильтровать данные без какого-либо контекста, для чего они предназначены. Иногда вам нужно использовать SQL-запрос в качестве входных данных, а иногда — HTML.

Вы должны фильтровать входные данные по белому списку — убедитесь, что данные соответствуют некоторой спецификации того, что вы ожидаете. Затем необходимо экранировать данные перед их использованием, в зависимости от контекста, в котором вы их используете.

Процесс экранирования данных для SQL, чтобы предотвратить SQL-инъекции, сильно отличается от процесса экранирования данных для (X)HTML, чтобы предотвратить XSS.

0

Один прием, который может помочь в конкретной ситуации, когда у вас есть страница вроде /mypage?id=53 и вы используете id в условии WHERE, это убедиться, что id определенно является целым числом, например, так:

if (isset($_GET['id'])) {
  $id = $_GET['id'];
  settype($id, 'integer');
  $result = mysql_query("SELECT * FROM mytable WHERE id = '$id'");
  # теперь используйте результат
}

Но, конечно, это только устраняет одну конкретную атаку, поэтому обязательно ознакомьтесь со всеми остальными ответами. (И да, я понимаю, что приведенный код не идеален, но он демонстрирует конкретную защиту.)

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь