快速提问,在我的php网站上,用户会看到一个基于他的user_id的列表,从这个列表中他可以选择一个用户在浏览器中显示以下链接:
www.examplel.com/users/edituser/7
现在,如果我的用户将7改为6,他就可以查看和编辑其他用户的数据。
我如何防止这种情况发生
答案 0 :(得分:2)
这是基本的安全基础,特别称为授权。
您似乎已经拥有一个登录系统,所以您只需在加载URL时查找用户的设置,然后只允许他们加载页面(如果他们有访问权限)。您可以通过无限的方式在代码中实现该方法,但通常会使用某种角色或声明系统。
一些例子:
如何存储用户拥有的访问规则完全取决于您。它可以是该用户的数据库行中的一些额外列,也可以是用于复杂权限的多个表。这取决于您的应用程序需要什么。不要将授权设置存储在浏览器cookie中,该cookie应该只是加载页面时用于查找服务器上其他所有内容的用户ID的加密版本。
答案 1 :(得分:0)
将ID放在URL上意味着您正在使用GET请求作为在页面/ PHP类之间交换信息的手段。如果您希望在不允许他修改的情况下传递用户ID等信息,则应使用 $ _ POST 或 $ _ SESSION 来传递变量。
在这种情况下,当您拥有登录用户时, $ _ SESSION 对您来说就足够了,您可以存储大量信息,并从中提取数据你的 $ _ SESSION 数组而不是网址。如果您的登录方法成功存储用户ID,您可以这样做:
session_start();
echo 'Bem vindo à página #1';
$_SESSION['userId'] = '7'; //instead of 7 here, it would be the value corresponding to that user id
您可以在here中找到更多信息。
答案 2 :(得分:0)
您只需确保登录用户有权查看该页面。因此,无论您使用什么代码为用户提供页面列表,都需要稍微调整一下并放在编辑页面的顶部。然后,如果someoen试图编辑他们不应该的用户,你可以将他们发送到"错误"页面或他们有权访问的其他页面,如用户列表。
答案 3 :(得分:-1)
据我所知,你可以通过使用以下解决方案来避免这种情况:
1)使用登录/注销机制维护会话。如果特定用户只能访问此URL以外的任何用户登录。通过会话,外部人员无法访问此URL。
2)如果它非常重要的信息,如唯一ID,成员ID或客户端ID等。所以我建议不要使用作为GET参数。使用POST。
3)如果你真的只想这样走。你可以使用一些加密方法,如(base 64,url encode等),你也可以使用salt。请参阅此How to encrypt the $_GET data in php?