PHP将签名添加到POST请求

时间:2015-02-21 17:55:44

标签: php hash

我正在尝试使用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请求会解决此问题吗?

编辑:我正在努力确保用户在提交数据时没有篡改数据。

1 个答案:

答案 0 :(得分:4)

  

我正在尝试确保用户在提交数据时没有篡改数据。

非常生硬:这是一个非常愚蠢的原因。用户将数据输入表单并提交给您。他们已经在“篡改”数据。想要以任何方式签署此数据没有任何意义。即使PHP作为“预处理器”的“问题”不存在,它将如何工作? PHP会接受用户输入的数据,签名,然后将其提交给自己并检查签名?您可以跳过整个过程,只需获取用户的输入,即具有相同的结果。

你可以在Javascript中进行签名,但这同样是胡说八道。您正在提供可以为客户端生成有效签名的Javascript代码...什么阻止任何人“篡改”数据然后为其生成有效签名?

会有意义的东西:

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