php - 在数据库更新之前检查客户端是否更改了 ID

标签 php mysql server-side-validation

考虑以下示例: HTML 页面:

<input type="text" name="update_12" />

名称为“update_12”的输入框和新文本为:“Some another data”通过表单发送 到服务器端 PHP 脚本(比如 process.php)

数据库格式:

=====================
message_ID  Message
=====================
12         Some data
13         Another data

如果 PHP 脚本对输入名称进行爆炸:

foreach ($_POST as $key => $value) {
    if(strstr($key, "update_")){
        $required_id = explode('_',$key)[1];
        $query = "UPDATE <db_name> SET `Message`='".$_POST[$key]."' WHERE `message_id`='".$required_id."'";
    }
}

这会使用 message_ID 的新消息更新数据库:12

我是 PHP 的新手,正在探索 MySQL 中的基本数据存储、更新、检索和删除。

因为客户端可以更改输入字段的名称:“name”并发送另一个值进行更新。 例如:如果客户端打开firebug,将输入框的“name”字段更改为“update_13”,他的操作将覆盖另一个用户的Message。

我尝试通过尝试在 Facebook 中删除状态来对此进行研究。 通过对要删除的 POST 数据的初步观察,我可以看到一些重要的参数被发送以供删除:

impression_id=456ab622
profile_id=100005552221116
__user=100005552221116
story_fbid=540912345678911

对于帖子删除,关联的 ID 如下所示:story_fbid。 当我将其更改为可能是:540912345678912(最后一位更改) 然后单击删除,fb 需要一段时间并返回一条错误消息:无法完成此操作。在发送删除的 POST 请求(修改了 story_fbid)后,会出现此错误消息。 POST 请求的响应包含显示在模态窗口中的错误消息。

我可以想到一种方法,其中 ID 及其散列 (MD5/SHA1/SHA2) 存储在数据库中,在收到 ID 后,获取它的散列,如果匹配,则更新数据库中的该行。 然而,(在我们的例子中)13 的哈希值有可能匹配任何其他行并因此执行更新操作。

您能否建议我们可以验证客户端未更改值的任何其他安全方法?

here 问题的答案正是我要找的。然而,在那次讨论中没有合适的解决方案/方法。

最佳答案

您可以使用您自己的函数或内置的 php 函数 uniqid() 创建一个唯一的生成 ID (ID1)。启动用户 session 并将 ID1 以及消息 ID(ID2) 存储在 session 中,如下所示。

session_start();
$ID1 = uniqid();
// store session data
$_SESSION['ID1']=$ID1;
$_SESSION['ID2']=$ID2;

假设生成的 ID 是“145f214”。 您的表单中的输入将如下所示

<input type="text" name="update_145f214 />

提交表单时,您只需在输入元素中获取 ID1 并检查:

  1. 如果 session 中的ID1有相同的值
  2. 如果是,请使用存储在 session 中的 ID2 值进行 sql 查询
  3. 如果不是,则向用户显示一条错误消息

这是一个非常基本的解决方案,但您肯定会从那里改进。

如果您有很多字段并且使用数据对,那么您将需要在 session 中保存这些数据对和其他数据对。

假设您有 10 个字段,数据如下:[12a:1][12b:2][12c:3]

您可以将字段的顺序和相应的数据保存到 session 变量中。

$_SESSION['field1'] = [12a:1];

$_SESSION['field2'] = [12ba:2];

也可能是这个

$_SESSION['fieldCount'] = 10;

确保您知道自己生成了多少个字段

从那里您可以首先检查提交的字段数是否与您生成的字段数相同。然后通过与 session 变量中的数据进行比较来检查所有字段是否都具有您分配给它的对(这也将有助于检查顺序是否已更改)。

我回到这个是因为我有一个类似的案例并实现了上述解决方案。

如果你愿意,我可以给你更多的细节

关于php - 在数据库更新之前检查客户端是否更改了 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20172411/

相关文章:

php - 获取本月的最后一天?

javascript - 如何在 Laravel Controller 中处理 Ajax 响应?

php - 在 PHP 上解析 JSON 并提取特定值

mysql - 为Mysql表创建索引时出错

mysql - 无法找出存储过程,在 END 处出错

python - Django:避免服务器端和客户端验证代码重复

angular - 如何以 Angular 形式显示服务器验证错误

javascript - 为什么我们需要客户端和服务器端验证?

PHP 数组值到唯一键

php - 从 MySQL 表的一列获取字符串值并更新同一行的其他列值