2013-07-29 7 views
-1

Ниже кодов взяты из одного учебника:PHP: как же одиночные кавычки и двойные кавычки работают вместе

<?php 
// user input that uses SQL Injection 
$name_bad = "' OR 1'"; 

// our MySQL query builder, however, not a very safe one 
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'"; 

// display what the new query will look like, with injection 
echo "Injection: " . $query_bad; 

В передней части, она показывает:

Injection: SELECT * FROM customers WHERE username = '' OR 1'' 

Вопрос:

почему он показывает username = '' OR 1''?

+0

@David - Нет, не нужно. Библиотека 'mysql_ * 'устарела и не должна использоваться вообще и [есть более эффективные способы защиты от SQL-инъекции] (http://stackoverflow.com/questions/60174/best-way-to-prevent-sql -injection-in-php), чем экранирование. – Quentin

ответ

1

См объяснение в этом изображении:

enter image description here

1

Строки PHP, цитируемые с " символов, интерполируют переменные и обрабатывают ' символов как литералы.

$name_bar - это строка, которая содержит ' символов.

Когда он интерполирован, все символы в нем помещаются там, где была переменная.

1

В PHP, если в двойных кавычках вы пишете какой-либо переменной ее заменить значение переменной, как отлично сделано РНР в вашем случае

// user input that uses SQL Injection 
$name_bad = "' OR 1'"; 

// our MySQL query builder, however, not a very safe one 
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'"; 

если заменить значение $ name_bad с «OR 1», то он стал бы

SELECT * FROM customers WHERE username = '' OR 1''; 

и если вы хотите, чтобы удалить лишние "до и после вашего запроса, то вы должны написать запрос, как:

// our MySQL query builder, however, not a very safe one 
$query_bad = "SELECT * FROM customers WHERE username = $name_bad"; 
1

Потому что вы в основном просто контактируете с струнами.

$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'"; 

такое же, как

$query_bad = "SELECT * FROM customers WHERE username = '' OR 1''"; 

$name_bad, так как это ' OR 1'.

1

Он делает это потому, что $name_bad содержит одинарные кавычки, и вы вставили его между другим набором кавычек в другой строке.

Для лучшей практики использования:

$string = sprintf('SELECT * FROM customers WHERE username = \'%s\'', ' OR 1');

Переходим к SQL однако, необходимо будет дезинфицировать.

Если вы используете PDO, метод bindParam автоматически предотвратит SQL-инъекцию (она заявляет).

http://www.php.net/manual/en/pdo.prepared-statements.php

Смежные вопросы