PHP-защита от mysql-инъекций

Я написал эту короткую функцию для защиты от инъекции my_sql, из-за ее важности я просто хочу дважды проверить с другими, что это будет работать, как я предполагаю.

foreach($_REQUEST as $key => $value) { $_REQUEST[$key] = stripslashes($value); $_REQUEST[$key] = mysql_real_escape_string($_REQUEST[$key]); } 

Solutions Collecting From Web of "PHP-защита от mysql-инъекций"

Ну, вы используете stripslashes() потому что magic_quotes_gpc установлен? Таким образом, этот код будет работать только при установке magic_quotes_gpc ! Я бы рекомендовал вам отключить его и не использовать вызов strislashes ().

Но обратите внимание, что нет ничего похожего на «универсальную санитацию». Назовем это просто цитированием , потому что это то, о чем все.

При цитировании вы всегда цитируете текст для определенного вывода , например:

  1. Строковое значение для запроса mysql
  2. like выражение для запроса mysql
  3. html-код
  4. JSON
  5. регулярное выражение mysql
  6. регулярное выражение php

Для каждого случая вам нужно другое цитирование, потому что каждое использование присутствует в другом контексте синтаксиса. Это также подразумевает, что цитирование не должно производиться на входе в PHP, а на конкретном выходе ! Именно по этой причине функции, такие как magic_quotes_gpc , сломаны (всегда убедитесь, что они выключены !!!).

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

  1. mysql_real_escape_string($str)
  2. mysql_real_escape_string(addcslashes($str, "%_"))
  3. htmlspecialchars($str)
  4. json_encode() – только для utf8! Я использую свою функцию для iso-8859-2
  5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) – вы не можете использовать preg_quote в этом случае, потому что обратная косая черта будет сбрасываться два раза!
  6. preg_quote()

Если вы используете PDO (правильно), вам не нужно беспокоиться о введении MySQL.

Образец:

 /* Execute a prepared statement by passing an array of insert values */ $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->execute(array(':calories' => $calories, ':colour' => $colour)); 

Больше информации

Кажется, это немного кувалдой. Вам не нужны stripslashes если вы не используете magic_quotes. Type-Casting может быть более элегантным, если вы знаете, что хотите int , float или bool .

Дополнительная информация:

Тип-литье: http://php.net/manual/en/language.types.type-juggling.php

тестирование магических цитат: http://www.php.net/manual/en/function.get-magic-quotes-gpc.php (спасибо Karolis)

вам необходимо явно добавить идентификатор подключения к базе данных в

 mysql_real_escape_string(..., $db_connection_identifier); 

mysql_real_escape_string

string mysql_real_escape_string (строка $ unescaped_string [, resource $ link_identifier])

Если вы включите произвольный $key s в свой запрос, вы также должны избежать этого.

Предложение Томаса хорошее, но вы всегда должны держать их в уме, так что это может быть здорово:

 if (get_magic_quotes_gpc()) { // Check if magic quotes are enabled foreach($_REQUEST as $key => $value) { $_REQUEST[$key] = stripslashes($value); $_REQUEST[$key] = stripslashes($_REQUEST[$key]) } } else { foreach($_REQUEST as $key => $value) { $_REQUEST[$key] = mysql_real_escape_string($value); $_REQUEST[$key] = mysql_real_escape_string($_REQUEST[$key]); } }