PHP - 防止客户端篡改表单的ID

时间:2013-08-10 22:50:55

标签: php security codeigniter twitter-bootstrap x-editable

如何修复此代码的安全流程:

 <a href="http://localhost/mypay/admin/company/#" 
   data-pk="26" data-url="http://localhost/mypay/admin/company/update/profile" 
   id="name" 
   name="name" 
   data-type="text" 
   data-source="">dfg</a>

这使用x-editable [bootstrap] - http://vitalets.github.io/x-editable/

如果客户端更改了数据的“PK”主键,我很好奇如何提高应用程序的安全性。身份证必须放在哪里或者我会创建哪些其他安全措施来阻止他们这样做?

我使用:Bootstrap和Codeigniter。

2 个答案:

答案 0 :(得分:13)

如果允许当前用户编辑此条目,则必须在服务器端进行检查。不要试图保护客户端,这是不可能的。人们总是能够在他们的计算机上编辑数据,当你到达你控制的地方时,你有责任控制它。

答案 1 :(得分:0)

我们,PHP编码员,并不总是看到我们的代码中的弱点。我们对识别用户(pw,会话等)做了大惊小怪,我们清理代码以防止SQL注入所有类型。好 !但是,如果一个完全识别的用户,合法更新HIS OWN记录(比如他的ID 24),只需将他的更新表单发送回你的应用程序,所有空字段和ID = 23,然后ID = 22等等。 人们可以在几分钟内轻松消灭所有记录(通过一个小循环甚至更快:for(id = 1,id&lt; 10000等)

所以,非常好的问题INDEED!

这是我的解决方案(当然不是最好的解决方案):

当识别出的用户点击按钮编辑HIS记录时,我这样做:

  1. 我读了他的记录(SELECT)来获取数据。
  2. 我更新了记录中放入两个临时信息:时间戳和随机字符串(35个字符长的字符串,如MD5但随机创建)。
  3. 然后我向该用户发送包含所有数据的编辑表单,包括隐藏字段{name =“id”value =“24”}和另一个隐藏字段{name“UpdatableOnlyBy”value =“ks3kms36di7eur94k3n ...”}
  4. 每当表单由$ _POST []返回以更新记录时,比如说#24,我接受只在{UpdatableOnlyBy}字符串等于临时存储在该记录中的字符串并且时间戳不是更旧时才这样做超过20分钟。然后,只有这样,我才进行UPDATE(顺便说一下,将特殊的{UpdatableOnlyBy}字段设置为Null)。
  5. 任何来自 FOR FOROTAT ID 的数据都不会导致任何更新,因为目标记录没有相同的随机{UpdatableOnlyBy}字符串。

    如果留下这两个字段,我会由你决定何时以及如何清理这两个字段 旧的MD5字符串和时间戳。就我而言,我在0h25有一个cronjob,可以清除昨天和之前的所有字段。但是在过去,我保留了这些数据,以查看有多少记录被更新,留下“孤儿”(编辑表格从未回来......)。在我的一个应用程序中,它不到6%。