2011-05-07 75 views
1

我該如何檢查這是否是難以治癒的?如何在此php代碼中檢查sql注入?

function clean($str){ 
    return mysql_real_escape_string(stripcslashes(strip_tags(htmlspecialchars($str)))); 
} 


if($_POST['submit']) { 
    $sql = "INSERT INTO comments(blog_id, dateposted, name, comment) VALUES 
       (" . clean($validentry) . " 
       , NOW() 
       , '" . clean($_POST['name']) . "' 
       , '" . clean($_POST['comment']) . "' 
       );"; 
mysql_query($sql); 

回答

5

你需要使用is_int()檢查blog_id - 因爲它不裹報價,mysql_real_escape_string()將無法​​消毒它。這顯然是一個漏洞。

除此之外,你的代碼看起來很安全,但它會做一些不必要的清理。

mysql_real_escape_string()對於namecomment字段是完全足夠的。

其他呼叫在該星座中不是必需的;或者strip_tagshtmlspecialchars()都會防止XSS攻擊。但是,將不安全的原始HTML存儲在數據庫中並在輸出時對其進行消毒是更好的做法。

stripcslashes調用你可以完全擺脫。

+0

非常感謝先生 – ktm 2011-05-07 11:15:25

+0

+1,但是如果數據庫模式h作爲最低限度的優秀設計,'blog_id'只會接受/轉換整數,我不認爲這可以被認爲是一個漏洞。 – 2011-05-07 11:52:28

+1

@Alix'mysql_real_escape_string()'只轉義引號字符。它不會*清理像'1; (SQL代碼在這裏)',這將在查詢中執行 – 2011-05-07 11:53:39

1

出於好奇,你自己編寫了這個函數嗎?我在問,因爲我一直看到clean()makeAllSecure()的功能,每個功能比以前都差。

爲了防止SQL注入,您需要使用的所有內容都是mysql_real_escape_string()或類似。

stripcslashes()也是不必要的,你可能會想叫stripslashes()代替IFF(如當且僅當magic_quotesOn$str爲用戶提供的變量,如果IFF產生真正的這個應通常只在腳本的開始處發生一次

關於strip_tags(htmlspecialchars($str)) - 它只有轉換'"<>他們的HTML實體符號的效果,無標籤將被剝奪......如果你真的還想要去除標籤是你正在尋找的是如下:

htmlspecialchars(strip_tags($str)) 

但是這種消毒應該在輸出HTML內容時發生,而不是在保存在數據庫中時發生。

1

使用這些功能過濾查詢:
例如:這個查詢,你不能,如果你不使用下面

http://www.example123.com/media.php?f=-1+OR+17-7%3d10

參數類型值

F取得功能過濾-1 OR 17-7 = 10

function clean($str){ 
    if(ereg('^[A-Za-z0-9]+$',$str)){ 
     $str=mysql_real_escape_string($str); 
     return($str); 
    }else{ 

     exit(); 
    } 
}