2

Web 应用程序的当前趋势似乎是对所有内容都使用 GET 请求。具体来说,使用描述服务、命令及其参数的 RESTful URL。几个月前,Jeff Atwood 发布了 XSS 的危险。他展示了即使允许用户在您的网站上发布像“img”标签这样看似无害的东西也可能导致 XSS 漏洞。原因是浏览器会盲目地请求“src”属性中的 url,这可能会做一些令人讨厌的事情,比如注销用户,或者更不祥的事情。

十年前我第一次开始做 Web 开发时,传统的看法是对于表单总是偏爱 POST 而不是 GET,并且服务器端的应用程序需要 POST 来提交表单,正是这个原因。浏览器一直发送 GET 请求(就像前面提到的“img”标签示例),但它们只在某些情况下发送 POST 请求(特别是“method”属性设置为 POST 的表单)。通过要求 POST,您似乎可以消除大部分 XSS 攻击。这是偏爱他们的正当理由吗?

4

6 回答 6

6

从什么时候开始 REST 暗示对所有事情都使用 GET?最后我查了一下,意思正好相反。使用 GET 请求获取资源,使用 POST 将资源发布到服务器。

REST 的关键点之一是使用最适合您尝试执行的操作的 HTTP 请求。GET 应该用于它的用途:从服务器获取数据,而不更改服务器上的状态。它不应该用于更新服务器上的资源。POST 或 PUT 就是为此而设计的。

以预期的方式使用 HTTP 既有助于避免一些(但远非全部)XSS 攻击,还可以使浏览器在与您的站点通信时表现得更好。浏览器期望可以安全地重复 GET 请求,而无需用户确认。例如,如果您刷新页面或使用后退/前进按钮,它就是这样做的。POST 预计会更改服务器上的状态,因此浏览器通常会在重复 POST 请求之前要求确认。

于 2009-05-07T01:19:19.513 回答
2

您将普通 Ajax 调用与 REST 调用混淆了。

Vanilla Ajax 调用使用 GET 或 POST,如何处理它们完全取决于您。

REST 使用动词 GET、HEAD、POST、PUT、DELETE

HTTP VERB   REST/CRUD
POST         Create
GET          Read
PUT          Update, Create
DELETE     Delete

当您担心 CSRF 而不是 XSS 时,您想使用 POST over GET。

一个好的经验法则是始终使用 POST,并且仅在您绝对确定要与其他站点共享该数据或数据不敏感时才使用 GET。

但仅使用 POST 并不能 100% 保护您。

XSS 和 CSRF 都非常重要,你应该检查你的应用程序,但它们是两种截然不同的野兽。

CSRF:

维基百科

OWASP

跨站脚本:

OWASP

于 2009-05-07T01:18:24.803 回答
1

我认为您误解了 REST。重点不是更喜欢 GET 而不是 POST,重点是在请求不影响服务器上的数据的情况下使用 GET,在修改数据的情况下使用 POST。REST 就是正确使用可用的 HTTP 动词。

例如,搜索表单通常使用 GET,而 Create X 表单通常使用 POST。

于 2009-05-07T01:18:38.437 回答
0

在某些情况下,您应该使用 POST 而不是 GET,但避免XSS不是其中之一。也许您正在考虑XSRF,但即便如此,要求 POST 并不能真正保护您。事实上,REST 倡导者实际上会说您不应该只使用 GET,而应该使用 POST、PUT 和 DELETE 进行相应的“ CRUD ”操作。

为了避免XSS,请适当地转义和/或清除用户的内容。

为避免XSRF,在任何导致潜在危险的副作用的操作上都需要使用秘密令牌。(顺便说一句:在传递秘密令牌时避免使用 GET 请求是个好主意,因为这可能会导致它们在引用者中泄漏。)

尽可能对只读请求使用 GET 。(几乎只要查询可以放入 URL)

对写入请求使用 POST(或 PUT 或 DELETE,如果可行且合适) 。

于 2009-05-07T01:26:50.710 回答
0

XSS 不会被阻止;XSS 是用户让您以某种方式将他们的脚本输出给其他用户。这需要过滤。

XSRF 也不会停止;它需要添加某种一次性令牌,以确保有人只有在实际访问您的网站时才能访问您的网站(而不是从嵌入式 iframe 等发布)。

但是,POST 与 GET 确实可以防止网络加速器和抓取工具(例如 Google Bot)修改您的网站。他们只去 GET 链接,因此如果您不想删除您的网站(如 Daily WTF 帖子),请确保“删除此项目”不是 GET。;-)

更常见的是,这是语义和表单大小的问题。GET 不发布表单,因此仅限于您可以在 URL 中输入的任何内容,这并不多。POST 允许任意数量的数据。PUT 和 DELETE 更多用于语义;它们都可以通过 POST 完成。

于 2009-05-07T02:00:05.873 回答
0

已经给出的答案确实回答了您的问题 - 不,防止 XSS 不是更喜欢 POST 而不是 GET 的正当理由。但是,如果您想对此进行演示,请查看WebScarabTamper Data之类的工具,它们对于测试您自己网站的漏洞非常有用。将代码注入 POST 请求就像注入 GET 一样容易。但是,即使没有这些工具,请注意,除非您在服务器端检查 POST 与 GET,否则使用 GET 发送参数很容易。只需将 ?parm1=value1&parm2=value2&etc 添加到 URL。

于 2009-05-07T02:16:47.627 回答