0

我了解使用 http GET 删除数据是一个安全漏洞。通常从链接调用删除也是一个坏主意吗?我专门指的是一个 asp.net mvc actionlink,它将 http 方法指定为 POST。

@Ajax.ActionLink("Delete",
"DeleteNote", new { noteid = Model.noteid },
new AjaxOptions
{
    Confirm = "Delete?",
    HttpMethod = "POST",
    OnSuccess = "postmessage('note_Deleted_" + Model.noteid + "')"
})
4

3 回答 3

2

使用 HTTP GET 并不是一个安全漏洞,但对于 RESTful API 来说可能被认为是糟糕的设计。约定是使用 HTTP DELETE 删除资源。安全漏洞是如果您的 API 不支持任何身份验证/授权,无论是 GET、DELETE、POST 还是 PUT。然后,任何拥有网络浏览器或 Fiddler 等工具的人都可以操作他们不应该访问的数据。看看这篇描述如何使用定制的 Authorize 属性来保护 Web API 的文章

您仍然可以使用链接来调用您的 API,但不要使用直接链接来定义指向要删除的 URL 的 href。而是使用 id 像这样定义你的锚。

<a href="#" id="aDeleteNote">Delete</a>

然后定义一个单击事件,该事件调用一个 Javascript 函数,该函数对您的 API 进行安全的 ajax 调用,如前面提到的文章中所述。

$('aDeleteNote').click(DeleteNoteFunc);

如果您想使用 Razor 指定用于标识要删除的内容的noteid ,那么您可以将其放在隐藏字段中,我们是DeleteNoteFunc可以访问的 Javascript 变量。

于 2013-11-05T19:14:17.537 回答
2

您在这里谈到的是一个名为Cross Site Request Forgery的漏洞。

一个简单的例子如下。

  1. 您的网站上有一个 GET 链接,例如“ www.example.com/notes/delete/232
  2. 用户登录到您的网站,有权删除注释 232。
  3. 用户收到来自攻击者的电子邮件,诱使他们访问攻击者的网站。
  4. 用户在邮件中访问网站,但其中一个图片标签定义如下:“ <img src="http://www.example.com/notes/delete/232" width="0" height="0" />

这会导致浏览器向您的网站发出 HTTP 请求,发送正确的身份验证 cookie,这将导致便笺在用户不知情的情况下被删除。

现在这不是 GET 本身的漏洞,但它是不应该使用 GET 等方法在服务器上进行更改的原因之一。

是的,您是正确的,您应该为此使用 POST。POST 仍然容易受到与上述类似的攻击,但攻击者要么需要创建标准 HTML 表单来 POST 数据,要么必须通过 AJAX 创建 POST。如果您传递 HTTP 标头“ X-Requested-With: XMLHttpRequest”并在您的服务器方法中进行检查,这将有助于防止这种攻击,因为此标头无法添加到跨域请求中。

如果您想进一步保护这一点,那么您应该实现同步器令牌模式,它将验证令牌作为 POST 请求的一部分,以确保请求来自您自己的站点。

于 2013-11-06T09:35:09.377 回答
1

我不知道我是否会将从 GET 请求中删除数据描述为必然存在安全漏洞(前提是您的应用程序实现了适当的安全性),但正如您所知,这通常不是一个好主意。

如果你有删除链接,你绝对应该在它们上面加上nofollow,但我不认为删除数据的链接本质上是坏的。即使您的标记中没有链接,您最终仍然会通过表单提交或 ajax 向将删除某些内容的 url 发出 http 请求。

于 2013-11-05T18:13:06.807 回答