当前位置:  开发笔记 > 编程语言 > 正文

GET或POST比另一个更安全吗?

如何解决《GET或POST比另一个更安全吗?》经验,为你挑选了11个好方法。

将HTTP GET与HTTP POST进行比较时,从安全角度来看有何不同?其中一个选择本身比另一个更安全吗?如果是这样,为什么?

我意识到POST不会暴露关于URL的信息,但是它是否有任何实际价值,还是仅通过默默无闻的安全性?当担心安全问题时,我是否应该更喜欢POST?

编辑:
通过HTTPS,POST数据被编码,但是第三方可以嗅探URL吗?另外,我正在处理JSP; 在使用JSP或类似框架时,最好的做法是避免将敏感数据放在POST或GET中并使用服务器端代码处理敏感信息吗?



1> John Gietzen..:

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响应可以使用不可缓存的方式.

HTTP"Referer"

如果用户从响应GET请求而服务的页面导航到第三方网站,则该第三方网站可以看到所有GET请求参数.

属于"向第三方显示请求参数"的类别,其严重性取决于这些参数中存在的内容.POST请求自然不受此限制,但是为了利用GET请求,黑客需要将自己网站的链接插入到服务器的响应中.

浏览历史记录

这与"代理日志"参数非常相似:GET请求与其参数一起存储在浏览器历史记录中.如果攻击者可以物理访问机器,则可以轻松获取这些内容.

浏览器刷新操作

一旦用户点击"刷新",浏览器将重试GET请求.关机后恢复标签时可能会这样做.因此,任何行动(例如付款)都将在没有警告的情况下重复.

浏览器不会在没有警告的情况下重试POST请求.

这是仅使用POST请求来更改数据的一个很好的理由,但与恶意行为无关,因此也与安全性无关.

所以我该怎么做?

仅使用POST请求更改数据,主要是出于与安全无关的原因.

仅对登录表单使用POST请求; 否则会引入攻击向量.

如果您的网站执行敏感操作,您确实需要知道他们正在做什么的人,因为这不能在单个答案中涵盖.您需要使用HTTPS,HSTS,CSP,缓解SQL注入,脚本注入(XSS),CSRF以及可能特定于您的平台的大量其他内容(例如各种框架中的批量分配漏洞:ASP.NET MVC,Ruby on Rails等).没有任何一件事能够区分"安全"(不可利用)和"不安全".


通过HTTPS,POST数据被编码,但是第三方可以嗅探URL吗?

不,他们不能被嗤之以鼻.但URL将存储在浏览器历史记录中.

可以公平地说,最佳做法是避免将敏感数据放在POST或GET中,并使用服务器端代码来处理敏感信息吗?

取决于它是多么敏感,或者更具体地说,取决于它的方式.显然客户会看到它.任何有物理访问客户端计算机的人都会看到它.客户端可以在发送给您时欺骗它.如果那些问题然后是,请将敏感数据保留在服务器上,不要让它离开.


嗯,CSRF就像POST一样可行.
不,你必须让其他人有权限键入它,而不是一个将由浏览器静默提取的GET.考虑到每个POST表单都应该使用可验证的源哈希来保护,并且没有这样的GET链接方法,你的观点是愚蠢的.
使用POST over GET不会阻止任何类型的CSRF.它只是让它们更容易做,因为它更容易让人们去一个允许来自网址的图片的随机网站,而不是去你控制的网站(足够有javascript).做`
<输入类型="隐藏"name ="id"value ="12"> `通过单击链接(包含该html)自动提交帖子并不是很难
好吧,你可以为你的所有GET请求添加一个哈希,就像你将它们添加到POST表单一样...但你仍然不应该使用GET来修改数据.
@Lotus Notes,它稍微困难一些,但你不需要任何类型的XSS.POST请求一直在各地发送,不要忘记CSRF可以来自*any*网站,不包括XSS.
我不能相信没有人提起这件事,直到我刚刚做了,POST没有记录默认,得到记录,因此,POST
2> stephenbayer..:

就安全性而言,它们本质上是相同的.虽然POST不会通过URL公开信息,但它在客户端和服务器之间的实际网络通信中公开的信息与GET一样多.如果您需要传递敏感信息,您的第一道防线是使用安全HTTP传递它.

GET或查询字符串帖子非常适用于为特定项目添加书签或协助搜索引擎优化和索引项目所需的信息.

