所以我遇到了一个问题,有人试图使用url执行php?例如http://example.com/search.php?keyword=${@print(md5(123456789))}
这将允许攻击者将自定义代码注入服务器端脚本引擎。当攻击者能够控制输入到eval()函数调用中的全部或部分输入字符串时,就会出现此漏洞。Eval将以代码形式执行参数。攻击者可以在您的服务器上执行任何PHP代码。
顺便说一句,我正在使用mongoDB。我希望有人能帮助我,防止任何输入出现这种情况。提前感谢
不清楚您指的是使用PHP的eval()
还是MongoDB的eval
命令(也由MongoDB::execute()
调用)。如果是后者,您有几种方法可以将PHP值传递到JavaScript中,同时仍然避免在JS代码中连接它(例如,作为变量赋值)
eval
命令采用args
选项,该选项允许您为被求值函数提供参数。对于MongoDB::execute()
命令包装器,这将是第二个参数。如果您使用MongoCode对象定义JS函数(您应该这样做),还可以使用scope
构造函数参数将PHP值绑定到JS上下文中的变量。与eval
的args
选项非常相似,这里的PHP值将被序列化为BSON,然后可用于JavaScript函数。除了布尔值、数字和字符串之外,还可以传入数组、对象(实际对象或关联数组)和函数(通过将字符串封装在MongoCode对象中)。
以下脚本应该演示如何将各种PHP值传递给每个调用方法:
$m = new MongoClient();
$values = [
true,
1.5,
'foo',
[1,2,3],
(object) ['a' => 1],
new MongoCode('function() {}'),
];
foreach ($values as $value) {
$type = is_object($value) ? get_class($value) : gettype($value);
printf("nTesting PHP type: %sn", $type);
$rs = $m->test->command([
'eval' => 'function(a){ return Array.isArray(a) ? "array" : typeof a; }',
'args' => [$value],
]);
printf("MongoDB::command() with code string and args: %sn", $rs['retval']);
$rs = $m->test->execute(
new MongoCode('function(a){ return Array.isArray(a) ? "array" : typeof a; }'),
[$value]
);
printf("MongoDB::execute() with MongoCode and args: %sn", $rs['retval']);
$rs = $m->test->execute(
'function(a){ return Array.isArray(a) ? "array" : typeof a; }',
[$value]
);
printf("MongoDB::execute() with code string and args: %sn", $rs['retval']);
$rs = $m->test->execute(
new MongoCode('function(){ return Array.isArray(b) ? "array" : typeof b; }', ['b' => $value])
);
printf("MongoDB::execute() with MongoCode scope: %sn", $rs['retval']);
}
您必须验证来自用户的每个输入数据。
您可以使用mysql_real_sescape_string函数来转义特殊字符,
在使用关键字直接搜索之前,先检查输入的关键字是否符合最低要求,就像你要搜索整数值的数据,但输入的值是文本一样,所以在这种情况下,与其直接搜索,不如验证输入的数据。
无论如何,我们不能说一个网站100%安全,我们必须减少漏洞的百分比。