Это безопасный способ защиты от SQL инъекций? - PullRequest
4 голосов
/ 13 января 2011

Этот код на 100% безопасен от инъекций sql:

$id = $_GET['id']
mysql_query('SELECT * FROM mytable WHERE id < ' . (int)$id);

или я должен это сделать?

$id = $_GET['id']
mysql_query('SELECT * FROM mytable WHERE id < ' . mysql_real_escape_string($id));

Ответы [ 7 ]

2 голосов
/ 13 января 2011

Запрос все еще может взорваться, если $_GET['id'] пусто или (int)$_GET['id'] оценивается как пустое.В результате вы получите синтаксическую ошибку в запросе.Недостаточно слепо экранировать или приводить значение к типу и вставлять его в запрос.Вы должны проверить, что окончательное «безопасное» значение действительно безопасно, а не просто волк в бабушкиной одежде.

2 голосов
/ 13 января 2011

Это

mysql_query('SELECT * FROM mytable WHERE id < ' . mysql_real_escape_string($id));

будет плохой практикой. Если вы хотите, чтобы это была строка, хотя бы заключите ее в кавычки:

mysql_query('SELECT * FROM `mytable` WHERE `id`<"'.mysql_real_escape_string($id)).'"';

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

Я бы предпочел приведение, если оно целое. Одним из аргументов в пользу строковой версии будет то, что когда-нибудь идентификатор может быть буквенно-цифровым (как видно на все большем количестве веб-сайтов).

2 голосов
/ 13 января 2011

Эта статья, кажется, хороша для объяснения того, как mysql_real_escape_string может защитить вас от SQL-инъекций, но также объясняет ее "дыры"

http://www.webappsec.org/projects/articles/091007.shtml

0 голосов
/ 30 мая 2011
нет

Нет
Вы должны сделать это:

$id = mysql_real_escape_string($_GET['id']);
//put the escaped string in a $var, so your select statement stays readable
//this will help in debugging, and make **not** forgetting those vital quotes
//easier.
$query = "SELECT * FROM mytable WHERE id < '$id'";
//                                         ^   ^always single quote your $vars
//       ^                                      ^ and double quote the query 
$result = mysql_query($query);
//and test to see if your query ran successful.
if (!$result) { //your query gave an error, handle it gracefully.

Тогда ты в безопасности.

0 голосов
/ 13 января 2011

Вы должны использовать параметризованные запросы. Тогда вам не нужно беспокоиться обо всем этом. Это также делает SQL намного проще для чтения. Да, и не используйте select *, просто выберите то, что вы хотите.

0 голосов
/ 13 января 2011

Это безопасно, но вы, вероятно, хотите сделать

if(is_int($id)){
mysql_query('SELECT * FROM mytable WHERE id < ' . mysql_real_escape_string($id)); // just to be safe always to escape
}
0 голосов
/ 13 января 2011

Я использую sprintf, mysql_query(sprintf('SELECT * FROM mytable WHERE id < %d', $id));

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