Я написал эту короткую функцию для защиты от инъекции my_sql, из-за ее важности я просто хочу дважды проверить с другими, что это будет работать, как я предполагаю.
foreach($_REQUEST as $key => $value) { $_REQUEST[$key] = stripslashes($value); $_REQUEST[$key] = mysql_real_escape_string($_REQUEST[$key]); }
Ну, вы используете stripslashes()
потому что magic_quotes_gpc
установлен? Таким образом, этот код будет работать только при установке magic_quotes_gpc
! Я бы рекомендовал вам отключить его и не использовать вызов strislashes ().
Но обратите внимание, что нет ничего похожего на «универсальную санитацию». Назовем это просто цитированием , потому что это то, о чем все.
При цитировании вы всегда цитируете текст для определенного вывода , например:
like
выражение для запроса mysql Для каждого случая вам нужно другое цитирование, потому что каждое использование присутствует в другом контексте синтаксиса. Это также подразумевает, что цитирование не должно производиться на входе в PHP, а на конкретном выходе ! Именно по этой причине функции, такие как magic_quotes_gpc
, сломаны (всегда убедитесь, что они выключены !!!).
Итак, какие методы можно использовать для цитирования в этих конкретных случаях? (Не стесняйтесь исправлять меня, могут быть более современные методы, но они работают для меня)
mysql_real_escape_string($str)
mysql_real_escape_string(addcslashes($str, "%_"))
htmlspecialchars($str)
json_encode()
– только для utf8! Я использую свою функцию для iso-8859-2 mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}'))
– вы не можете использовать preg_quote в этом случае, потому что обратная косая черта будет сбрасываться два раза! 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]); } }