Фильтрация MySQL-запроса в PHP - PullRequest
2 голосов
/ 27 июля 2010

Привет, я делаю несколько запросов к базе данных MySQL, которые требуют некоторого пользовательского ввода ... И мне было интересно, как предотвратить атаки с помощью инъекций, как, например, если кто-то наберет

"; a-MySQL query here;"

Это будет выполнено, это позволит людям получить доступ к моей системе. Мне интересно, как я мог бы защитить от таких вещей, возможно, создать функцию, которая отфильтровывает запрос в поисках плохих утверждений? или, возможно, не позволяя; персонаж?

Подводя итог:

  • Какова общая практика в настоящее время для предотвращения инъекционных атак?
  • Как мне это сделать?
  • Насколько эффективным будет это решение против людей, которые знают, что они делают, из-за изменения моей базы данных.

Ответы [ 3 ]

3 голосов
/ 27 июля 2010

Единственный способ - правильно скрыть предоставленные пользователем данные. Другие указали несколько способов сделать это.

Есть еще один способ: подготовленные операторы и заполнители. Подготовленные операторы поддерживаются каждым современным интерфейсом базы данных PHP, включая mysqli и PDO .

Давайте использовать PDO в качестве демонстрации. Допустим, мы хотели обновить немного данных в таблице foo, предоставленной пользователем.

$sql = 'UPDATE foo SET bar = ? WHERE user_id = ?';
$sh = $db->prepare($sql);
$sh->execute(array( $_POST['bar'], $_SESSION['user_id'] ));

Переменные в массиве, переданные в execute, заменяют заполнители вопросительного знака в запросе. Когда это происходит, они автоматически экранируются и цитируются . Вам не нужно вручную избегать их, чтобы сделать их безопасными для помещения в базу данных!

С другой стороны, вам все равно нужно будет отфильтровать их для непредвиденного контента, такого как HTML, Javascript, буквы, где вы ожидаете цифры и т. Д. Обеспечение безопасности данных для вставки в базу данных - это только половина дела .

2 голосов
/ 27 июля 2010

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

Смотрите больше: http://www.electrictoolbox.com/php-pdo-bound-placeholders/

1 голос
/ 27 июля 2010

Лучшее решение - запустить каждую часть ввода данных от пользователя (пользователя) через эту функцию PHP.net: MySQL Real Escape String Это устранит большинство - если не все - проблемы с инъекциями, наблюдаемые сегодня,Вам просто нужно сделать что-то вроде следующего:

$var = mysql_real_escape_string($_GET['var']);
$query = "INSERT INTO foo (var) VALUES (\"$var\");

Хорошей практикой всегда является принудительное приведение типов к переменным, которые, как вы знаете, должны быть типом.Например, числовой идентификатор:

$id = (INT)$_GET['id'];

или

$id = ( is_numeric($_GET['id']) ? (INT)$_GET['id'] : -1; // replace -1 with FALSE, or NULL, etc

, который заставит эту переменную быть целым числом, чтобы вы выиграли 'в итоге $id будет "foo" или другим нечисловым значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...