您没有提供更高的安全性,因为通过 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 的保护,攻击者仍然可以使用受害者凭据执行操作。攻击者看不到服务器响应,因为它会被传输到受害者的浏览器,但损坏通常在那个时候已经造成。