1

考虑以下示例: 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 中的基本数据存储、更新、检索和删除。

由于客户端可以更改输入字段的名称:“名称”并发送另一个值进行更新。例如:如果客户端打开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)存储在 DB 中,并在收到 id 后,获取它的哈希,如果匹配,更新 DB 中的该行。然而,(在我们的例子中)哈希值 13 可能会匹配任何其他行,从而执行更新操作。

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

这里提出的问题的答案正是我正在寻找的。但是,该讨论中没有适当的解决方案/方法。

4

1 回答 1

1

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

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

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

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

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

  1. 如果会话中的 ID1 具有相同的值
  2. 如果是,请使用存储在会话中的 ID2 的值进行 sql 查询
  3. 如果没有,向用户显示错误消息

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

如果您有很多字段并且您使用成对的数据,那么您将需要在会话中保存这些对和另一个。

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

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

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

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

可能也是这个

$_SESSION['fieldCount'] = 10;

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

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

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

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

于 2013-11-24T08:12:05.813 回答