1

在处理数据库记录时,将它们显示在 HTML 上并将它们的 ID 存储到隐藏字段中,以获取要更新的记录是不安全的,我尝试了其他方法,但我不确定这是否足够安全。

目前我将 ID 和 ID + Somekey 的 md5 校验和存储在另一个隐藏字段中。

<input type="hidden" name="ID" value="1"/>
<input type="hidden" name="Hash" value="<?php echo md5($ID."MYKEY"); ?>"/>

在 PHP 的后端我做同样的事情并测试他们是否相等。

<?php
  $ID = $_GET['ID'];
  $Checksum = $_GET['Hash'];

  if(md5($ID."MYKEY") == $Checksum)
  //Proceed Delete or update
?> 

我这样做是因为有人可以更改记录的 ID 并与其他记录交互。

第二种解决方案是检查该记录是否与用户相关,方法是从数据库中选择它并测试该记录是否存在于该特定用户,但使用校验和我认为这可能是一种优化!

那么使用这种方式是否足够安全,使用校验和并为每个新会话生成动态密钥。

最好的

4

2 回答 2

3

您应该在服务器端检查用户权限。
校验和的问题在于用户可以更改校验和以及 ID - 并且可以尝试猜测您用于生成校验和的内容。所以从会话中获取当前用户,获取是否允许用户更改数据库中的记录,如果不是则拒绝。

就优化而言 - 您应该只在结果很慢的情况下进行优化。

或者引用有关此事的专家的话:

在 DonaldKnuth 的论文“StructuredProgrammingWithGoToStatements”中,他写道:“程序员浪费了大量时间来思考或担心程序中非关键部分的速度,而在考虑调试和维护时,这些效率上的尝试实际上会产生强烈的负面影响. 我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源。但我们不应该放弃关键的 3% 的机会。

于 2012-06-15T08:17:41.390 回答
1

我认为它类似于反 CSRF 机制。可能你需要简单的 CSRF 保护,非自己编写的?

于 2012-06-15T08:16:32.260 回答