2013-07-29 91 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

@大衛 - 不,不要。 '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中,如果在雙引號你寫的任何變量它是由作爲完全由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