PHP (int) для переменных в запросе MySQL. Secure? - PullRequest
2 голосов
/ 09 ноября 2011

Я использую следующий метод для запросов MySQL:

$sql = "SELECT * FROM mytable WHERE `myTableId`=" . (int)$myId;

Это полностью безопасный метод или есть способ внедрить некоторые sql в базу данных этим методом? Есть ли лучшая альтернатива?

Ответы [ 6 ]

4 голосов
/ 09 ноября 2011

Это может привести к непредвиденным последствиям, например,

$myId = 'blahblahblah';

может привести к

... WHERE myTableId=0

, возможно, в этом случае не так уж и много, но если (скажем)выполнение системного разрешения и «супер-супер-сверхвысокого уровня пользователь-с-большей-властью-бог» имеет уровень разрешения 0, тогда это хороший способ обойти безопасность.

3 голосов
/ 09 ноября 2011

Если вы действительно хотите избежать внедрения SQL, лучше всего использовать PDO и подготовленные операторы.проверить http://www.php.net/pdo и http://www.php.net/manual/en/pdo.prepare.php

2 голосов
/ 09 ноября 2011

Это должно быть идеально сохранено, без каких-либо недостатков, если ввод может быть приведен к int.

0 голосов
/ 05 марта 2013

сделать так:

$sql="select `username` from `users` where id='$newid';";
mysql_query($sql);

здесь $ newid - это значение типа int.Символ, используемый до и после имени пользователя, чтобы получить его, нажмите клавишу чуть ниже esc.

0 голосов
/ 10 ноября 2011

Нет необходимости в Int, если вы просто беспокоитесь об инъекции mysql.Чтобы предотвратить инъекцию mysql, вы можете использовать mysql_real_escape_string .

То, что у вас есть сейчас, заблокирует все инъекции mysql, если ваше условие mysql только для int, но если ситуация такая:

$username = $_GET["username"];
SELECT * FROM customers WHERE username = '$username'

если значение $ username равно * \ 'ИЛИ 1 * у вас проблемы, или я должен сказать, что вы мёртвый

если значение $ username равно * \«;УДАЛИТЬ ОТ клиентов, ГДЕ 1 или имя пользователя = * ваш очень мертвый + обреченный

Чтобы этого не случилось, используйте mysql_real_escape_string

$username = mysql_real_escape_string($_GET["username"]);
0 голосов
/ 09 ноября 2011

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

$sql = sprintf("SELECT * FROM mytable WHERE `myTableId`='%d'", $myId);

Вероятно, следует добавить, что вы, возможно, захотите разобраться со случаем, когда преобразование в целое число не удается.Так что нет таблицы ноль.

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