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


PHP - Prevent client from tampering the ID of a form

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

 <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。

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

作为PHP程序员,我们并不总是在代码中看到这种弱点。我们在识别用户(pw、会话等)方面做了大量的工作,并清理了代码以防止各种SQL注入。好吧!但是,如果一个完全确定身份的用户,可以合法更新自己的记录(比如他是ID 24),只需将他的更新表单发送回你的应用程序,其中所有字段都是空的,ID=23,然后ID=22,等等。一个人可以在几分钟内轻松地清除所有记录(甚至可以通过一个小循环更快:对于(id=1,id<10000等)

所以,非常好的问题INDED!

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

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

  1. 我读取了他的记录(SELECT)以获取数据
  2. 我更新了这条记录,并在其中放入了两个临时信息:一个时间戳和一个随机字符串(一个35个字符长的字符串,类似于MD5,但是随机创建的)
  3. 然后,我向该用户发送了一个包含所有数据的编辑表单,包括一个隐藏字段{name="id"value="24"}和另一个隐藏域{name"UpdatableOnlyBy"value="ks3kms36di7eur94k3n…"}
  4. 每当$_POST[]返回表单更新记录时,比如说#24,我只接受在{UpdatableOnlyBy}字符串等于临时存储在该记录中的字符串并且时间戳不超过20分钟的情况下执行此操作。然后,也只有到那时,我才执行UPDATE(顺便说一下,它将特殊的{UpdatableOnlyBy}字段设置回Null)

FOR ANOTHER ID中的任何数据都不会导致任何UPDATE,因为目标记录没有相同的随机{UpdatableOnlyBy}字符串。

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