Разница между {$ _GET ['id']} и '". $ _ GET [' id ']."'? - PullRequest
0 голосов
/ 14 января 2009

Есть ли разница между написанием

{$_GET['id']}

и

' "$ _ GET [ 'идентификатор']."'

в выражении sql? оба работают одинаково

Ответы [ 4 ]

4 голосов
/ 14 января 2009

Всегда плохая идея помещать данные из запроса get непосредственно в SQL, и существует множество простых способов предотвратить внедрение SQL.

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

$sql = "INSERT INTO table VALUES(".sprintf("%d",$_GET['id']) .")";

хотя я думаю, что это уродливо и плохо. Примерно так приятнее:

$sql = "INSERT INTO table VALUES(".(int)$_GET['id']) .")";

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

Другие альтернативы (и если ваши данные не должны быть числами) включают использование экранирующих функций, таких как add_slashes() или вышеупомянутых mysql_real_escape_string().

ИМХО, лучший способ использовать доступ к базе данных из PHP и очень легко защитить от внедрения SQL - это использовать новую библиотеку PHP PDO (http://php.net/PDO). Это позволяет вам писать строки SQL, которые не содержат никаких данных, и которые впоследствии будут добавлены на самом сервере базы данных. В этой форме нет абсолютно никакого способа сделать SQL-инъекцию.

Вот пример кода:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare("INSERT INTO table VALUES (?)");
$stmt->bindParam(1, $_GET['id']);
$stml->execute();

Как вы можете видеть, данные не добавляются в сам SQL-запрос, поэтому их не нужно экранировать.

2 голосов
/ 14 января 2009

Использование любого из них непосредственно в операторе SQL - ОЧЕНЬ ПЛОХАЯ ИДЕЯ. Это позволяет для SQL-инъекций. Обязательно дезинфицируйте свои данные, используя что-то вроде mysql_real_escape_string.

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

2 голосов
/ 14 января 2009

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

Вот вопросы и ответы, которые вы должны прочитать, прежде чем идти дальше:

Как я могу предотвратить внедрение SQL в PHP?

0 голосов
/ 14 января 2009

Если вы используете переменную - особенно ассоциативный массив - в строке, вы можете быть совершенно уверены, что это приведет к ошибкам. Это просто плохой стиль. Мне лично тоже не нравится второй вариант.

sprintf( '... %d ...', $_GET[ 'id' ] );

Это мой любимый способ помещения переменной в строку.

...