Javascript 在 POST 之前加密通行证

Javascript Encrypt pass before POST

我正在尝试在按下提交按钮时加密密码。

我不明白为什么密码输入的值没有改变,加密是正确的。

<script>
    function cript(){
        var pass = CryptoJS.SHA1("<?php echo $_POST["password"]; ?>");

        var passString = pass.toString();

        console.log(passString);
        document.getElementById('inputPassword').value = passString;
    }
</script>

和 HTML 表格:

<input type="submit" class="btn btn-primary" value="Proceed" onclick="cript()">

谁能告诉我解决方法?

表单在 cript 被调用之前发布。

在表单的 onsubmit 事件中调用 cript 函数:

<form onsubmit="cript()">

您的 PHP 代码无法在点击时执行。它只能在您加载文件时由服务器执行,因为您正在等待用户输入密码然后调用它不会起作用的函数。

您的 javascript var pass 是空的,因为您当时没有 POST。

可以工作的流程是: execute PHP -> deliver html + javascript -> 用户输入 -> do crypt -> submit

所以在这种情况下你不能依赖 PHP 给你数据。你需要在这里采用不同的方法。

尝试

<script>
    function cript(){
        var pass = CryptoJS.SHA1(document.getElementById('inputPassword').value);

        var passString = pass.toString();

        console.log(passString);
        document.getElementById('inputPassword').value = passString;
    }
</script>

This only takes care of problem related with trying to pass PHP variable to javascript variable. Security issues about SHA1 are another topic and if this is school project or fiddling around to learn javascript then it is ok. This example for learning purposes how to use javascript to access values in elements is ok. However if this code is ever going to be put on server and be used, then SHA1 should definitely be avoided

JavaScript 在浏览器中执行。 PHP 在服务器上执行。您编写的代码不起作用,因为它试图在浏览器中同时执行它们。

  1. "<?php echo $_POST["password"]; ?>" 首先执行,同时在服务器上构建页面。此时,服务器上可能不存在密码,因此 javascript 中的值很可能为空。

    "<?php echo $_POST["password"]; ?>" 变为 ""

  2. 当 javascript 在浏览器中加载时,它实际上是 var pass = CryptoJS.SHA1("");。您可以使用像 firebug 这样的调试器或像 ZED 这样的代理来验证这一点,或者只是通过在浏览器中查看页面的源代码来验证这一点。当它执行时,它没有散列任何东西,因此密码字段中没有存储任何东西。

  3. 当您post时,由于#2,密码字段为空。您的服务器什么也得不到,所以您的密码不会更改。

顺便说一句,

  • 不要在客户端散列密码。这意味着存在安全漏洞,您可能在登录过程中对密码进行哈希处理。看起来您似乎在保护数据不被不安全地发送到服务器,但实际上您只是将密码散列到密码中。当密码散列从网络上被盗时,攻击者将能够像重放原始密码一样重放它。
  • 您忘记在密码中加盐,这使您容易受到彩虹表的攻击。
  • 不要使用 sha1 来散列密码。它有点疲软,预计任何一天都会下跌。使用 bcrypt 或 pbkdf2
  • 不要称它为 'encrypt the password' 而是 'hash the password'。虽然哈希在技术上是一种加密技术,但不准确地使用这些词既掩盖了您的经验不足,又传达了您想要的不同信息,这使得了解加密的人必须更加努力地工作才能理解您的问题以帮助您。
    • 使用'encrypt'和'decrypt'表示可逆加密。
    • 使用 'crypt' 指的是旧的弱 unix 算法,应该没有人再使用了。
    • 使用 'hash' 或 'digital fingerprint' 来引用哈希值。