PHP 向 POST 请求添加签名

PHP Add Signature to POST Request

我正在尝试使用 PHP 发出 POST 请求。我正在尝试提交用户名和生成的哈希值。以下是我目前的代码:

<?php
    if( isset($_POST["name"]) && crypt($_POST["name"],'saltgoeshere') == $_POST["hash"] )
    {
        echo "Name is ". $_POST['name']. "<br />";
        exit();
    }
    else if( isset($_POST["name"]) && crypt($_POST["name"],'saltgoeshere') != $_POST["hash"] ) {echo "Invalid/Tampered Request?"; exit();}
?>
<html>
<body>
  <form action="<?php $_PHP_SELF ?>" method="POST">
  Name: <input type="text" name="name" value="" />
  Password: <input type="hidden" name="hash" value="<?php echo crypt($name,"saltgoeshere");?>" />
  <input type="submit" />
  </form>
</body>
</html>

用户提交他们的名字,脚本根据他们的输入创建一个散列,并创建一个包含名字和散列的 POST 请求。然后脚本查看 post 请求并检查提交的哈希值是否与实际哈希值匹配。

我目前遇到的问题是根据用户输入生成散列,因为 PHP 是 Pre 处理器。

发出 AJAX 请求可以解决这个问题吗?

编辑:我试图确保用户在提交数据时没有篡改数据。

I am trying to make sure the user has not tamped with the data when it has been submitted.

说白了:这是一个很愚蠢的理由。用户正在将数据输入表单并将其提交给您。他们已经 "tampering" 有了数据。想要以任何方式签署此数据没有任何意义。即使 PHP 的 "problem" 是 "pre-processor" 不存在,这将如何工作? PHP会把用户输入的数据拿过来签名,然后提交给自己校验签名?您可以跳过整个过程,只接受用户的输入,结果相同。

您可以在 Javascript 中进行签名,但这同样是无稽之谈。您提供的 Javascript 代码可以为客户端生成有效签名...是什么阻止了任何人 "tampering" 使用数据然后为其生成有效签名?

有意义的东西:

  • 您在 hidden 表单元素中向用户提供数据,并且您想要检查用户在服务器→客户端→服务器的过程中没有更改此值;在这种情况下,您可以使用只有服务器知道的散列和 secret 对其进行签名,并以这种方式对其进行验证。这里的关键是服务器上有一个客户端没有也无法伪造的秘密组件。
  • 上面的场景,你也可以简单的使用session。在这种情况下,您将数据防篡改存储在客户端根本无法访问的服务器本身上。上述签名方法的优点是它使服务器保持无状态,而对于会话,服务器必须存储状态。不过,他们都在朝着同一个目标努力。
  • 您想要防止第三方在数据从客户端传输给您时篡改数据。解决这个问题的唯一现实方法是使用 SSL/TLS 安全连接。这允许客户端和服务器之间的合理安全通信免受第三方篡改。客户仍然可以随时向您发送任何数据,您必须验证这些数据的正确性;签名等在这里再次无关。