2011-03-31 21 views
1

可能重複:
What is SQL injection?
XKCD SQL injection - please explainSQL注入概念如何工作? (簡介)

我自己的公司,我希望知道PHP的runabouts而我聘請的人來維護和擴展代碼對於它的網站,我正在關注SQL注入的安全性,並不十分理解這些代碼如何影響SQL數據庫,因爲它們包含在查詢中。

如何顯示安全漏洞,以便我可以看到發生了什麼?

$username = "' OR 1"; 

查詢變爲:

+2

閱讀本https://secure.wikimedia.org/wikipedia/en/wiki/SQL_injection回來與任何特定問題 – 2011-03-31 10:30:31

+1

可能重複(HTTP [什麼是SQL注入?]://計算器。 com/questions/601300/what-is-sql-injection),請在詢問之前使用[search](http://stackoverflow.com/search?q=sql+injection)。 – fabrik 2011-03-31 10:31:54

回答

1

儘管這在很大程度上可以解釋在網上,我有一種感覺,在稍微詳細地解釋這一點。

如果你能想象這個字符串將會變成什麼,你就會明白你正在編寫的腳本的潛在風險,因爲它在實際運行之前會變成別的東西。

一個微不足道的惡意例如:

$fromtheuser = "foo'; DROP TABLE affiliates; --"; 
$q = "SELECT id FROM affiliates WHERE website = '$fromtheuser'"; 

你能解釋一下這是什麼會變成什麼?開發者不能。

"SELECT id FROM affiliates WHERE website = 'foo'; DROP TABLE affiliates; --'" 

這個矢量是';結束SQL字符串原始的關鍵部分,並且--'註釋掉推報價。

你會在代碼中尋找什麼,在將數據放入查詢之前,對數據進行適當的清理和過濾。幫助確保這個前沿的一個重要工具是某種形式的準備好的查詢,在這種情況下,您可以將參數綁定到查詢,以便沒有任何操作。

我們可以通過MySQLi(已改進)或我個人最喜歡的PDO中的準備語句來實現此目的。他們看起來像什麼快速簡要說明。

mysql_real_escape_string(可處理編碼和報價)

<?php 
$clean = mysql_real_escape_string($q) 

的MySQLi:

<?php 
$clean = $mysqli->prepare("SELECT id FROM affiliates WHERE website = ?"); 
$clean->bind_param('s', $website); //'s' for 'string' 

PDO:

<?php 
$clean = $pdo->prepare("SELECT id FROM affiliates WHERE website = ?"); 
$clean->bindParam(1, $website); //you can use :site rather than ? and 1 
+0

IMO將參數數組傳遞給PDO的'execute()'方法而不是將參數與單獨的函數調用綁定在一起會更清潔。 – ThiefMaster 2011-03-31 10:35:17

+0

(通過,克里斯的例子_is_ better) – 2011-03-31 11:54:35

0
mysql_query("SELECT * FROM users WHERE username = '$username'"); 

看,當我們的$username變量設置爲討厭的東西會發生什麼

SELECT * FROM users WHERE username = '' OR 1 

攻擊者可以使用不當逃脫變量注入SQL到您的查詢,有效地繞過您已有的任何(差)安全措施。

更多信息here

0

另外值得一提的是,也有通過它可以測試工具無論您的網站是否容易受到注入攻擊。

看看

http://sqlmap.sourceforge.net/

+0

我會看看這個,可能是一個很好的學習經驗。 – Bobrin23 2011-03-31 10:42:02

0

從事實到來的危險,即SQL查詢中程序
因此,惡意代碼可以代替某些運營商注入。

  1. 字符串被引號分隔。如果字符串內的分隔符未被轉義,它將實際關閉字符串語句,其餘的將成爲惡意代碼。

  2. 不僅字符串是動態的。如果$ amount將包含惡意代碼,那麼沒有分隔符將會保護LIMIT $amount,以及ORDER BY $order

+0

謝謝,這是有趣的東西! – Bobrin23 2011-03-31 10:40:03