我读过的教科书说$ _REQUEST存在安全问题,因此我们最好使用$ _POST。
这样可以吗?
我会说将$ _POST表征为比$ _REQUEST更安全是危险的。
如果在使用数据之前未对数据进行验证和清理,则可能会造成攻击。
简而言之:如果数据没有以安全的方式处理,则数据来自哪里都没有关系。
[好,$_REQUEST
出现问题的原因是它从$_GET
,$_POST
和$_COOKIE
中选取值,这意味着如果您以某种方式对事物进行编码,并使某些无效的信任客户端假设,恶意用户可以通过在不同于您期望的位置提供值并覆盖您尝试传递的值来利用该值。
这也意味着您可能给了您的商人一个不正确的指示,因为它可能是他从$_REQUEST
中获取的GET或COOKIE值。您将需要使用要查找的值实际显示的任何位置,而不必使用$_POST
。
正如在多个答案中已经提到的:来自客户端的任何数据都不能被信任,并且默认情况下必须将其视为恶意的。这包括$_POST
,$_GET
,$_COOKIE
和$_REQUEST
(前者的组合),但也包括其他。
[当谈论其中一些危险比其他危险时,我的确会从$_GET
中分离出$_REQUEST
和$_GET
(因为其中包括$_POST
),因为生成起来较难,即操纵,即POST请求而不是GET请求。这里的重点是slightly,但是使用POST进行敏感操作至少至少会消除另一层难以捉摸的果实可供利用。
[特别是涉及Cross Site Scripting(或XSS)和cookie盗窃时,很容易使受害者的浏览器向受攻击的服务器发出GET请求,方法是将隐藏的图像和可操纵的URL插入页面即可。或伪造链接。
发出POST请求至少需要一些JavaScript,这很难([略微)注入受害者的浏览器中以执行(取决于具体情况)。显然,攻击者可以直接生成POST请求,因此也无法信任POST请求,但是对于攻击者通过第三方浏览器的情况,则操作起来会有些困难。
安全始终是要尽可能地破坏您的应用程序-考虑到实现限制等。它永远不可能是100%安全的。因此,在不同的实现方法之间进行选择时,最好的做法是选择即使差异很小的情况下也更难以利用的替代方法。
最后,总是要去除低垂的果实。当然,也可以操纵POST请求,但是对于任何风险较高的操作,请使用POST请求,并限制自己在代码中使用$_POST
。这样,您已经排除了一些非常简单的GET偷渡攻击,现在可以专注于验证POST数据。只是不要假设默认情况下使用POST会使操作安全。$_POST
而不是$_REQUEST
当然可以。最好总是更加确定从何处获取数据。[当谈论其中一些危险比其他危险时,我的确会从$ _POST中分离出$ _GET和$ _REQUEST(因为它包含$ _GET),因为它比生成一个POST请求要难一些,即操纵它。 GET请求。这里的重点稍有一点,但是使用POST进行敏感操作至少至少消除了另一层难以捉摸的成果。
Bzzt。对不起,但这不是真的。
了解GET和POST之间的区别或未经过处理的输入可能如何被利用的任何人,都将毫不犹豫地启动篡改数据。
有人在这里使用它:在设计良好的系统中使用$ _REQUEST不会损失或提高安全性。
$_POST
和$_REQUEST
之间没有真正的安全性差异,应该以同样的方式对数据进行清理。$_REQUEST
的最大问题是您可能正试图从POST表单中获取数据,但是可能具有同名的GET参数。数据从哪里来?最好从您期望的位置显式请求数据,在该示例中为$_POST
具有
slight安全优点-对GET参数执行XSS(更具体地为XSRF)攻击更容易,如果您只需要POST数据,则如果使用$_REQUEST
,则可以进行攻击。
$_POST
,如果要从GET参数中获取数据,请使用$_GET
。需要Cookie数据,请使用$_COOKIE
在一些实际的注意事项上,请始终使用应为数字的intval(),转义所有传入的字符串,对电话号码,电子邮件或将要成为SQL查询一部分的任何内容使用正则表达式。
希望这会有所帮助。