在客户端改变考虑下面的例子: HTML页:检查是否ID是以前的数据库更新
<input type="text" name="update_12" />
与名称为“update_12”和新的文本输入框:“有些另一个数据”通过形式 被发送到服务器端的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."'";
}
}
此更新DB与MESSAGE_ID新的消息:12
我新的PHP和探索MySQL的基本数据存储,更新,检索和删除。
由于客户端可以更改输入字段的名称:“名称”并发送另一个值进行更新。例如:如果客户端打开萤火虫并将输入框的“名称”字段更改为“update_13”,他的操作将覆盖其他用户的消息。
我试图通过在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正是我所期待的。但是在讨论中没有适当的解决方案/方法。
需要一些澄清,我可以给你更多的细节: 据我所知,在session_start()生成SID。当你说唯一生成的ID时,你是指同一个SID? 数据库ID是否与问题示例中给出的Message_ID相同? 提问中提到的表单ID是什么? (是输入的名称字段? – learner
是的,这看起来像一个基本的方法,并可用于少量的输入/文本区 但是,如果有10个输入说,使用UUID方法要求我们跟踪UUID:例如:如果[UUID:ID]对是[12a:1] [12b:2] [12c],则不能在HTML输入的'name'字段中检查编辑/更改的UUID。 :3]等等,现在如果用户将message_12a更改为message_12b,他将被允许在主键'2'上对行进行错误更新 如果您可以建议,任何其他方法将帮助我探索更多那。 – learner