2011-11-25 55 views
2

我想阻止1 = 1使用mysql_real_escape_string,但不知道如果即時通訊正確,因爲我仍然可以執行1 = 1。這是我的代碼:MySQL注入預防不起作用?

$memberId = mysql_real_escape_string($_GET["memberId"]); 
$sql = "SELECT firstName, lastName, dateSent, message, messageId FROM member, message WHERE member.memberId = message.sentFromId AND message.inboxId=" . $memberId . " ORDER BY dateSent DESC;"; 

感謝

+0

我已經在[MySQL/PDO/Prepared Statements中解釋過整個問題 - 所有的跳躍,有點壓倒性和有點混亂?](http://stackoverflow.com/questions/8061185/mysql-pdo- prepared-statements-all-a-big-jump-a-bit-over-a-lit) –

回答

6

mysql_real_escape_ STRING()是STRINGS,不是整數。 1=1中沒有任何內容需要轉義,所以m_r_e_s()會將其傳回原樣。

如果你處理整數,然後使用整數工具:

$memberID = intval($_GET['memberId']); 
+0

或使用適當的DB API來實現預處理語句... – Alnitak

3

不具有SQL注入的唯一正確途徑是使用prepared statements。 如果您嘗試減輕使用轉義,您將失敗。 如果你作爲一個規則永遠不會連接你的查詢,並始終使用準備好的語句,你有機會。
它還具有使您的代碼更具可讀性的優點。 並沒有缺點。

+0

+1我同意MK。但是(只是爲了分享)我在'prepared statements'上的立場是用'PDO'而不是'mysqli' :) – Nonym

+0

Re。 '沒有缺點':你如何使用準備好的語句創建一個多行插入(a.k.a擴展插入)? – Mchl

+0

這是不正確的。如果您將所有數據視爲字符串*作爲規則*,則永遠不會失敗,並保存LIMIT子句參數。無論如何,準備好的聲明仍然不是銀彈。它不會幫助標識符 –