2012-05-26 28 views
3

我試圖證明在PHP中需要準備好的語句,但是我遇到了一些問題,因爲PHP通過表單傳入字符串時會做一些非常奇怪的事情。PHP表單的SQL注入威脅?

聲明我正在「破發」是一個簡單的:

SELECT username FROM users WHERE username = '$username' AND password = '$password'

但是做這樣的事情在X' or TRUE;--傳遞的密碼不實際工作,因爲PHP自動轉義單引號和原來的語句轉換成:

SELECT username FROM users WHERE username = '$username' AND password = 'X\' or TRUE;--'

,密碼平等仍然因爲逃過單引號完好。這種說法是否被認爲是安全的如果不是,它怎麼能被打破?

+1

就我個人而言,我會從表單中輸入MD5密碼以避免注入,然後將其與數據庫中的密碼進行比較。這只是我而已。 –

+0

@WilliamIsted:是的,我在使用真實應用程序時使用SHA-2;這只是一個假設的查詢。 – Jengerer

回答

5

這聽起來像你有魔術引號打開。我絕對不會認爲這個陳述是安全的,就像你將它移動到運行PHP 5.4的服務器一樣,它將完全脆弱。魔術引號很久以來一直是一個不推薦的功能,它可能會讓應用程序的其他部分混亂,所以不要依賴它。

爲了演示,只需在php.ini中設置magic_quotes_gpc = Off即可。

+0

如果你添加了一些關於mysql擴展失效並使用PDO的東西,這應該成爲被接受的答案。 – markus

+0

有趣!我試圖向一位對PHP相對陌生的朋友展示他們爲什麼需要它們,但是我沒有給他們一個密碼來嘗試繞過他們的登錄表單。然後我測試了SQL查詢在我自己的服務器上做了什麼,並看到它具有相同的行爲。很高興知道,謝謝! – Jengerer

2

這是因爲您在PHP環境中啓用了Magic Quotes。它會自動轉義字符串,但它們已被棄用,不應使用。他們不是治癒,他們是一個補丁。你更好地使用適當的衛生方法,如mysql_real_escape_string

http://www.php.net/manual/en/security.magicquotes.what.php

編輯:還準備語句!

其他「不安全」的安全PHP函數:

addslashes - 你可能會認爲它是安全的,但它不會過濾掉可能引起注射多字節字符。

+0

或者,PDO,如問題中所述;) – Ryan

+0

@minitech:Thanks :) –

+0

mysql_ *不應該再使用了! – markus