2013-12-13 88 views
0

所以我遇到了一个问题,有人试图使用url执行php?例如, 。 http://example.com/search.php?keyword=关于我读到的内容,{{@ print(md5(123456789))}如何防止站点上的PHP代码执行漏洞

这将允许攻击者将自定义代码注入服务器端脚本引擎。当攻击者可以控制输入到eval()函数调用的全部或部分输入字符串时,会发生此漏洞。 Eval将以代码形式执行参数。这个攻击者的影响可以在你的服务器上执行任何PHP代码。

我使用mongoDB顺便说一句。我很想有人帮助我阻止任何输入。 在此先感谢

+0

据我所知,你不能阻止人们试图说,但你可以很容易地避免与正确保护任何伤害。除非你在未过滤的输入上使用eval(),否则你发布的这个企图是无害的 –

+0

我的脚本中有一个eval函数。我正在使用mongodb。我有一个自定义的JavaScript代码来处理查询。所以我很确定它进入那里。你在谈论什么是“保护”? –

+0

关于你在用什么PHP'eval()'?请添加该代码,以便我们更好地帮助您发现漏洞。 –

回答

-4

您必须验证来自用户的每个输入数据。

您可以使用mysql_real_escape_string功能,特殊字符转义,

,虽然来之前与关键字直接搜索到搜索功能,首先检查输入的关键词是否符合最低要求,比如你要搜索的数据整数值,但输入的值是一个文本,所以在这种情况下,而不是直接搜索,最好验证输入的数据。

无论如何,我们不能说一个网站是100%安全的漏洞,我们必须减少漏洞的百分比。

+2

'mysql_real_escape_string()'对于MongoDB来说非常没用,它甚至不是SQL数据库。此外,验证是不同于_escaping_,这是什么应该做 –

+0

你是正确的。有些人需要正确阅读。 –

0

目前还不清楚您是指使用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: %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']); 
}