5

您如何正确确保用户不会篡改查询字符串值或操作 url 值?例如,您可能在您的 CommentController 上有一个 Delete Comment 操作,该操作采用 CommentID。操作 url 可能看起来像 /Comments/Delete/3 以删除 id 为 3 的评论。

现在显然您不希望任何人能够删除评论 3。通常在评论的所有者或管理员有权这样做。我已经看到这种安全性以不同的方式实施,并且想知道你们中的一些人是如何做到的。

您是否进行多次数据库调用以检索评论并检查评论的作者是否与调用删除操作的用户匹配?

您是否改为将 CommentID 和 UserID 传递给执行删除操作的存储过程并执行 Delete,其中 UserID 和 CommentID 等于传入的值?

加密查询字符串值更好吗?

4

7 回答 7

17

你没有。

这是编程的基本规则,尤其是在这个时代,你永远不要相信来自用户、浏览器、客户端等的任何输入。

除非你真的知道自己在做什么,否则你可能不应该尝试自己实现加密和安全性,这也是编程的一个基本规则。即使你知道你在做什么,你也只会比油炸机领先一步。聪明的人仍然会嘲笑你。

执行额外查询以确保登录用户具有正确的权限集。这将使每个人的生活变得更加简单。

于 2008-10-29T02:11:45.003 回答
11

加密和解密查询参数是一个简单的过程,在 StackOverflow 上有一些很好的例子来说明如何使用 HttpModule 来做到这一点。

“你不要”、“你不能”或“这不容易”在当今时代根本不是可接受的回答......

于 2011-06-30T21:27:30.040 回答
3

Vyrotek:输入法并不重要。GET、POST、加密/混淆的 GET - 没有真正的区别。无论您的应用程序以何种方式接收命令,要执行管理操作,它必须确保允许发出用户做他想做的事情。权限检查必须在收到命令之后和执行之前进行。否则根本就没有安全感。

于 2008-12-19T00:24:50.837 回答
2

考虑使用 Stephen Walther 的文章Tip #46 中概述的技术——不要使用删除链接,因为它们会创建使用 [AcceptVerbs(HttpVerbs.Delete)] 的安全漏洞

于 2009-03-08T23:58:20.247 回答
1

您还可以使用 Accept Verbs 属性仅允许 Post 请求删除控制器操作,如下所示。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(int? id)
{
    //Delete
}

然后,您还可以使用此处讨论的防伪令牌:

http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

于 2008-10-29T03:24:57.600 回答
0

我做了一些时髦的事情,获取查询字符串,压缩它,Base64 或者只是十六进制编码,所以“commentid=4&userid=12345”变成了“code=1a2b23de12769”

它基本上是“通过默默无闻的安全”,但它确实为试图破解网站的人做了很多工作。

于 2008-10-29T02:11:38.403 回答
0

你不能轻易做到这一点。

我对使用操作 URL 进行删除的网站有着美好的回忆。

一切都很好,直到他们开始在 Intranet 上进行搜索。

哎呀,再见数据。

我会推荐一个解决方案,您不要将查询字符串用于您不希望编辑的任何内容。

于 2008-10-29T02:12:04.863 回答