您没有提供更高的安全性,因为通过HTTP POST发送的变量比通过HTTP GET发送的变量要高。
HTTP / 1.1为我们提供了一堆发送请求的方法:
让我们假设您具有使用GET的以下HTML文档:
<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>
您的浏览器问什么?它问这个:
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请求都是:
- 未加密
- 包含在两个示例中
- 可以被窃听,并受到MITM攻击。
- 第三方和脚本机器人很容易复制。
除POST / GET外,许多浏览器不支持HTTP方法。
许多浏览器行为都会存储页面地址,但这并不意味着您可以忽略任何其他这些问题。
所以具体来说:
一个天生比另一个更安全吗?我意识到POST不会公开URL上的信息,但是其中有任何真正的价值还是仅仅是通过隐蔽性实现安全性?这里的最佳做法是什么?
这是正确的,因为您使用的使用HTTP的软件倾向于使用一种方法存储请求变量,而不能使用另一种方法存储,只能阻止某人查看您的浏览器历史记录或其他10岁的孩子认为自己懂h4x0r1ng的幼稚攻击,或检查您的历史记录存储区的脚本。如果您有一个可以检查历史存储的脚本,则可以很容易地检查您的网络流量,因此通过默默无闻的整个安全性只能为脚本小子和嫉妒的女友提供默默无闻的信息。
通过https可以对POST数据进行编码,但是URL是否可以被第三方监听?
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的防护,攻击者仍然可以使用受害者凭证执行操作。攻击者无法看到服务器的响应,因为它将被转移到受害者的浏览器中,但是通常情况下已经造成了损害。