考虑以下示例:HTML页面:
<input type="text" name="update_12" />
通过表单发送一个名称为"update_12"、新文本为"Some other 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 的新消息更新DB
我是PHP的新手,正在探索MySQL中的基本数据存储、更新、检索和删除。
由于客户端可以更改输入字段的名称:"name"并发送另一个值进行更新。例如:如果一个客户端打开firebug并将输入框的"name"字段更改为"update_13",那么他的操作将覆盖另一个用户的Message。
我试着通过在脸书上删除状态来研究这个问题。从要删除的POST数据的初步观察中,我可以看到一些重要的参数被发送删除为:
impression_id=456ab622
profile_id=100005552221116
__user=100005552221116
story_fbid=540912345678911
对于帖子删除,关联的ID看起来像:story_flad。当我将其更改为可能是:540912345678912(最后一位更改)点击删除,fb花了一段时间,并回复了一条错误消息:此操作无法完成。发送POST删除请求后(带有修改的story_flad)会出现此错误消息。POST请求的响应包含模式窗口中显示的错误消息。
我可以想出一种方法,将ID及其哈希(MD5/SHA1/SHA2)存储在DB中,收到ID后,获取其哈希,如果匹配,则更新DB中的该行。然而,(在我们的例子中)13的散列可能与任何其他行匹配,从而执行更新操作。
你能建议我们用任何其他安全的方法来验证客户端没有更改值吗?
这个问题的答案正是我想要的。然而,在讨论中没有适当的解决方案/方法。
您可以使用自己的函数或内置的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并检查:
- 如果会话中的ID1具有相同的值
- 如果是,则使用存储在会话中的ID2值进行sql查询
- 如果没有,则向用户显示错误消息
这是一个非常基本的解决方案,但从那里你肯定会有所改进。
如果您有很多字段,并且使用数据对,则需要将这些数据对和另一个数据对保存在会话中。
假设你有10个字段,数据如下:[12a:1][12b:2][12c:3]
您可以将字段的顺序和相应的数据保存到会话变量中。
$_SESSION['field1'] = [12a:1];
$_SESSION['field2']=[12ba:2];
也可能是这个
$_SESSION['fieldCount'] = 10;
以确保您知道已生成的字段数
从那里,您可以首先检查提交的字段数是否与您生成的字段数相同。然后,通过与会话变量中的数据进行比较,检查所有字段是否都有您分配给它的对(这也有助于检查顺序是否已更改)。
我回到这里是因为我有一个类似的案例,并实现了上述解决方案。
如果你想要,我可以给你更多的细节