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