2016-03-17 30 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字符串中的单词。