0

用户故事:

我是 Web 应用程序的管理员,我需要删除 Web 应用程序的另一个用户。我从用户列表中选择用户,然后可以从后续页面中删除用户。

当前(错误)解决方案:

现在我将要删除的用户的 ID/主键存储在隐藏的表单元素中(可怕,可怕,可怕,我知道 - 有人可以使用元素检查器删除任何用户......)。这种事情的最佳做法是什么?我是否将要删除的用户的 ID/主键保存为 $_SESSION 变量?一块饼干?一个散列 URL 并用 $_GET 抓取它?

编辑

有不同的用户组,由不同的管理员管理。A组的管理员不知道B组(及其用户)等。所有用户都在一个表中,所有用户都可以在任意数量的组中。我需要保护用户 ID 并脱离 DOM,以便有人无法更改它并删除他们没有管辖权的用户。

4

3 回答 3

1

没有必要使用$_SESSION这样的任务:会话是用于维护页面之间的状态,这里没有这样的情况。

处理资源 [例如用户] 时的最佳实践是设置RESTful 环境

虽然您还没有设置这样的系统,但您仍然可以利用 HTTP 请求$_GET$_POSTphp 数组:

<form action="delete.php" method ="post">
    <select id="user" name="user">
        <option value="1">Joh Doe</option>
        <option value="2">Jane Doe</option>
        <option value="3">Dun No</option>
    </select>
    <input type="submit" value="Submit"/>
</form>

当您提交此表单时,您向 发出POST请求delete.php,该$_POST数组将包含一个user具有选定值的键 - 然后您可以使用 PDO 准备语句通过该键删除用户。

反对拒绝删除权限,如果登录的用户没有足够的权限,您必须设置脚本以阻止请求 - 这是您必须正确设置的另一层,所以我建议您使用框架 [如Symfony或 YII] 所以您可以利用他们的安全组件。

隐藏字段的想法是在CSRF 保护的背后,所以它根本不是毫无意义的——是的,它依赖于会话。

于 2012-08-29T21:27:34.853 回答
1

我只是确保您在删除用户时验证用户权限。

编写例如函数 isUser() 来检查会话/cookies 中的数据并在您登录时返回 true 是很好的,那么您还可以访问 var 来声明您作为用户的权利。此外,当您检查您的数据是否正常并且您实际上使用正确的数据登录时,您可以制作 $user_rights var,其中包含站点访问级别(等)。

然后简单地说:

if(isUser() and $user_rights == 9) { /* code here, 9 is e.g. admin right */ } 
于 2012-08-29T21:30:33.380 回答
0

会话没有错。会话用于临时存储在 1 页以上。

于 2012-08-29T21:22:22.313 回答