2016-03-17 29 views
0

我有一段生成動態XML字符串的Javascript代碼。然後將該XML字符串傳遞給PHP文件,我需要檢查該文件以確保該字符串不包含任何可能允許SQL注入的不良詞。PHP字符串中的黑名單字

我想我只是創建一個黑名單,如果找到任何單詞,我們只是不發送XML到數據庫。

但是,當我傳入一個或多個黑名單單詞時,我的代碼片段並未返回true。

// Create a blacklist array 
$blacklist = Array('create', 'alter', 'update', 'delete', 'drop', 'insert', 'into', 'from', 'where'); 

// Define our vars 
$xml = '<blah>alert table drop something create</blah>'; 
$actor = $_COOKIE['QID']; 
$sp = $_POST['sp']; 

// Lets check the XML string to see if it contains any database altering words 
function contains($str, array $arr) 
{ 
    foreach($arr as $a) { 
     if (stripos($a,$str) !== false) return true; 
    } 
    return false; 
} 

// Check our XML string 
if(contains($xml, $blacklist)) 
{ 
    echo 'Contains'; 
} 
else 
{ 
    echo 'Does not contain'; 
} 

有沒有更好的方法來處理這種類型的檢查?我不確定要搜索什麼,所以認爲單詞的黑名單就足夠了。

+0

你應該不那麼擔心字符串中的單詞,而更擔心引號。只要它們被正確引用,這些詞語都不會引起任何問題。 –

+0

xml正在用於動態SQL查詢。 xml包含用戶想要包含在其報告中的字段名稱。查詢運行時,它將使用XML字符串中的每個值作爲字段名稱創建一個select語句。我寧願只是不讓這些單詞超過這個函數,也不需要它們存在於正在創建的字符串中。 – SBB

+0

然後你能展示更多的代碼嗎?包括生成並執行任何查詢的部分?使用參數化查詢可能會提供您所需的保護。如果你真的想使用黑名單方法,你將需要一個更大的名單。 –

回答

1

致電stripos時,您的參數按錯誤順序排列。而不是stripos($a,$str),你想要stripos($str,$a)。第一個版本是在單個「壞」字中搜索整個XML字符串。第二個搜索XML字符串中的單詞。