[英]Security with QueryString values in Asp.net MVC
如何正确确保用户不会篡改查询字符串值或操作URL值? 例如,您可能在CommentController上有一个Delete Comment操作,它采用CommentID。 操作URL可能看起来像/ Comments / Delete / 3以删除ID为3的注释。
现在显然你不希望任何人能够删除评论3.通常在评论的所有者或管理员有权这样做。 我已经看到这种安全性强制执行不同的方式,并想知道你们中的一些人是如何做到这一点的。
您是否进行多个数据库调用以检索注释并检查注释的作者是否与调用删除操作的用户匹配?
您是否将CommentID和UserID向下传递给执行删除的存储过程并执行删除操作,其中UserID和CommentID等于传入的值?
加密查询字符串值是否更好?
你没有。
它是编程的基本规则,尤其是在当今时代, 您永远不会相信来自用户,浏览器,客户端等的任何输入。
它也是编程的基本规则,您可能不应该尝试自己实现加密和安全性,除非您真的知道自己在做什么。 即使你确实知道自己在做什么,你也只能领先于tard-crrackers一步。 聪明的人仍然会嘲笑你。
执行额外查询以确保登录用户具有正确的权限集。 这将使每个人的生活变得更加简单。
Enrypting和解密查询参数是一个简单的过程,并且有一些很好的例子,说明如何在StackOverflow上使用HttpModule这样做。
“你不要”,“你不能”或“这不容易”在这个时代根本不是可以接受的回应......
Vyrotek:输入法并不重要。 GET,POST,加密/混淆GET - 没有真正的区别。 无论您的应用程序接收命令的方式如何,执行管理操作都必须确保允许发布用户执行他想要的操作。 必须在收到命令后执行权限检查,然后执行权限检查。 否则它根本没有安全性。
考虑使用Stephen Walther的文章提示#46中概述的技术- 不要使用删除链接,因为它们会创建使用[AcceptVerbs(HttpVerbs.Delete)]的安全漏洞
您还可以通过使用Accept Verbs属性仅允许Post请求删除控制器操作,如下所示。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(int? id)
{
//Delete
}
然后你也可以使用这里讨论的防伪令牌:
我做了一些时髦的东西,取查询字符串,压缩它,Base64或只是十六进制编码,所以“commentid = 4&userid = 12345”变成“code = 1a2b23de12769”
它基本上是“通过默默无闻的安全”,但它确实为试图破解该网站的人做了很多工作。
你不能轻易做到这一点。
我对使用动作网址进行删除的网站有着美好的回忆。
一切都很好,直到他们开始搜索爬网内网。
哎呀,再见数据。
我建议一个解决方案,你不要使用查询字符串来做任何你不想编辑的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.