• Angular安全专辑之五 —— 防止URL中敏感信息泄露


    URL  中的敏感数据是指在网址上的机密或者个人信息,包括 UserId, usernames, passwords, session, token 等其他认证信息。

    由于URL 可能会被第三方拦截和查看(比如互联网服务商、代理或者其他监视网络流量的攻击者),所以URL中的敏感数据会带来安全风险,攻击者可能会捕获并使用它进行攻击。

    例如:

    1. 信息泄露: URL 中的敏感数据泄露会被攻击者拦截,并导致个人身份信息或者系统机密信息泄露。
    2. 账户劫持: 攻击者可以使用URL中的敏感数据对用户账户进行未授权的访问,并执行各种恶意活动。
    3. 网络钓鱼攻击:攻击者可以创建模仿合法网站的虚假网页,并在 URL 中包含敏感数据,以诱骗用户泄露其登录凭据或其他敏感信息。
    4. 跨站点脚本(XSS)攻击:攻击者可以将恶意代码注入 URL,这些代码在由用户浏览器执行时可以窃取敏感数据,例如 Cookie 或会话 ID。

    如何防止URL中敏感数据泄露

    1.禁止在代码中储存敏感数据

    比如:

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1">
    6. <title>title>
    7. head>
    8. <body>
    9. <form method="post">
    10. <div class="imgcontainer">
    11. <img src="img_avatar2.png" alt="Avatar" class="avatar">
    12. div>
    13. <div class="container">
    14. <label for="uname"><b>Usernameb>label>
    15. <input type="text" placeholder="Enter Username" name="uname" required>
    16. <label for="psw"><b>Passwordb>label>
    17. <input type="password" placeholder="Enter Password" name="psw" required>
    18. <button type="submit">Loginbutton>
    19. <label>
    20. <input type="checkbox" checked="checked" name="remember"> Remember me
    21. label>
    22. div>
    23. <div class="container" style="background-color:#f1f1f1">
    24. <button type="button" class="cancelbtn">Cancelbutton>
    25. <span class="psw">Forgot <a href="#">password?a>span>
    26. div>
    27. form>
    28. body>
    29. html>

    在代码中保存了测试账号和密码信息,而为了不泄露敏感数据,需要将测试账号和密码删掉。

    2.不要在URL 中添加敏感数据

    比如:当我们登录成功后获得了自己的auth token = eydGbGciOiJSUzI3VidIsInR5cCI6IkpXVCIsImtpZCI6IlJfRmJ0MllaTW142310dencYVpxWCJ9

    此时连接 socket:

    客户端:

    1. const ioSocket = io.connect(
    2. 'localhost: 4200', {
    3. query: 'utcoffset=' + (new Date()).getTimezoneOffset(),
    4. transports: ['websocket', 'polling'],
    5. });

    服务端:

    此时我们其实把auth token 添加到了URL 上。如下图

    如何修改: 不要将auth token放在URL里。

    客户端:

    1. const ioSocket = io.connect(
    2. 'localhost: 4200', {
    3. forceNew: false,
    4. query: 'utcoffset=' + (new Date()).getTimezoneOffset(),
    5. transports: ['websocket', 'polling'],
    6. upgrade: false
    7. });
    8. ioSocket.on('connect', () => {
    9. ioSocket.emit('authenticate', { token: 'eydGbGciOiJSUzI3VidIsInR5cCI6IkpXVCIsImtpZCI6IlJfRmJ0MllaTW142310dencYVpxWCJ9' });
    10. });

    服务端:

    1. const cookie = require('cookie');
    2. const _ = require('lodash');
    3. module.exports = function(app, server) {
    4. io.on('connection', async function(socket) {
    5. socket.authenticated = false;
    6. socket.on('authenticate', async function(data) {
    7. // 验证token
    8. socket.authenticated = checkToken(data.token);
    9. });
    10. let authId = _.get(socket, ['request', 'decoded_token', 'sub']);
    11. const cookieStr = _.get(socket, ['request', 'headers', 'cookie']);
    12. const cookies = cookie.parse(cookieStr);
    13. const consid = cookies['connect.sid' ];
    14. if (authId) {
    15. let userSockets = _.get(app, ['ioUserSockets', authId], []);
    16. if (!_.find(userSockets, socket)) {
    17. userSockets.forEach(socket => {
    18. if (_.get(socket, 'consid') === consid) {
    19. delete socket.consid;
    20. }
    21. });
    22. _.set(socket, 'consid', consid);
    23. userSockets.push(socket);
    24. _.set(app, ['ioUserSockets', authId], userSockets);
    25. }
    26. socket.on('disconnect', () => {
    27. let userSockets = _.get(app, ['ioUserSockets', authId], []);
    28. logger.debug('Removing socket for user %s', authId);
    29. _.pull(userSockets, socket);
    30. _.set(app, ['ioUserSockets', authId], userSockets);
    31. });
    32. }
    33. setTimeout(function() {
    34. if (!socket.authenticated) {
    35. socket.disconnect('unauthorized');
    36. }
    37. }, 3000);
    38. }
    39. };

    这样就可以防止auth token 在URL里出现了。

  • 相关阅读:
    SQLite Write-ahead Logging
    [数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北
    预售, 产品开发完成前没人买,那么之后也不会有
    C++模板(函数模板/类模板)
    Nginx网站服务(安装nginx,nginx访问配置)
    1、5伪类选择器
    bash shell 无法使用 perl 正则
    你知道SOLIDWORKS焊件类零件有个快速草图建立工具吗?
    C++设计模式_13_Flyweight享元模式
    Redis Java 开发简单示例
  • 原文地址:https://blog.csdn.net/KenkoTech/article/details/133853618