2016-01-28 108 views
0

我在數據庫中始終使用ORM層,所以我不介意SQL注入,但朋友給了我這個任務,我仍然不知道如何解決它。SQL注入理論

我知道PHP腳本只是檢查返回的查詢是否爲!= null(用戶名匹配到輸入的用戶名&密碼找到)。

查詢本身在PHP中的樣子:

$sql = "SELECT name FROM users WHERE name='".$name. "' AND password='".$password. "'"; 

什麼是archieve這個查詢= null或獲取有效的登錄數據(用戶名密碼&)的收益的最佳途徑!密碼存儲在數據庫中。我知道存儲平原是不好的,我知道使用PDO是好的,但我不知道如何解決他給我的這個有趣的任務,也許是因爲我一直在使用PDO。

+2

在數據庫中存儲普通密碼是一個** big ** no-no。他們真的應該被哈希。另外,請考慮有人輸入''的情況。 DROP TABLE users'到這個語句中。哎呀,你的桌子是*走了*。這意味着您需要轉義userinputs(*從不信任用戶輸入*)或使用預準備語句。我推薦後者。 – Qirel

+0

[我怎樣才能防止SQL注入在PHP?](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) – Qirel

+0

這不是如何防止SQL注入,正如我告訴我使用db抽象層,這是更理論。 –

回答

3

假設我們有兩個輸入變量:

$name = "iam"; 
$password = "aninjection"; 

導致此查詢:

$sql = "SELECT name FROM users WHERE name='iam' AND password='aninjection'"; 

而且我們現在說我們加入這個到$password變量:

$password = "aninjection' OR 1='1"; 

其中產生於:

$sql = "SELECT name FROM users WHERE name='iam' AND password='aninjection' OR 1='1'"; 

此查詢現在將生成true並顯示用戶表中的每個名稱。 這當然是一個基本的例子。通過刪除整個表格,我們也可能會造成更多傷害。

+0

有沒有辦法檢索用戶的密碼?獲取用戶名列表並不難。 –

1

如果你想找回密碼,您將注入

$name = "whatever"; 
$password = "' OR '1'='1' UNION ALL SELECT password from users;--"; 

這則使查詢

SELECT name FROM users WHERE name='whatever' AND password='' OR '1'='1' UNION ALL SELECT password from users;--' 

this answer攻擊者將如何開始從注入的查詢工作了這一點。