如何防止网站上的PHP代码执行漏洞



所以我遇到了一个问题,有人试图使用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上下文中的变量。与evalargs选项非常相似,这里的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%安全,我们必须减少漏洞的百分比。

最新更新