我正在构建一个PHP框架,在其中我有一个请求对象,它解析url以及$_GET
,$_POST
和$_FILE
超全局。
我想鼓励安全的网络习惯,所以我保护数据免受SQL注入等。
为了确保此框架的用户通过请求对象访问安全,干净的数据,我计划在解析这些变量后使用unset($_GET, $_POST, $_REQUEST);
。
我将在方法注释中记录这一点,并在框架文档中解释这种情况。
我的问题是:这是不可取的行为吗?我没有预见到哪些潜在的陷阱?
答案 0 :(得分:5)
我知道这已经回答了,但这是我的0.02美元。
我不会取消或清除输入数组。但是,我所做的是用一个对象替换它们。因此,我不是使用原始数组,而是将其替换为实现ArrayAccess
和Iterator
的对象。这样,使用本机数组的绝大多数代码仍然可以很好地与对象一起工作。
理由是,至少可以通过测试验证代码路径是否正常运行。您可以使用模拟对象替换这些对象,以便在测试期间抛出异常,以便您可以检测对这些数组的不正确访问(如果您确定它是“不良做法”)。因此,它允许您在生产期间运行而不会产生不必要的限制,但也允许您打开它以验证测试期间的最佳实践。
虽然我同意@JW关于转义,但你应该过滤输入。过滤,逃脱。任何时候数据进入您的程序(通过用户输入或从数据库),将其过滤到预期值。任何时候数据输出(无论是数据库还是用户),您都需要为该介质正确地转义数据。因此,使用能够轻松过滤提交数据的请求对象非常有价值。
使用流畅界面的示例(您可能想要也可能不想要):
$id = $request->get('some_id')->filter('int', array('min' => 1));
这不包括补偿不同平台和配置的好处(例如,如果启用了magic_quotes_gcp
,等等)......
无论如何,这只是我的意见......
答案 1 :(得分:3)
我不确定阻止访问$ _GET或$ _POST数组的重点是什么。它们没有任何危害。如果要创建用于防止SQL注入或跨站点脚本编写的框架,则应在创建SQL查询或HTML文档时转义数据。
一开始就逃避GET / POST数据太早了;您不知道如何使用数据,因此您无法正确转义或编码。
话虽如此,您仍然可能有一些正当理由希望人们通过您的代码访问GET / POST数据。在那种情况下,我仍然不会解开它们。您最终可能会合并依赖于它们的第三方代码。相反,只是鼓励用户避免使用它们(就像他们应该避免使用全局变量一样)。
答案 2 :(得分:1)
我可能会暴露一种方法(可能是隐藏的或超级反直觉的;))来获取原始数据,因为您的清理程序会以某种不可预见的方式破坏数据。保护用户是一回事,但要完全锁定他们以最原始的方式检索数据的能力可能会导致挫败感,因此,那些不使用您的框架的人:)
答案 3 :(得分:0)
请记住,这会增加您的维护成本...如果使用PHP中的超级全局变量添加,删除或更改任何内容,则需要更新框架。
答案 4 :(得分:0)
听起来像是magic_quotes风格的思维。除此之外,至少magic_quotes在运行时是99%可逆的。你的"清洁"数据可能有损,实在太糟糕了。