我的心腹是学习PHP目前,
他送我他的PHP代码,
我发现他在他的代码使用$ _REQUEST。
我读这本教科书说,
$ _REQUEST有安全问题,使
我们更好地使用$ _POST。
所以我回复了那狗腿子
我们更好地使用$ _POST。
这个可以吗?
我的心腹是学习PHP目前,
他送我他的PHP代码,
我发现他在他的代码使用$ _REQUEST。
我读这本教科书说,
$ _REQUEST有安全问题,使
我们更好地使用$ _POST。
所以我回复了那狗腿子
我们更好地使用$ _POST。
这个可以吗?
我会说,这是危险的表征$ _POST为超过$ _REQUEST更安全。
如果数据没有被验证,并在使用前消毒,你有攻击的可能载体。
简而言之: 这不要紧,数据来源于如果它不被以安全的方式处理。
那么,其原因$_REQUEST
有问题的是,它从拿起值$_GET
, $_POST
和$_COOKIE
,这意味着,如果你的代码的事情一定的方式,使某些无效的信任,将客户端的假设,恶意用户可以利用这一点通过提供比你预期不同的地方的值,并覆盖您试图通过一个。
这也意味着,你可以给你的心腹说明不正确,因为它可能是一个GET或COOKIE值,他是从捡$_REQUEST
。 您将需要使用任何地方,你要寻找的实际值显示出来,不一定$_POST
。
正如在几个答案已经提到: 来自客户端的任何数据不能被信任,必须被视为是在默认情况下恶意 。 这包括$_POST
, $_GET
, $_COOKIE
和$_REQUEST
(前者的组合),但其他人。
在谈到有些人比其他人更危险的我的确会分开$_GET
和$_REQUEST
(因为它包括$_GET
)出从$_POST
,因为它是稍硬产生,即操纵,不是一个GET请求的POST请求 。 这里的重点是 ,但使用POST进行敏感操作至少消除低垂的果实利用的另一层。
尤其是当它涉及到跨站点脚本 (或XSS)和Cookie窃取,这是相当容易,只需插入一个隐藏的图像与操纵URL到页面或锻造获得受害者的浏览器发出GET请求,受到攻击的服务器一条链接。
发出POST请求至少需要一些JavaScript,这是注入到受害者的浏览器执行(视情况而定)。 显然POST请求可以被攻击者直接生成的,所以他们也不能被信任,但对于那些攻击者通过第三方浏览器去的场景,他们是有点难以操作。
安全始终是关于使它很难,因为可能打破您的应用程序 - 以实现约束等方面综合考虑。 它不可能是近乎100%的安全。 因此,它选择的替代是更加难以利用,即使不同的是边际 ,具有不同的实现方法之间做出选择时,最好的做法。
最后,它总是要消除低挂水果。 当然,POST请求也可被操纵,但对于具有高风险的任何操作,使用POST请求,并限制自己使用$_POST
在你的代码。 你有这样已经排除了一些非常简单的GET驱动的攻击,现在可以专注于确认您的POST数据。 只是不认为使用POST突然来了操作安全默认。
您当然可以告诉人们使用$_POST
而不是$_REQUEST
。 它始终是更好更确保了解您得到您的数据。
@基督教:
在谈到有些人比其他人更危险的我的确会单独的$ _GET和$ _REQUEST(因为它包括$ _GET)出从$ _ POST,因为它是稍硬产生,即操纵,不是一个GET请求的POST请求。 这里的重点是略有下降,但使用POST进行敏感操作至少消除低垂的果实利用的另一层。
Bzzt。 很抱歉,但这恰恰是不正确的。
如果谁了解GET和POST或如何unsanitized输入可能被利用之间的差异,会毫不犹豫的第二个火起来篡改数据。
有些人就在这里:没有安全丢失或通过一个精心设计的系统中使用$ _REQUEST获得。
有使用之间没有真正的安全差异$_POST
和$_REQUEST
,你应该用消毒等于推敲的数据。
与最大的问题$_REQUEST
是你可能试图从POST'd形式获取数据,但可能具有相同名称的GET参数。 数据从何而来? 这是最好的明确要求,从您预期的位置数据, $_POST
在这个例子
有轻微的安全优势-它更容易执行跨站脚本(更具体地说XSRF )的GET参数的攻击,如果你使用的是可能$_REQUEST
,当你真的只是想POST数据..
有极少数的情况下,当你需要的数据无论是从POST,GET或饼干。如果你想获得POST数据,使用$_POST
,如果你想从GET参数中获取数据,使用$_GET
,如果你想的cookie数据,使用$_COOKIE
最安全的方法是检验和验证数据。 我通常会生成一种形式的随机唯一的ID,并将其存储在用户的会话,但是这很容易被确定攻击者绕过。 更好的是,清理所有的输入数据。 看看用htmlspecialchars()及其相关功能。 我也使用第三方工具进行跨网站,如HTML Purfier
在一些实际的音符,总是使用INTVAL()什么应该是数字,逃避所有传入的字符串,请使用正则表达式的电话号码,电子邮件或任何将是一个SQL查询的一部分。
希望这可以帮助。