POST适用于用于提交一次性数据的标准表单.我不会使用GET发布实际表单,除非您希望允许用户将查询保存在书签中的搜索表单中,或者沿着这些行显示.


它只隐藏在最天真的意义上
URL中的查询字符串的可见性(和缓存)以及地址框明显*不太安全.没有绝对的安全性,所以安全程度是相关的.
是的,但你也可以说键盘是不安全的,因为当你输入密码时,有人可能会看着你的肩膀.通过默默无闻的安全性与完全没有安全性之间的差别很小.
如果你使用帖子,它甚至会暴露出来.在你的情况下,帖子会更安全一些.但是说真的..我可以整天改变post变量,就像获取变量一样简单.甚至可以查看和修改Cookie.永远不要依赖您网站以任何形式或形式发送的信息.您需要的安全性越高,您应该拥有的验证方法就越多.
需要注意的是,对于GET,位置栏中显示的URL可以显示将在POST中隐藏的数据.
@RocketR POST和GET只是动词,你可以在HTTP请求中应用一些动词.区别主要是语义.GET用于获取信息,而POST用于发送新信息,PUT用于更新信息.那就是设计理念,但人们会使用他们想要的任何动词.POST传输并不比GET更安全,它在不同的OSI层中处理安全性.认为GET和POST之间的安全性存在差异是危险的.
@Night Shade.如何在显示订单之前验证订单属于用户?如果用户"足够聪明"(阅读,如果他们可以安装任何允许你随意修改http请求的大量浏览器插件),POST不会给你买任何东西.

3> Incognito..:

您没有提供更高的安全性,因为变量是通过HTTP POST发送的,而不是通过HTTP GET发送的变量.

HTTP/1.1为我们提供了一堆发送请求的方法:

OPTIONS

得到

POST

删除

跟踪

CONNECT

让我们假设你有使用GET的以下HTML文档:




    User: 
Password:

你的浏览器会问什么?它问这个:

 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

现在让我们假装我们将该请求方法更改为POST:

 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

这些HTTP请求的两个是:

没有加密

包含在两个示例中

可以被evesdroped,并受到MITM攻击.

由第三方和脚本机器人轻松复制.

许多浏览器不支持POST/GET以外的HTTP方法.

许多浏览器行为存储页面地址,但这并不意味着您可以忽略任何其他问题.

所以具体来说:

一个人本来就比另一个人更安全吗?我意识到POST不会暴露关于URL的信息,但是它是否有任何实际价值,或者只是通过默默无闻的安全性?这里的最佳做法是什么?

这是正确的,因为您用来说HTTP的软件倾向于使用一种方法存储请求变量而不是另一种方法只会阻止某人查看您的浏览器历史记录或其他一些认为他们理解h4x0r1ng的10岁儿童的天真攻击或检查历史记录存储的脚本.如果你有一个可以检查你的历史存储的脚本,你可以很容易地检查你的网络流量,所以通过默默无闻的整个安全只是为脚本小子和嫉妒的女朋友提供默默无闻.

通过https,POST数据被编码,但可能被第三方嗅探?

