我正在阅读一些关于高级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注入过滤它。
提前感谢您的所有答案。
答案 0 :(得分:4)
在通过数组检查类名时,方法名称不是。你可能有类似
的东西class Foo
{
function reset()
{
// rm -rf DocumentRoot
}
}
虽然不太可能,但可能存在。
简单地说,永远不要相信用户输入。在这种情况下,我将给出一个可以调用的有效函数列表。
但话说回来,我永远不会使用这样的代码,我可能会做一些URL< - >功能映射
答案 1 :(得分:3)
您添加检查以查看该类是否是一组有限的值,可以修复您提到的安全问题。这被称为“白名单”方法(默认情况下,除了您特别允许的内容之外,所有内容都是不允许的),并且是这种方法的正确方法。
方法GET参数可能有同样的问题,但我想不出任何可能被利用的情况。毕竟一个班级只有一套有限的方法,特别是如果他们是你的班级。仍然可能值得以某种方式过滤它们只是为了安全,就像你只能调用以“z”或其他东西开头的方法。
答案 2 :(得分:1)
答案 3 :(得分:0)
它对代码注入攻击持开放态度。
出于这个原因,您应该始终清理从$ _GET返回的任何数据,并且永远不要相信用户输入没有可执行代码(或其他一些不良内容)。
请参阅本网站上的Best way to avoid code injection in PHP,其中详细介绍了代码注入和清理输入。