2013-11-24 46 views
1

在客户端改变考虑下面的例子: 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正是我所期待的。但是在讨论中没有适当的解决方案/方法。

回答

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. 如果是,使用存储在会话你的SQL查询
  3. 如果不是ID2的值,显示错误信息给用户

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

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

让说你有10个字段与数据如下:[12A:1] [12B:2] [12C:3]

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

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

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

可能也是这个

$_SESSION['fieldCount'] = 10; 

,以确保你知道多少场你从那里产生

可以先检查是否提交场的数量是一样的,你所产生的那些。然后,通过与会话变量中的数据进行比较,检查所有字段中是否有分配给它的对(这也有助于检查订单是否已更改)。

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

如果你想

+0

需要一些澄清,我可以给你更多的细节: 据我所知,在session_start()生成SID。当你说唯一生成的ID时,你是指同一个SID? 数据库ID是否与问题示例中给出的Message_ID相同? 提问中提到的表单ID是什么? (是输入的名称字段? – learner

+0

是的,这看起来像一个基本的方法,并可用于少量的输入/文本区 但是,如果有10个输入说,使用UUID方法要求我们跟踪UUID:例如:如果[UUID:ID]对是[12a:1] [12b:2] [12c],则不能在HTML输入的'name'字段中检查编辑/更改的UUID。 :3]等等,现在如果用户将message_12a更改为message_12b,他将被允许在主键'2'上对行进行错误更新 如果您可以建议,任何其他方法将帮助我探索更多那。 – learner