以下是SSL的工作原理.还记得上面发过的那两个请求吗?以下是他们在SSL中的样子:(我将页面更改为https://encrypted.google.com/,因为example.com不响应SSL).

通过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

通过SSL获取

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

(注意:我将HEX转换为ASCII,其中一些显然不能显示)

整个HTTP会话都是加密的,唯一可见的通信部分位于TCP/IP层(即IP地址和连接端口信息).

所以,让我在这里做一个大胆的声明.与一个HTTP方法相比,您的网站没有提供更高的安全性,全世界的黑客和新手都知道如何做我刚刚在这里演示的内容.如果您需要安全性,请使用SSL.浏览器倾向于存储历史记录,RFC2616 9.1.1推荐不使用GET执行操作,但认为POST提供安全性是完全错误的.

POST唯一的安全措施是什么?通过浏览器历史记录保护您免受嫉妒.而已.世界其他地方都会登录您的帐户,嘲笑您.

为了进一步说明为什么POST不安全,Facebook会在整个地方使用POST请求,那么FireSheep等软件如何存在呢?

请注意,即使您使用HTTPS并且您的站点不包含XSS漏洞,您也可能会受到CSRF的攻击.简而言之,此攻击情形假定受害者(您的站点或服务的用户)已经登录并拥有适当的cookie,然后请求受害者的浏览器对您的(据称是安全的)站点执行某些操作.如果您没有针对CSRF的保护,攻击者仍然可以使用受害者凭据执行操作.攻击者无法看到服务器响应,因为它将被转移到受害者的浏览器,但损坏通常已经在那时完成.



4> Jacco..:

没有额外的安全性.

发布数据不会显示在历史记录和/或日志文件中,但如果数据应保持安全,则需要SSL.
否则,任何嗅探电线的人都可以读取您的数据.


GET信息只能在SSL隧道的开头和结尾看到
HTTP over SSL/TLS(正确实现)允许攻击者嗅探线路(或主动篡改)只能看到两件事 - 目的地的IP地址和双向数据量.
如果你通过SSL获取URL,第三方将无法看到URL,因此安全性是相同的

5> Andrew Moore..:

即使POST没有真正的安全利益GET,对于登录表单或任何其他具有相对敏感信息的表单,请确保您使用的POST是:

    信息POSTed不会保存在用户的历史记录中.

    表单中发送的敏感信息(密码等)稍后将在URL栏中显示(通过使用GET,它将在历史记录和URL栏中可见).

此外,GET还有数据的理论限制.POST没有.

对于真正的敏感信息,请务必使用SSL(HTTPS)



6> Mihai Limbăș..:

GET和POST中的任何一个本身都不比另一个"更安全",就像传真和电话中的任何一个都不比另一个"更安全"一样.提供了各种HTTP方法,以便您可以选择最适合您尝试解决的问题的方法.对于幂等查询,GET更适合,而POST更适合"动作"查询,但如果您不了解正在维护的应用程序的安全体系结构,您可以轻松地使用它们中的任何一个.

如果你阅读第9章:HTTP/1.1 RFC的方法定义,以便全面了解最初设想的GET和POST是什么意思,这可能是最好的.



7> ruquay..:

不应该从安全性的角度来看待GET和POST之间的区别,而是要考虑他们对服务器的意图.GET永远不应该更改服务器上的数据 - 至少不是在日志中 - 但POST可以创建新资源.

好的代理不会缓存POST数据,但是它们可能会缓存来自URL的GET数据,所以你可以说POST应该更安全.但POST数据仍然可用于不能很好地播放的代理.

正如许多答案所述,唯一可靠的赌注是通过SSL.

但请确保GET方法不提交任何更改,例如删除数据库行等.



8> Ross..:

我通常的选择方法是这样的:

GET为将物品取出后通过URL

例如,搜索应该是GET所以你可以稍后进行search.php?s = XXX

POST发送的项目

这是相对不可见的,与GET相关并且难以发送,但数据仍然可以通过cURL发送.


所以一个假帖子需要记事本和5分钟的时间......并不是真的难得多.我使用记事本为不存在的电话系统添加功能.我能够为系统创建一个管理表单的副本,这样我就可以将命令分配给供应商所关注的"不可能"的按钮.

9> Daniel Silve..:

这与安全性无关,但是...... 浏览器不会缓存POST请求.



10> edebill..:

两者都没有神奇地赋予请求安全性,但是GET意味着一些副作用通常会阻止它的安全性.

GET URL显示在浏览器历史记录和Web服务器日志中.出于这个原因,它们永远不应该用于登录表单和信用卡号码之类的东西.

但是,仅发布该数据也不会使其安全.为此你想要SSL.当通过HTTP使用时,GET和POST都通过线路以明文形式发送数据.

POST数据还有其他很好的理由 - 比如能够提交无限量的数据,或隐藏临时用户的参数.

缺点是用户无法为通过POST发送的查询的结果添加书签.为此,你需要GET.



11> Halil Özgür..:

考虑这种情况:一个草率的API接受GET请求,例如:

http://www.example.com/api?apikey=abcdef123456&action=deleteCategory&id=1

在某些设置中,当您请求此URL并且有关于请求的错误/警告时,整行将记录在日志文件中.更糟糕的是:如果您忘记在生产服务器中禁用错误​​消息,则此信息仅在浏览器中以简单方式显示!现在,您刚刚将API密钥提供给所有人.

不幸的是,有真正的API以这种方式工作.

我不喜欢在日志中包含一些敏感信息或在浏览器中显示它们的想法.POST和GET不一样.在适当的地方使用.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有