如果记录了这种行为,取消设置PHP超级全局变量是否安全?

如果记录了这种行为,取消设置PHP超级全局变量是否安全?,php,frameworks,request,unset,superglobals,Php,Frameworks,Request,Unset,Superglobals,我正在构建一个PHP框架,其中有一个请求对象,解析url以及$\u GET、$\u POST和$\u文件超全局 我想鼓励安全的网络习惯,所以我要保护数据不受SQL注入等的影响 为了确保此框架的用户通过请求对象访问安全、干净的数据,我计划使用unset($\u GET,$\u POST,$\u request)在解析这些变量之后 我将在方法注释中记录这一点,并在框架文档中解释这一点 我的问题是:这是一种可取的行为吗?我没有预见到的潜在陷阱有哪些?我可能会公开一种获取原始数据的方法(可能是隐藏的或超

我正在构建一个PHP框架,其中有一个请求对象,解析url以及
$\u GET
$\u POST
$\u文件
超全局

我想鼓励安全的网络习惯,所以我要保护数据不受SQL注入等的影响

为了确保此框架的用户通过请求对象访问安全、干净的数据,我计划使用
unset($\u GET,$\u POST,$\u request)在解析这些变量之后

我将在方法注释中记录这一点,并在框架文档中解释这一点


我的问题是:这是一种可取的行为吗?我没有预见到的潜在陷阱有哪些?

我可能会公开一种获取原始数据的方法(可能是隐藏的或超级反直觉的;),以避免您的清理例程以某种不可预见的方式损坏数据。保护用户是一回事,但是完全锁定他们以最原始的方式检索数据的能力可能会导致挫折,因此,那些不使用您的框架的人:)

请记住,这会增加您的维护成本……如果PHP中的super globals添加、删除或更改任何内容,您需要更新您的框架。

我不确定阻止访问$\u GET或$\u POST数组有什么意义。它们没有什么害处。如果要创建防止SQL注入或跨站点脚本的框架,则应在创建SQL查询或HTML文档时转义数据

在开始时转义GET/POST数据太早;您不知道数据将如何使用,因此无法对其进行转义或正确编码


尽管如此,您仍然有一些正当的理由希望人们通过您的代码访问GET/POST数据。那样的话,我还是不会让他们不安。您可能最终合并了依赖它们的第三方代码。相反,只要鼓励你的用户避免使用它们(就像他们通常应该避免使用全局变量一样)。

听起来像魔术式思维。除此之外,至少magic_引号在运行时是99%可逆的。你的“清理”数据可能有损,这真的很糟糕。

我知道这已经得到了回答,但这是我的0.02美元

我不会取消设置或清除输入数组。然而,我所做的是用一个对象替换它们。因此,我没有使用原始数组,而是用实现
ArrayAccess
Iterator
的对象替换它。这样,绝大多数使用本机数组的代码仍然可以很好地处理对象

其基本原理是,至少可以通过测试验证代码路径是否正确运行。您可以使用模拟对象替换这些对象,以便在测试期间引发异常,从而可以检测对这些数组的不正确访问(如果您确定这是“错误做法”)。因此,它允许您在生产过程中运行,而无需施加不必要的限制,但也允许您在测试期间打开它以验证最佳实践

虽然我同意@JW关于转义的说法,但您应该过滤输入。滤入,逸出。任何时候数据进入你的程序(无论是通过用户输入还是从数据库),过滤它到期望值。任何时候数据输出(无论是到数据库还是到用户),您都需要为该介质正确地转义数据。因此,使用一个能够轻松过滤提交数据的请求对象是非常有价值的

使用fluent界面的示例(您可能想要,也可能不想要):

这还不包括补偿不同平台和配置的好处(例如,是否启用了
magic\u quotes\u gcp
,等等)


不管怎样,这只是我的观点…

+1我喜欢添加
$this->raw\u get$此->原始帖子等等啊。。我发现我的逻辑可能有点缺陷。同意。修改了我的逻辑我决定用实现
ArrayAccess
Iterator
Countable
的对象替换它们。谢谢你的好主意!
$id = $request->get('some_id')->filter('int', array('min' => 1));