代码之家  ›  专栏  ›  技术社区  ›  Vyrotek

ASP.NET MVC中带有querystring值的安全性

  •  5
  • Vyrotek  · 技术社区  · 17 年前

    如何正确地确保用户不会篡改querystring值或操作url值?例如,您的CommentController上可能有一个“删除注释”操作,该操作使用一个CommentID。要删除ID为3的注释,操作URL可能看起来像/comments/delete/3。

    现在显然你不希望任何人能够删除评论3。通常情况下,评论的所有者或管理员有权这样做。我看到这种安全措施有不同的执行方式,想知道你们中的一些人是如何执行的。

    是否进行多个数据库调用以检索注释并检查注释的作者是否与调用删除操作的用户匹配?

    相反,是否将commentid和userid传递给执行删除操作的存储过程,并在userid和commentid等于传入值的情况下执行删除操作?

    是否最好加密查询字符串值?

    7 回复  |  直到 12 年前
        1
  •  17
  •   yfeldblum    17 年前

    你没有。

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

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

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

        2
  •  9
  •   Ed DeGagne    12 年前

    加密和解密查询参数是一个很简单的过程,这里有一些很好的例子说明如何在stackoverflow上使用httpmodule。

    “你不可以”、“你不可以”或“这不容易”是当今时代不可接受的回答…

        3
  •  3
  •   rciq    17 年前

    vyrotek:输入方法不重要。GET、POST、加密/模糊GET-没有真正的区别。无论应用程序接收命令的方式如何,要执行管理操作,必须确保发出命令的用户可以执行其所需的操作。权限检查必须在收到命令之后和执行命令之前进行。否则根本就没有安全保障。

        4
  •  2
  •   Arnold Zokas    17 年前

    考虑使用斯蒂芬·沃尔特文章中概述的技术 Tip #46 – Don’t use Delete Links because they create Security Holes 使用[AcceptVerbs(httpverbs.delete)]

        5
  •  1
  •   Schotime    17 年前

    您也可以使用如下所示的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/

        6
  •  0
  •   James Curran    17 年前

    我已经做了一些很有趣的事情,比如接受querystring,压缩它,base64或者仅仅十六进制编码,这样“commentid=4&userid=12345”就变成了“code=1a2b23de12769”。

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

        7
  •  0
  •   Nat    17 年前

    你不容易做到这一点。

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

    一切都很好,直到他们开始搜索爬行的内部网。

    哦,再见,数据。

    我建议您使用一种解决方案,这样您就不会对任何不希望编辑的内容使用查询字符串。