PHP MySQL защита от инъекций - PullRequest
6 голосов
/ 12 августа 2011

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

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

Ответы [ 6 ]

11 голосов
/ 12 августа 2011

Ну, вы используете 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()
5 голосов
/ 12 августа 2011

Если вы используете 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));

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

3 голосов
/ 12 августа 2011

Похоже, немного кувалдой подход.Вам не нужно stripslashes, если только вы не используете magic_quotes.Кастинг может быть более элегантным, если вы знаете, что хотите 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 (Спасибо, Каролис)

1 голос
/ 04 июля 2012

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

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]);
    } 
}
1 голос
/ 12 августа 2011

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

1 голос
/ 12 августа 2011

вам нужно явно добавить идентификатор соединения с базой данных в

mysql_real_escape_string(..., $db_connection_identifier);

mysql_real_escape_string

строка mysql_real_escape_string (строка $ unescaped_string [, ресурс $ link_identifier])

...