0

我正在用 PHP 和 MySQL 为自己构建一个实验站点。

我正在添加一个更新记录部分,我的登录用户可以在其中更新表中的某些记录。

要更新一条记录,我通过 URL 传递记录 id 并使用它作为我的主键来更新它,但是我的问题(我很清楚这是一个巨大的安全问题)是任何用户都可以更改 url 变量并更新任何其他人的信息。

防止这种情况的最佳方法是什么?

4

5 回答 5

3

很简单,您的 Web 应用程序需要知道谁的信息是谁的信息,并在没有适当权限的用户尝试执行类似操作时返回错误页面。

或者,如果您想要非常安全而不是返回未授权页面(这将允许人们找出有关您的数据库的信息),只需返回一个通用错误页面,无论 URL 是否有效。

编辑:

正如人们在下面指出的那样,您可以通过基本的 PHP 会话管理来判断用户是谁,但我假设您已经知道如何告诉发送请求的用户是谁。

于 2013-05-07T20:39:56.730 回答
1

一种简单的方法是首先创建一个会话变量来保存登录的用户 ID(和用户名,以及其他...)

<?php
     session_start();
     //store session data
     $_SESSION['userid']=$auth->userid();
?>

然后创建一个全局加载的函数或作为身份验证类的一部分,该函数将使用当前登录用户的用户 ID 检查它是否与数据库中的用户 ID 匹配。

 function permissible($userid) {
         if ($userid != $SESSION['userid']) {
              header('Location: http://www.404.com/'); //redirect to suitable location
         }
    }

现在,在 php 文件顶部的代码中像这样使用

permissible($GET['userid']);

这只是一个例子。请记住用正确的变量替换变量。

于 2013-05-07T20:53:47.503 回答
0

典型的方法是在登录时使用会话变量。例如,如果您有一个更新成员行的脚本,例如:updatemember.php?id=8

您修改此脚本,以便从会话中获取 id,而不是从 $_GET['id'] 获取 id。

$id = $_SESSION['user_id'];

当然,这假设 $_SESSION['user_id'] 在用户首次通过身份验证并登录时已填充,但这是一种相当标准的技术,用户的基本信息从数据库中读取并存储在一个或成功登录后的更多会话变量。

总之,使用 php 会话解决了理解“这个用户现在正在尝试执行此操作的是谁?”的问题。

于 2013-05-07T20:46:20.677 回答
0

It depends on what the user edits, for example, if he edits his own data, you can do smth like the people above me have suggested, or even more, don't post/get his id,just do "update data . . . . . . . . where userid=$_SESSION['user_id'], but if he edit some other information, like his blog post for example, you will have to select the edit blog post, and then check to see if he is the poster (owner, what ever you want to call it), and then if $poster_id==$current_logged_in_user_id edit, else redirect, throw error ot what ever, just don't edit the blog post (in this case)

于 2013-05-07T21:38:47.027 回答
-1

为了保护您的网站免遭他人滥用 url 中的 id 变量,您必须只允许注册用户进行更新操作,您还可以创建一个历史表,您将在其中保存行的旧状态并提及谁更改了它以及何时,另一种方法是创建规则和权限,其中用户只能更新他们插入的数据,并且您可以添加管理员角色,该角色可以更新属于每个人的数据。

为了保护您的网站免受 sql 注入,您可能需要使用准备好的语句:PDO 准备好的语句是否足以防止 SQL 注入?

于 2013-05-07T20:42:49.623 回答