当我编辑用户的帖子时,我使用以下网址:
../post/edit/3 //If the id of the post is 3 for example
Run Code Online (Sandbox Code Playgroud)
例如/post/edit/5,为避免用户故意修改网址,我使用以下逻辑确保用户在没有权限时不编辑帖子:
if (//user is allowed to edit post){
//edit post
}
else {
throw new AccessDeniedException('You do not have the permission to edit this post');
}
Run Code Online (Sandbox Code Playgroud)
这是编辑帖子时使用的一般方法吗?有没有办法做一些更干净的东西,以便用户不能使用网址中的帖子的ID?
我越是想到它,我就越发现我从未在一个关注安全性的网站上看到过像这样的网址中的id.所以,我同意我们仍然可以使用id并检查用户是否可以显示/看到此ID,但用户仍然可以做太多.散列id不是更好,允许我们使用任何可用的算法生成新的加密ID:
<?php
echo hash('md5', 'id_to_edit');
?>
Run Code Online (Sandbox Code Playgroud)
在URL中保护id的标准方法是什么?一般来说,在网址中显示id这样的信息是个好主意吗?
特殊情况可能需要特殊措施,但在典型情况下,所有必要的是:
很多网站都与您最初描述的方式类似.例如,WordPress的URL就像https://example.com/wp-admin/post.php?post=112&action=edit.显然,一个好奇的用户可以选择编辑该post=112部件.
因此,您可能会考虑的一个标准是:"我是否需要比WordPress更关注安全性和隐私性?"
例如,如果您不希望人们查看日志文件以了解哪些IP地址正在编辑哪些帖子,那么您有几个选项.每种方法都有权衡,所以最好的方法取决于你最关心的问题.
例如:
第一种方法的一个优点是人们可以使用书签返回页面.你可能不希望这样.或者你可以.取决于您的应用程序.
第二种方法的一个优点是(例如)Google Analytics不会透露是否正在反复访问/编辑一个帖子ID,或者是否正在访问/编辑许多帖子ID.这可能对您很重要,具体取决于此类信息是否可能告诉某人某些内容以及谁有权访问您的Google Analytics内容.或者它根本不重要.
还有很多其他可能的考虑因素,例如性能.
顺便说一句,如果您使用MD5,请务必在输入中包含攻击者不知道的内容.否则,攻击者通过查找表反转已发现的哈希并为顺序post ID生成更多合法哈希将是微不足道的.在PHP中,您需要执行以下操作:
hash('md5', $some_hard_to_guess_secret_string . $data_you_wish_to_hash);
Run Code Online (Sandbox Code Playgroud)
没有一种适用于所有情况的最佳实践.但在典型情况下,没有必要对post id值进行哈希处理,甚至不需要通过POST发送它.在典型情况下,请务必使用SSL(以便会话不会被劫持)并在执行任何操作之前检查用户权限,您可能会很高兴.