【问题标题】:Security with QueryString values in Asp.net MVCAsp.net MVC 中 QueryString 值的安全性
【发布时间】:2008-10-29 02:03:05
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: asp.net asp.net-mvc security query-string


    【解决方案1】:

    你没有。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          考虑使用 Stephen Walther 的文章 Tip #46 – Don’t use Delete Links because they create Security Holes 中概述的技术,该技术使用 [AcceptVerbs(HttpVerbs.Delete)]

          【讨论】:

            【解决方案5】:

            您还可以使用 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/

            【讨论】:

            • 在 MVC 2.0 中你也可以调用 Http 删除。只需将 [HttpDelete] 而不是 [HttpPost] 放在您的操作上,然后使用删除协议而不是 post 使表单提交。
            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

              你不能轻易做到这一点。

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

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

              哎呀,再见数据。

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

              【讨论】:

              • 那你建议我如何编辑/删除东西呢?请记住,我使用的是 Asp.net MVC
              • 您应该发布到您的控制器方法以调用删除 - 并在执行删除之前验证请求凭据(cookie/用户名/密码/其他)。请参阅@Schotime 的帖子。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-12
              • 1970-01-01
              相关资源
              最近更新 更多