簡體   English   中英

mysql_real_escape_string()沒有清理變量

[英]mysql_real_escape_string() not sanitizing variable

我正在嘗試阻止SQL注入的現有網站。 $_GET['ID']未經過清理之前。

$ID=mysql_real_escape_string($_GET['ID']);
$sQuery=mysql_query("select * from tbl_mini_website as s1, tbl_actor_merchant as me where s1.MERCHANT_ID=$ID AND s1.MERCHANT_ID=me.MERCHANT_ID");

如果我在url的末尾添加一個' mysql_real_escape_string()我從mysql_error()得到這個:

您的SQL語法有錯誤; 查看與您的MySQL服務器版本對應的手冊,以便在第1行的'\\\\'和s1.MERCHANT_ID = me.MERCHANT_ID'附近使用正確的語法

沒有mysql_real_escape_string()我得到:

您的SQL語法有錯誤; 查看與您的MySQL服務器版本對應的手冊,以便在第1行的'\\'和s1.MERCHANT_ID = me.MERCHANT_ID'附近使用正確的語法

我不確定它是什么? 任何幫助將不勝感激。

如果它是一個id,我假設數字,你為什么不把它轉換為整數?

$ID = (int) $_GET['ID'];

我能給你的最好建議是檢查PDO並使用綁定參數。

mysql_real_escape_string轉義,但不引用。

嘗試:

$sQuery=mysql_query("select * from tbl_mini_website as s1, tbl_actor_merchant as me where s1.MERCHANT_ID='$ID' AND s1.MERCHANT_ID=me.MERCHANT_ID");

更一般地說,我傾向於將這兩個包裝在一個函數中,例如:

function quoteValue($value) {
    return "'" . mysql_real_escape_string($value) . "'";
}

這很有用,因為您可能會發現需要更精確的引用行為的行(特別是在處理Unicode,控制字符等時)

這是因為你沒有引用變量。

這是您給出以下輸入的查詢

$_GET['ID'] = "1";
$ID=mysql_real_escape_string($_GET['ID']);
SELECT ... where s1.MERCHANT_ID=1 ...

$_GET['ID'] = "1'"
$ID=mysql_real_escape_string($_GET['ID']);
SELECT ... where s1.MERCHANT_ID=1\' ...

$_GET['ID'] = "1'"
SELECT ... where s1.MERCHANT_ID=1' ...

Phil Brown是對的,但你要忘記老式的mysql_real_escape_string or mysql_connect()因為它們已經很老了,轉移到php的PDO(),在那里你可以使用預備語句,綁定,獲取任何更多功能的對象。

如果你想要下一代dabatase操作和SQL Injection的安全性,我建議你在http://php.net/manual/en/book.pdo.php閱讀PDO文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM