【问题标题】:Javascript Encrypt pass before POSTPOST 前的 Javascript 加密传递
【发布时间】:2015-05-19 10:23:17
【问题描述】:

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

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

<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()">

谁能告诉我解决办法?

【问题讨论】:

  • 你需要通过javascript获取密码输入的值,而不是在你已经发布之后..
  • 这里是 JS 方式:developer.mozilla.org/en-US/docs/Web/API/Document/… 另一个有用的库是 jQuery,但不是强制性的。
  • 停止。真的真的停下来。 SHA1 不是加密。如果要在客户端和服务器之间加密数据,请使用 SSL。如果您想对密码进行哈希处理,请使用不如 SHA1 弱的东西并在服务器上进行。
  • @MiroslavSaracevic — 安全噩梦并不适合进行良好的学习练习,我质疑这显然也不适用于实时代码。

标签: javascript html encryption


【解决方案1】:

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

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

    "&lt;?php echo $_POST["password"]; ?&gt;" 变为 ""

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

  3. 当您发帖时,密码字段为空,因为 #2。您的服务器一无所获,因此您的密码不会更改。

顺便说一句,

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

【讨论】:

  • 您关于不在客户端上散列的观点很有趣,但窃取散列与窃取密码本身一样有用,不是吗?此外,如果黑客窃取了哈希,它只会在相关站点有用,但如果他窃取了实际密码,他可以在其他地方尝试。所以答案是 https 否?
【解决方案2】:

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

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

可以工作的流程是: 执行 PHP -> 交付 html + javascript -> 用户输入 -> 加密 -> 提交

因此,在这种情况下,您不能依赖 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>

这仅处理与尝试通过 PHP 相关的问题 变量到 javascript 变量。关于 SHA1 的安全问题是 另一个话题,如果这是学校项目或摆弄 学习javascript就可以了。这个例子用于学习目的如何 使用 javascript 访问元素中的值是可以的。然而,如果这 代码将被放在服务器上并被使用,那么 SHA1 应该 一定要避免

【讨论】:

  • 只是添加它看起来他需要将id="inputPassword"添加到他的密码输入字段。
  • 我假设他已经有了它,但是是的,在原始问题中获取整个表单会很有用,而不仅仅是提交按钮。
  • 谢谢你的回答,在提交之前移动onclick也对我有帮助,我不知道为什么。
  • 因为表单提交正在加载新页面。所以一般来说,你总是想在实际提交之前做一些事情。如果您正在更改当前 DOM 之外的其他内容,例如使用 cookie 或类似内容进行操作,则单击时可以工作。
【解决方案3】:

cript 之前的表单帖子被调用。

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

<form onsubmit="cript()">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多