请问 @snoopy 大虾该怎样用Nodejs彻底杜绝CSRF,XSS攻击呢?

请问 @snoopy 大虾该怎样用Nodejs彻底杜绝CSRF,XSS攻击呢?

防止注入永远不要用黑名单,用白名单,明确我们支持的几种标签,比如我们只支持img,a,p这3种标签,其他的统统干掉。事件是一定要全部屏蔽掉的,一个都不剩,另外再加上将双引号,单引号,左右尖括号都要去除。基本可以防止大部分注入攻击了。但是有些攻击防不胜防的,可能还需要根据你网站的业务来做针对性的措施。比如url注入,或者利用flash,utf-8编码注入等等。当然就算你做了白名单,如果做的不够完善,还是有可能被攻击者有机可乘的。

9 回复

为了使用Node.js来防止CSRF(跨站请求伪造)和XSS(跨站脚本攻击),我们可以采用一些常见的最佳实践和技术。以下是具体的步骤和示例代码:

防止XSS

XSS 攻击通常通过注入恶意脚本来实现。为了防止这种攻击,我们需要对用户输入进行严格的验证和清理。我们可以使用 xss 这样的库来处理这个问题。

示例代码

  1. 安装 xss 库:
npm install xss
  1. 使用 xss 库来清理用户输入:
const xss = require('xss');

function sanitizeUserInput(input) {
    // 允许的标签和属性
    const allowedTags = ['a', 'p', 'img'];
    const allowedAttributes = ['href', 'src'];

    return xss(input, {
        whiteList: allowedTags,
        attributes: allowedAttributes
    });
}

// 用户输入
const userInput = '<script>alert("XSS Attack");</script><p>Hello <img src="bad.jpg" onerror="alert(\'XSS\')"> World</p>';

// 清理输入
const sanitizedInput = sanitizeUserInput(userInput);

console.log(sanitizedInput);
// 输出: <p>Hello <img src="bad.jpg"> World</p>

防止CSRF

CSRF 攻击通常是通过伪造的表单提交或链接来实现的。为了防止这种攻击,我们可以在服务器端验证每个请求是否包含有效的 CSRF token。

示例代码

  1. 使用 csurf 库来生成和验证 CSRF tokens:
npm install csurf cookie-parser
  1. 在 Express 应用中集成 CSRF 保护:
const express = require('express');
const cookieParser = require('cookie-parser');
const csrf = require('csurf');
const bodyParser = require('body-parser');

const app = express();

app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));

// 创建 CSRF 中间件
const csrfProtection = csrf({ cookie: true });

// GET 请求,显示表单
app.get('/form', csrfProtection, (req, res) => {
    res.send(`
        <html>
            <head>
                <title>CSRF Form</title>
            </head>
            <body>
                <form action="/submit" method="POST">
                    <input type="hidden" name="_csrf" value="${req.csrfToken()}">
                    <label for="message">Message:</label>
                    <input id="message" name="message" type="text">
                    <button type="submit">Submit</button>
                </form>
            </body>
        </html>
    `);
});

// POST 请求,处理表单提交
app.post('/submit', csrfProtection, (req, res) => {
    console.log(req.body.message);
    res.send('Form submitted successfully!');
});

app.listen(3000, () => {
    console.log('Server started on port 3000');
});

以上代码展示了如何使用 xsscsurf 库来防止XSS和CSRF攻击。这些库提供了强大的功能来确保你的应用更加安全。


.xss()这个函数没去看,不过就目前cnodjs被注入的各种惨状来看,貌似这个函数没多大作用。

人类已经无法阻止cnodejs被XSS了!

人类已经无法阻止cnodejs被XSS了!

人类已经无法阻止cnodejs被XSS了!

人类已经无法阻止cnodejs被XSS了!

node-validator 2.0 xss函数被移除了, 不知道为什么, 现在有什么好的代替方案吗?

好吧, validator 作者回我说他没有精力维护xss部分, 说是太专业情况太复杂…

为了彻底杜绝 CSRF 和 XSS 攻击,我们可以使用一些成熟的库和方法。以下是一些示例代码和建议:

防止 XSS 攻击

XSS 攻击主要是通过注入恶意脚本到页面中。为了防御 XSS 攻击,可以使用 express-sanitizexss-clean 库对用户输入的数据进行处理。

  1. 安装 xss-clean

    npm install xss-clean
    
  2. 使用 xss-clean 清理数据

    const express = require('express');
    const xssClean = require('xss-clean');
    
    const app = express();
    
    // 使用 xss-clean 中间件
    app.use(xssClean());
    
    app.post('/submit', (req, res) => {
      // req.body 现在已经被清理过
      console.log(req.body);
      res.send('Data received');
    });
    
    app.listen(3000, () => {
      console.log('Server running on port 3000');
    });
    

防止 CSRF 攻击

CSRF 攻击通常通过伪造请求来实现。可以使用 csurf 库来防御 CSRF 攻击。

  1. 安装 csurf

    npm install csurf
    
  2. 使用 csurf 中间件

    const express = require('express');
    const csrf = require('csurf');
    
    const app = express();
    const csrfProtection = csrf({ cookie: true });
    
    app.use(express.urlencoded({ extended: false }));
    
    // 使用 csrf 保护中间件
    app.get('/', csrfProtection, (req, res) => {
      res.send('<form method="POST"><input type="text" name="data" /><input type="hidden" name="_csrf" value="' + req.csrfToken() + '" /><button type="submit">Submit</button></form>');
    });
    
    app.post('/', csrfProtection, (req, res) => {
      // CSRF token 验证通过后执行业务逻辑
      console.log(req.body.data);
      res.send('Data received');
    });
    
    app.listen(3000, () => {
      console.log('Server running on port 3000');
    });
    

总结

通过使用 xss-cleancsurf 这样的成熟库,你可以大大减少 CSRF 和 XSS 攻击的风险。同时,确保在开发过程中对所有用户输入进行验证和清理,可以进一步增强安全性。

回到顶部