我正在考虑构建一个新的PHP应用程序,它允许添加新的模块。由于我仍处于考虑设计结构和安全性的早期阶段,因此我想到了一个问题:
我是否可以阻止第三方模块访问$ _变量($_SESSION
,$_SERVER
等),除非通过应用程序的核心控制器类?如果可以的话,我该如何实现呢?
答案 0 :(得分:0)
您可以设置一个读取这些值的输入类,然后在控制器看到它们之前将它们重置为空array()
。控制器仍然可以访问它们,但它们将无法从中检索任何输入。因此,他们将被迫转到您的输入对象以获取用户输入。
如果你这样做的目的是XSS过滤,那么值得注意的是,你经常需要处理污染数据(即包含危险字符<>'"
)。在这种情况下,你可能需要这样的东西:
$inputHolder->getRawValue('comment');
并且在通常的情况下(特别是对于整数等,欢迎危险的字符过滤):
$inputHolder->getValue('page');
我没有使用它,但我注意到流行的PHP框架CodeIgniter提供了similar feature to this。
值得了解这种方法的反驳 - 有些人会说这是过滤的错误地方。在理想的世界中,您将在控制器中处理受污染的输入,将其传递到视图/模板层,然后在那里将其转义(例如使用htmlentities()
)。或者,您将在控制器中进行解开/转换,以便在不转义的情况下进行渲染是安全的。