PHP';s$\请求方法有安全问题吗?

PHP';s$\请求方法有安全问题吗?,php,security,Php,Security,我读过的教科书说$\u请求有安全问题,所以我们最好使用$\u POST 这样行吗 好吧,$\u REQUEST出现问题的原因是它从$\u GET、$\u POST和$\u COOKIE中提取值,这意味着如果您以某种方式编写代码,并对客户的假设进行某些无效的信任,恶意用户可以通过在不同于您预期的位置提供值并覆盖您试图传递的值来利用此漏洞 这也意味着您可能给了您的追随者错误的指示,因为他可能从$\u请求中获取了GET或COOKIE值。您需要使用实际显示的值的任何位置,而不一定是$\u POST告诉人

我读过的教科书说$\u请求有安全问题,所以我们最好使用$\u POST


这样行吗

好吧,
$\u REQUEST
出现问题的原因是它从
$\u GET
$\u POST
$\u COOKIE
中提取值,这意味着如果您以某种方式编写代码,并对客户的假设进行某些无效的信任,恶意用户可以通过在不同于您预期的位置提供值并覆盖您试图传递的值来利用此漏洞


这也意味着您可能给了您的追随者错误的指示,因为他可能从
$\u请求中获取了GET或COOKIE值。您需要使用实际显示的值的任何位置,而不一定是
$\u POST

告诉人们使用
$\u POST
而不是
$\u REQUEST
,这当然是可以的。更好的做法是更清楚地知道您从何处获取数据。

我想说,将$\u POST描述为比$\u请求更安全是危险的

如果数据在使用前未经过验证和消毒,则可能存在攻击向量

简言之:
如果没有以安全的方式处理数据,则数据来自何处无关紧要。

正如在几个回答中已经提到的那样:来自客户端的任何数据都不可信,默认情况下必须被视为恶意数据。这包括
$\u POST
$\u GET
$\u COOKIE
$\u REQUEST
(前者的组合),但也包括其他内容

当谈到其中一些比其他更危险时,我确实会将
$\u GET
$\u REQUEST
(因为它包括
$\u GET
)从
$\u POST
中分离出来,因为生成POST请求比处理GET请求稍微困难一些。这里的重点稍微有一点,但使用POST进行敏感操作至少可以消除另一层需要利用的低挂果实

特别是当涉及到(或XSS)和cookie盗窃时,很容易让受害者的浏览器向受到攻击的服务器发出get请求,只需将带有被操纵URL的隐藏图像插入页面或伪造链接即可

发出POST请求至少需要一些JavaScript,而将JavaScript注入受害者的浏览器执行起来要稍微困难一些(取决于具体情况)。显然,POST请求可以由攻击者直接生成,因此它们也不可信,但对于攻击者通过第三方浏览器的情况,它们更难操纵

安全性总是尽可能地使您的应用程序很难被破坏——考虑到实现约束等。它永远不可能是100%安全的。因此,当在不同的实现方法之间进行选择时,最好选择更难利用的替代方案,即使差异很小


最后,它总是关于移除低垂的果实。当然,POST请求也可以被操纵,但对于任何风险较高的操作,请使用POST请求并限制自己在代码中使用
$\u POST
。通过这种方式,您已经排除了一些非常容易获得的驱动攻击,现在可以专注于验证您的POST数据。不要以为使用POST会突然使操作在默认情况下变得安全。

最安全的方法是验证数据。我通常为表单生成一个随机唯一id,并将其存储在用户会话中,但这很容易被确定的攻击者绕过。更好的方法是清理所有传入的数据。查看htmlspecialchars()及其相关函数。我还使用第三方实用程序进行跨站点操作,如

在一些实用的注释中,始终使用intval()应该是数字的,转义所有传入的字符串,对电话号码、电子邮件或任何将成为SQL查询一部分的内容使用regex


希望这能有所帮助。

使用
$\u POST
$\u REQUEST
之间没有真正的安全区别,您应该对数据进行同样仔细的清理

$\u REQUEST
的最大问题是,您可能试图从发布的表单获取数据,但可能有一个同名的get参数。这些数据来自哪里?最好从您期望的位置显式请求数据,在该示例中为
$\u POST

还有一些安全方面的好处-更容易对GET参数执行XSS(更具体地说)攻击,如果您只需要POST数据,而使用
$\u REQUEST
,这是可能的

很少有情况下您需要来自POST、GET或cookie的数据。。如果要获取POST数据,请使用
$\u POST
;如果要从get参数获取数据,请使用
$\u get
;如果要获取cookie数据,请使用
$\u cookie

@Christian:

当谈到其中一些比其他更危险时,我确实会将$\u GET和$\u REQUEST(包括$\u GET)从$\u POST中分离出来,因为生成(即操纵)POST请求比生成GET请求稍微困难一些。这里的重点稍微有一点,但使用POST进行敏感操作至少可以消除另一层需要利用的低挂果实

Bzzt。对不起,这不是真的

任何了解GET和POST之间的区别或未初始化的输入如何可被利用的人,都会毫不犹豫地触发篡改数据


有些人就在这里:在设计良好的系统中使用$\u请求不会丢失或获得安全性。

也就是说,这些值中的任何一个都有可能被编辑。有很多插件可以让你更改帖子数据