对于Web应用程序,预防XSS是否优先选择POST而不是GET?

时间:2009-05-07 01:10:35

标签: xss

Web应用程序的当前趋势似乎是对所有内容使用GET请求。具体来说,使用描述服务,命令及其参数的RESTful URL。几个月前,Jeff Atwood发布了XSS的危险性。他演示了甚至允许用户在您的网站上发布一些看似无害的“img”标签可能会导致XSS漏洞。原因是浏览器只是盲目地请求“src”属性中的url,这可能只会令人烦恼,例如将用户登录,或更糟糕的事情。

十年前,当我第一次开始进行Web开发时,传统的观点是始终支持POST而不是GET表单,并且服务器端的应用程序需要POST才能提交表单,正是出于这个原因。浏览器一直发送GET请求(如前面提到的“img”标签示例),但它们仅在某些情况下发送POST请求(具体地说,“method”属性设置为POST的表单)。通过要求POST,似乎可以消除大部分XSS攻击。这是否适合他们?

6 个答案:

答案 0 :(得分:5)

从什么时候开始,REST意味着将GET用于一切?最后我查了一下,这意味着恰恰相反。使用GET请求获取资源,并将发布一个POST发送到服务器。

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

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

答案 1 :(得分:2)

您将使用REST调用混淆了vanilla Ajax调用。

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时,您希望在GET上使用POST。

一个好的经验法则总是使用POST,如果您绝对确定要与其他网站共享该数据或者数据不敏感,则只使用GET。

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

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

CSRF:

Wikipedia

OWASP

XSS:

OWASP

答案 2 :(得分:2)

我认为你误解了REST。关键是不喜欢GET而不是POST,重点是使用GET,其中请求不会影响服务器上的数据,而POST则修改数据。 REST就是正确使用可用的HTTP谓词。

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

答案 3 :(得分:0)

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

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

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

尽可能将GET用于只读请求。 (几乎每当查询都适合URL时)

请求使用POST(或PUT或DELETE,如果可行且适当)。

答案 4 :(得分:0)

XSS不会停止; XSS是指用户以某种方式将其脚本输出给其他用户的时间。这需要过滤。

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

但是,POST与GET会阻止网络加速器和抓取工具(例如Google Bot)修改您的网站。他们只去GET链接,因此如果你不想删除你的网站(每日WTF帖子就这样),请确保'删除此项'不是GET。 ; - )

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

答案 5 :(得分:0)

已经给出的答案确实回答了你的问题 - 不,预防XSS不是优先于POST而不是GET的正当理由。但是,如果您想要演示此内容,请查看WebScarabTamper Data等工具,这些工具对于测试您自己网站的漏洞非常有用。将代码注入POST请求和将其插入GET一样容易。但是,即使没有这些工具,请注意,除非您检查POST与GET服务器端,否则使用GET简单地发送parms很容易。只需将“parm1 = value1& parm2 = value2& etc”添加到网址即可。