【问题标题】:Storing Item ID into HTML将项目 ID 存储到 HTML
【发布时间】:2012-06-15 08:07:19
【问题描述】:

在处理数据库记录时,将它们显示在 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 并与其他记录交互。

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

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

最佳

【问题讨论】:

  • @KBoek 对不起,我喜欢 99% 的 c# 标签问问题,所以这是一种习惯。
  • 你需要了解ACL

标签: php database security checksum


【解决方案1】:

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

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

或者引用这方面的专家的话:

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

【讨论】:

  • 关于更改校验和和 ID 是真的,但老实说,你能告诉我风险的百分比吗,因为我们现在都知道 MD5 对暴力破解很敏感,但有可能获得正确的哈希值很低。
  • 嗯 - 我不知道百分比,但 0% 更好:)
  • 我的意思是——Web 应用程序安全性的经验法则之一是在服务器端验证您的数据。像这样考虑它比尝试捕捉所有可能的安全威胁要好得多。所以你验证所有数据——一切,你把它列入白名单——不允许任何意外。
【解决方案2】:

我认为它类似于 anti-CSRF 机制。可能您需要简单的非自己编写的 CSRF 保护吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 2014-01-07
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多