Как sprintf () защищает от внедрения SQL? - PullRequest
5 голосов
/ 11 июля 2011

Я слышал, что sprintf() защищает от внедрения SQL. Это правда? Если да, то как?

Почему люди рекомендуют писать запрос следующим образом:

$sql = sprintf('SELECT * FROM TABLE WHERE COL1 = %s AND COL2 = %s',$col1,$col2);

Ответы [ 4 ]

9 голосов
/ 11 июля 2011

sprintf не защитит! он заменяет только %s

Вы должны mysql_real_escape_string так:

$sql = sprintf('SELECT * FROM TABLE WHERE COL1 = "%s" AND COL2 = "%s"',
mysql_real_escape_string($col1),
mysql_real_escape_string($col2));

безопаснее инъекция

примечание: я полагаю, вы посмотрите на PDO , это то, что я люблю использовать для DBconections и запросов

9 голосов
/ 11 июля 2011

Это не делает никакой защиты. Использование sprintf делает код более читабельным, чем ввод и вывод строки для выполнения mysql_real_escape_string над каждой из переменных ... но в этом примере переменные не пропускаются в конце, так что преимущество теряется.

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

3 голосов
/ 11 июля 2011

Использование sprintf может защитить от внедрения SQL для числовых полей:

$sql = sprintf("SELECT * FROM table WHERE col1 = %i", $col1);

Используя sprintf таким образом, вы можете быть уверены, что $ col1 будет преобразован в целое число - хотя это может привести к ошибке или предупреждению, если оно не является целым числом.

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

1 голос
/ 11 июля 2011

Очевидно, что нет, и если вы действительно читали это в книге или учебнике, вы должны автоматически отказаться от него для дальнейшего использования.

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

echo '<p>Hello, <strong></strong>' . htmlspecialchars($name) . ', welcome to ' . htmlspecialchars($place). '</p>';

echo sprintf('<p>Hello, <strong>%s</strong>, welcome to %s</p>',
    htmlspecialchars($name),
    htmlspecialchars($place)
);

То же самое относится и к другим видам вывода, таким как код SQL, но, конечно, вам все равно нужно что-то делать для ввода, чтобы сделать его безопасным: sprintf () - это обычная строковая функция, которая не знает SQL и баз данных.

Обратите внимание, что параметры связывания используют похожий синтаксис:

// Fictional DB abstraction layer
$sql = 'SELECT foo_id
    FROM foo
    WHERE name=:name AND status=:status';
$params = array(
    'name' => $name,
    'status' => $status,
);
$result = $db->run($sql, $params);

Вот почему мне особенно легче использовать те библиотеки БД, которые предоставляют этот синтаксис, как PDO.

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