首先 - 我知道準備好的語句是「銀彈」,我「應該使用它們」 - 但是對於這個項目來說,這是不可行的。相信我,當我說它不能發生。所以,在講道開始之前...;)SQL注入,real_escape_string和帶引號的查詢
因此,我一直在閱讀SQL注入今晚4個小時。
,每反駁使用real_escape_string(我與PHP的工作和MySQL)說,基本上,real_escape_string不會停止這樣的:
SELECT * FROM something WHERE id=1 or 1=1;
權。得到它了。
但自從我大約15年前第一次接觸到mysql時,我寫過的每個查詢都總是單引號引用查詢中發送的所有參數。就像,如果我沒有單引號參數,我有這種感覺,查詢將失敗。所以我總是單引號。所有。的。時間。
和:
$_POST['userinput'] is submitted as "1 or 1=1";
$clean = $db->real_escape_string($_POST['userinput']);
$db->query("SELECT * FROM something WHERE id='$clean'");
如何有史以來被打破?它可以?我從來沒有見過一個射擊不使用無引號版本的real_escape_string的例子。
它在引號中。所有可能從報價中跳出的內部報價都會逃脫。
再說一遍:我知道準備好的陳述是最好的。那不是我要問的。我在問,我上面寫的是否可以打破?
我看不到方法。
+1。 OP代碼是「安全的」。 'real_escape_function'在輸入字符串中標識「危險」字符,並返回一個「安全」字符串以包含在SQL語句中,如果這樣做也是以「安全」方式完成的,如OP示例中那樣,將它用SQL文本中的單引號括起來。 – spencer7593