You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

页面设密码保护时如何隐藏密码?防止他人通过审查元素查看密码

关于密码保护中隐藏密码的两个关键问题解答

嘿,我来帮你搞定这两个密码隐藏相关的问题,咱们一步步拆解:

一、输入时对用户隐藏密码(输入掩码)

你代码里的<input type="password">其实已经完美解决了这个问题!当input的type设为password时,浏览器会自动把用户输入的字符替换成掩码(通常是•或者*),用户输入过程中完全看不到明文内容,这是浏览器原生的密码隐藏机制,简单又靠谱。

二、防止通过审查元素泄露密码的风险

你当前的代码存在两个容易被审查元素破解的漏洞,咱们逐个修复:

1. 别把密码硬编码在前端JS里

你现在的onSubmit函数直接把密码'12345678'写死在代码里,任何人打开浏览器开发者工具(审查元素)查看JS代码,都能一眼看到这个密码,这等于完全没做安全防护!

正确的做法是:

  • 前端只负责收集用户输入的密码,然后把它发送到后端服务器做验证
  • 后端不能明文存储密码,必须用哈希算法(比如bcrypt、Argon2)加密后存在数据库里,验证时对用户输入的密码做同样的哈希,再和数据库里的哈希值对比

2. 防止修改输入框type查看明文

哪怕用了type="password",用户还是可以通过审查元素把input的type改成text,这样输入的密码就会显示明文。虽然前端没法完全阻止这种操作,但可以做些辅助防护增加攻击者的麻烦:

比如添加JS监听,强制保持input的type为password:

const passwordInput = document.getElementById('password');
// 针对现代浏览器的MutationObserver监听
const observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    if (mutation.attributeName === 'type' && passwordInput.type !== 'password') {
      passwordInput.type = 'password';
    }
  });
});
observer.observe(passwordInput, { attributes: true });

⚠️ 重点提醒:前端的防护只是锦上添花,真正的安全必须依赖后端验证——因为前端代码是完全公开可修改的,任何前端防护都能被绕过。

修改后的安全版示例

前端代码:

<fieldset>
  <form class="hero-form" action="/verify-password" method="POST">
    <div class="row-fluid">
      <label>Enter your passcode</label>
      <input type="password" name="password" maxlength="8" class="span7" id="password" placeholder="e.g. 12345678" required/>
    </div>
    <button class="btn btn-info btn-large span5" type="submit">Enter</button>
  </form>
</fieldset>

<script>
// 辅助防护:防止修改输入框type
const passwordInput = document.getElementById('password');
const observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    if (mutation.attributeName === 'type' && passwordInput.type !== 'password') {
      passwordInput.type = 'password';
    }
  });
});
observer.observe(passwordInput, { attributes: true });
</script>

后端逻辑(伪代码示例):

// 以Node.js + Express + bcrypt为例
const bcrypt = require('bcrypt');
const express = require('express');
const app = express();

// 提前哈希好的密码(实际应存在数据库,这里仅做示例)
const hashedPassword = '$2b$10$rOvHdKZ7V8eUxQwErTyUiO'; // 对应明文'12345678'的bcrypt哈希值

app.post('/verify-password', async (req, res) => {
  const userInputPassword = req.body.password;
  // 对比用户输入的密码哈希与数据库中的哈希值
  const isPasswordMatch = await bcrypt.compare(userInputPassword, hashedPassword);
  
  if (isPasswordMatch) {
    res.redirect('http://google.co.in');
  } else {
    res.send('Please check your passcode and try again');
  }
});

内容的提问来源于stack exchange,提问作者Frank Ford

火山引擎 最新活动