Jam*_*hon 281 html security http
将HTTP GET与HTTP POST进行比较时,从安全角度来看有何不同?其中一个选择本身比另一个更安全吗?如果是这样,为什么?
我意识到POST不会暴露关于URL的信息,但是它是否有任何实际价值,还是仅通过默默无闻的安全性?当担心安全问题时,我是否应该更喜欢POST?
编辑:
通过HTTPS,POST数据被编码,但是第三方可以嗅探URL吗?另外,我正在处理JSP; 在使用JSP或类似框架时,最好的做法是避免将敏感数据放在POST或GET中并使用服务器端代码处理敏感信息吗?
Joh*_*zen 423
GET请求的安全性略低于POST请求.两者都不能提供真正的"安全"; 使用POST请求不会神奇地使您的网站安全地抵御恶意攻击.但是,使用GET请求可能会使安全的应用程序不安全.
您"不得使用GET请求进行更改"的口头禅仍然非常有效,但这与恶意行为无关.登录表单是使用错误的请求类型发送最敏感的表单.
这是您应该使用POST请求更改数据的真正原因.搜索蜘蛛将关注您网站上的每个链接,但不会提交他们找到的随机表单.
Web加速器比搜索蜘蛛更糟糕,因为它们在客户端的计算机上运行,并在登录用户的上下文中 "单击"所有链接.因此,即使需要管理员,使用GET请求删除内容的应用程序也会很乐意遵守(非恶意!)Web加速器的命令并删除它看到的所有内容.
一个困惑副攻击(其中副是浏览器)是不管你是否使用GET或POST请求可能.
在攻击者控制的网站上,GET和POST 同样易于在 没有用户交互的情况下提交.
POST稍微不易受影响的唯一情况是许多不受攻击者控制的网站(比如第三方论坛)允许嵌入任意图像(允许攻击者注入任意GET请求),但是阻止所有注入任意POST请求的方式,无论是自动还是手动.
有人可能会说网络加速器是混乱的副攻击的一个例子,但这只是一个定义的问题.如果有的话,恶意攻击者对此拥有没有控制权,所以这是很难的攻击,即使副手是困惑.
代理服务器可能会完整地记录GET URL,而不会剥离查询字符串.通常不会记录POST请求参数.在任何一种情况下都不太可能记录Cookie.(例)
这是一个支持POST的非常弱的论据.首先,可以完整记录未加密的流量; 恶意代理已经拥有了它需要的一切.其次,请求参数对攻击者的用途有限:他们真正需要的是cookie,所以如果他们唯一拥有的是代理日志,他们就不太可能攻击GET或POST URL.
登录请求有一个例外:这些例外往往包含用户的密码.将其保存在代理日志中会打开一个在POST情况下不存在的攻击向量.但是,无论如何,通过普通HTTP登录本身就是不安全的.
缓存代理可能会保留GET响应,但不会保留POST响应.话虽如此,与将URL转换为POST处理程序相比,GET响应可以使用不可缓存的方式.
如果用户从响应GET请求而服务的页面导航到第三方网站,则该第三方网站可以看到所有GET请求参数.
属于"向第三方显示请求参数"的类别,其严重性取决于这些参数中存在的内容.POST请求自然不受此限制,但是为了利用GET请求,黑客需要将自己网站的链接插入到服务器的响应中.
这与"代理日志"参数非常相似:GET请求与其参数一起存储在浏览器历史记录中.如果攻击者可以物理访问机器,则可以轻松获取这些内容.
一旦用户点击"刷新",浏览器将重试GET请求.关机后恢复标签时可能会这样做.因此,任何行动(例如付款)都将在没有警告的情况下重复.
浏览器不会在没有警告的情况下重试POST请求.
这是仅使用POST请求来更改数据的一个很好的理由,但与恶意行为无关,因此也与安全性无关.
通过HTTPS,POST数据被编码,但是第三方可以嗅探URL吗?
不,他们不能被嗤之以鼻.但URL将存储在浏览器历史记录中.
可以公平地说,最佳做法是避免将敏感数据放在POST或GET中,并使用服务器端代码来处理敏感信息吗?
取决于它是多么敏感,或者更具体地说,取决于它的方式.显然客户会看到它.任何有物理访问客户端计算机的人都会看到它.客户端可以在发送给您时欺骗它.如果那些问题然后是,请将敏感数据保留在服务器上,不要让它离开.
ste*_*yer 204
就安全性而言,它们本质上是相同的.虽然POST不会通过URL公开信息,但它在客户端和服务器之间的实际网络通信中公开的信息与GET一样多.如果您需要传递敏感信息,您的第一道防线是使用安全HTTP传递它.
GET或查询字符串帖子非常适用于为特定项目添加书签或协助搜索引擎优化和索引项目所需的信息.
POST适用于用于提交一次性数据的标准表单.我不会使用GET发布实际表单,除非您希望允许用户将查询保存在书签中的搜索表单中,或者沿着这些行显示.
Inc*_*ito 173
您没有提供更高的安全性,因为变量是通过HTTP POST发送的,而不是通过HTTP GET发送的变量.
<html>
<body>
<form action="http://example.com" method="get">
User: <input type="text" name="username" /><br/>
Password: <input type="password" name="password" /><br/>
<input type="hidden" name="extra" value="lolcatz" />
<input type="submit"/>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
你的浏览器会问什么?它问这个:
GET /?username=swordfish&password=hunter2&extra=lolcatz HTTP/1.1
Host: example.com
Connection: keep-alive
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/ [...truncated]
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) [...truncated]
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Run Code Online (Sandbox Code Playgroud)
POST / HTTP/1.1
Host: example.com
Connection: keep-alive
Content-Length: 49
Cache-Control: max-age=0
Origin: null
Content-Type: application/x-www-form-urlencoded
Accept: application/xml,application/xhtml+xml,text/ [...truncated]
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; [...truncated]
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
username=swordfish&password=hunter2&extra=lolcatz
Run Code Online (Sandbox Code Playgroud)
这些HTTP请求的两个是:
许多浏览器不支持POST/GET以外的HTTP方法.
许多浏览器行为存储页面地址,但这并不意味着您可以忽略任何其他问题.
所以具体来说:
一个人本来就比另一个人更安全吗?我意识到POST不会暴露关于URL的信息,但是它是否有任何实际价值,或者只是通过默默无闻的安全性?这里的最佳做法是什么?
这是正确的,因为您用来说HTTP的软件倾向于使用一种方法存储请求变量而不是另一种方法只会阻止某人查看您的浏览器历史记录或其他一些认为他们理解h4x0r1ng的10岁儿童的天真攻击或检查历史记录存储的脚本.如果你有一个可以检查你的历史存储的脚本,你可以很容易地检查你的网络流量,所以通过默默无闻的整个安全只是为脚本小子和嫉妒的女朋友提供默默无闻.
通过https,POST数据被编码,但可能被第三方嗅探?
以下是SSL的工作原理.还记得上面发过的那两个请求吗?以下是他们在SSL中的样子:(我将页面更改为https://encrypted.google.com/,因为example.com不响应SSL).
q5XQP%RWCd2u#o/T9oiOyR2_YO?yo/3#tR_G7 2_RO8w?FoaObi)
oXpB_y?oO4q?`2o?O4G5D12Aovo?C@?/P/oOEQC5v?vai /%0Odo
QVw#6eoGXBF_o?/u0_F!_1a0A?Q b%TFyS@Or1SR/O/o/_@5o&_o
9q1/?q$7yOAXOD5sc$H`BECo1w/`4?)f!%geOOF/!/#Of_f&AEI#
yvv/wu_b5?/o d9O?VOVOFHwRO/pO/OSv_/8/9o6b0FGOH61O?ti
/i7b?!_o8u%RS/Doai%/Be/d4$0sv_%YD2_/EOAO/C?vv/%X!T?R
_o_2yoBP)orw7H_yQsXOhoVUo49itare#cA?/c)I7R?YCsg ??c'
(_!(0u)o4eIis/S8Oo8_BDueC?1uUO%ooOI_o8WaoO/ x?B?oO@&
Pw?os9Od!c?/$3bWWeIrd_?( `P_C?7_g5O(ob(go?&/ooRxR'u/
T/yO3dS&??hIOB/?/OI?$oH2_?c_?OsD//0/_s%r
Run Code Online (Sandbox Code Playgroud)
rV/O8ow1pc`?058/8OS_Qy/$7oSsU'qoo#vCbOO`vt?yFo_?EYif)
43`I/WOP_8oH0%3OqP_h/cBO&24?'?o_4`scooPSOVWYSV?H?pV!i
?78cU!_b5h'/b2coWD?/43Tu?153pI/9?R8!_Od"(//O_a#t8x?__
bb3D?05Dh/PrS6_/&5p@V f $)/xvxfgO'q@y&e&S0rB3D/Y_/fO?
_'woRbOV?_!yxSOdwo1G1?8d_p?4fo81VS3sAOvO/Db/br)f4fOxt
_Qs3EO/?2O/TOo_8p82FOt/hO?X_P3o"OVQO_?Ww_dr"'DxHwo//P
oEfGtt/_o)5RgoGqui&AXEq/oXv&//?%/6_?/x_OTgOEE%v (u(?/
t7DX1O8oD?fVObiooi'8)so?o??`o"FyVOByY_ Supo? /'i?Oi"4
tr'9/o_7too7q?c2Pv
Run Code Online (Sandbox Code Playgroud)
(注意:我将HEX转换为ASCII,其中一些显然不能显示)
整个HTTP会话都是加密的,唯一可见的通信部分位于TCP/IP层(即IP地址和连接端口信息).
POST唯一的安全措施是什么?通过浏览器历史记录保护您免受嫉妒.而已.世界其他地方都会登录您的帐户,嘲笑您.
为了进一步说明为什么POST不安全,Facebook会在整个地方使用POST请求,那么FireSheep等软件如何存在呢?
请注意,即使您使用HTTPS并且您的站点不包含XSS漏洞,您也可能会受到CSRF的攻击.简而言之,此攻击情形假定受害者(您的站点或服务的用户)已经登录并拥有适当的cookie,然后请求受害者的浏览器对您的(据称是安全的)站点执行某些操作.如果您没有针对CSRF的保护,攻击者仍然可以使用受害者凭据执行操作.攻击者无法看到服务器响应,因为它将被转移到受害者的浏览器,但损坏通常已经在那时完成.
Jac*_*cco 33
没有额外的安全性.
发布数据不会显示在历史记录和/或日志文件中,但如果数据应保持安全,则需要SSL.
否则,任何嗅探电线的人都可以读取您的数据.
And*_*ore 28
即使POST没有真正的安全利益GET,对于登录表单或任何其他具有相对敏感信息的表单,请确保您使用的POST是:
POSTed不会保存在用户的历史记录中.GET,它将在历史记录和URL栏中可见).此外,GET还有数据的理论限制.POST没有.
对于真正的敏感信息,请务必使用SSL(HTTPS)
Mih*_*șan 18
GET和POST中的任何一个本身都不比另一个"更安全",就像传真和电话中的任何一个都不比另一个"更安全"一样.提供了各种HTTP方法,以便您可以选择最适合您尝试解决的问题的方法.对于幂等查询,GET更适合,而POST更适合"动作"查询,但如果您不了解正在维护的应用程序的安全体系结构,您可以轻松地使用它们中的任何一个.
如果你阅读第9章:HTTP/1.1 RFC的方法定义,以便全面了解最初设想的GET和POST是什么意思,这可能是最好的.
ruq*_*uay 15
不应该从安全性的角度来看待GET和POST之间的区别,而是要考虑他们对服务器的意图.GET永远不应该更改服务器上的数据 - 至少不是在日志中 - 但POST可以创建新资源.
好的代理不会缓存POST数据,但是它们可能会缓存来自URL的GET数据,所以你可以说POST应该更安全.但POST数据仍然可用于不能很好地播放的代理.
正如许多答案所述,唯一可靠的赌注是通过SSL.
但请确保GET方法不提交任何更改,例如删除数据库行等.
我通常的选择方法是这样的:
两者都没有神奇地赋予请求安全性,但是GET意味着一些副作用通常会阻止它的安全性.
GET URL显示在浏览器历史记录和Web服务器日志中.出于这个原因,它们永远不应该用于登录表单和信用卡号码之类的东西.
但是,仅发布该数据也不会使其安全.为此你想要SSL.当通过HTTP使用时,GET和POST都通过线路以明文形式发送数据.
POST数据还有其他很好的理由 - 比如能够提交无限量的数据,或隐藏临时用户的参数.
缺点是用户无法为通过POST发送的查询的结果添加书签.为此,你需要GET.
考虑这种情况:一个草率的API接受GET请求,例如:
http://www.example.com/api?apikey=abcdef123456&action=deleteCategory&id=1
Run Code Online (Sandbox Code Playgroud)
在某些设置中,当您请求此URL并且有关于请求的错误/警告时,整行将记录在日志文件中.更糟糕的是:如果您忘记在生产服务器中禁用错误消息,则此信息仅在浏览器中以简单方式显示!现在,您刚刚将API密钥提供给所有人.
不幸的是,有真正的API以这种方式工作.
我不喜欢在日志中包含一些敏感信息或在浏览器中显示它们的想法.POST和GET不一样.在适当的地方使用.
| 归档时间: |
|
| 查看次数: |
146339 次 |
| 最近记录: |