如何防止网站上的PHP代码执行漏洞
所以我遇到了一个问题,有人试图使用url执行php? 例如 ${@print(md5(123456789))} 据我所知,这将允许攻击者将自定义代码注入服务器端脚本引擎。当攻击者可以控制输入eval()函数调用的全部或部分输入字符串时,就会出现此漏洞。Eval将以代码形式执行参数。受此影响,攻击者可以在服务器上执行任何PHP代码 我正在使用mongoDB顺便说一句。我希望有人能帮助我,以防止任何输入这一点。如何防止网站上的PHP代码执行漏洞,php,mongodb,Php,Mongodb,所以我遇到了一个问题,有人试图使用url执行php? 例如 ${@print(md5(123456789))} 据我所知,这将允许攻击者将自定义代码注入服务器端脚本引擎。当攻击者可以控制输入eval()函数调用的全部或部分输入字符串时,就会出现此漏洞。Eval将以代码形式执行参数。受此影响,攻击者可以在服务器上执行任何PHP代码 我正在使用mongoDB顺便说一句。我希望有人能帮助我,以防止任何输入这一点。 提前感谢您必须验证来自用户的每个输入数据 您可以使用mysql\u real\u esc
提前感谢您必须验证来自用户的每个输入数据 您可以使用mysql\u real\u escape\u string函数对特殊字符进行转义 在使用关键字直接搜索之前使用搜索功能时,首先检查输入的关键字是否符合最低要求,就像您要搜索整数值的数据一样,但输入的值是文本,因此在这种情况下,与其直接搜索,不如验证输入的数据
无论如何,我们不能说一个站点100%安全,没有漏洞,我们必须降低漏洞的百分比。不清楚您指的是使用PHP的
eval()
还是MongoDB的命令(也由调用)。如果是后者,您可以使用多种方法将PHP值传递到JavaScript中,同时仍然可以避免在JS代码中连接PHP值(例如,作为变量赋值)
eval
命令使用一个args
选项,该选项允许您为已计算的函数提供参数。对于MongoDB::execute()
命令包装器,这将是第二个参数。如果要使用对象定义JS函数(应该这样做),还可以使用scope
constructor参数将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: %s\n", $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: %s\n", $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: %s\n", $rs['retval']);
$rs = $m->test->execute(
'function(a){ return Array.isArray(a) ? "array" : typeof a; }',
[$value]
);
printf("MongoDB::execute() with code string and args: %s\n", $rs['retval']);
$rs = $m->test->execute(
new MongoCode('function(){ return Array.isArray(b) ? "array" : typeof b; }', ['b' => $value])
);
printf("MongoDB::execute() with MongoCode scope: %s\n", $rs['retval']);
}
好吧,你不能阻止人们尝试,但是你可以通过正确的保护措施轻松避免任何伤害。除非对未过滤的输入使用eval(),否则您发布的尝试是无害的。我的脚本中有一个eval函数。我使用的是mongodb。我有一个自定义javascript代码来处理查询。所以我很确定它会进入那里。您正在谈论的“保护”是什么?您在使用什么php
eval()
?请添加该代码,以便我们可以帮助您更好地发现漏洞。请参阅此问题。可能它会帮助您使用未初始化的输入来确定应用程序的行为,尤其是通过eval来确定,这将是一个愚蠢的错误。你必须犯这样的错误,PHP不会mysql\u real\u escape\u string()
对MongoDB非常无用,它甚至不是SQL数据库。此外,验证不同于转义,这是应该做的