PHP中此代码段背后的安全注意事项

时间:2009-06-07 12:52:43

标签: php security

我正在阅读一些关于高级PHP的书籍,大多数时候我都会找到这样的代码:

$classes = array ("MyClass1", "MyClass2");

if (!in_array ($_GET['class'], $classes))
    throw new Exception ("Class not found!");

$params = $_GET;

$obj = new $_GET['class'];

if (!method_exists ($_GET['method'], $obj)
    throw new Exception ("Method not found!");

echo $obj->{$_GET['method']}();

在我找到此代码的书中,作者总是提到这段代码对于生产环境不安全,应该检查类名。

我的问题是,如果正在检查类名,它是否存在于数组中(我添加了这个,它不在书中的例子中),我应该采取哪些安全考虑?将输出类名,因此XSS过滤没有多大意义。此类名称也不会命中数据库,因此不需要SQL注入过滤它。

提前感谢您的所有答案。

4 个答案:

答案 0 :(得分:4)

在通过数组检查类名时,方法名称不是。你可能有类似

的东西
class Foo
{
    function reset()
    {
        // rm -rf DocumentRoot
    }
}

虽然不太可能,但可能存在。

简单地说,永远不要相信用户输入。在这种情况下,我将给出一个可以调用的有效函数列表。

但话说回来,我永远不会使用这样的代码,我可能会做一些URL< - >功能映射

答案 1 :(得分:3)

您添加检查以查看该类是否是一组有限的值,可以修复您提到的安全问题。这被称为“白名单”方法(默认情况下,除了您特别允许的内容之外,所有内容都是不允许的),并且是这种方法的正确方法。

方法GET参数可能有同样的问题,但我想不出任何可能被利用的情况。毕竟一个班级只有一套有限的方法,特别是如果他们是你的班级。仍然可能值得以某种方式过滤它们只是为了安全,就像你只能调用以“z”或其他东西开头的方法。

答案 2 :(得分:1)

我没有看到问题。 但你可以在$ _GET上添加一个filter_var函数, 链接使用它: http://net.tutsplus.com/tutorials/php/sanitize-and-validate-data-with-php-filters/

答案 3 :(得分:0)

它对代码注入攻击持开放态度。

出于这个原因,您应该始终清理从$ _GET返回的任何数据,并且永远不要相信用户输入没有可执行代码(或其他一些不良内容)。

请参阅本网站上的Best way to avoid code injection in PHP,其中详细介绍了代码注入和清理输入。