【问题标题】:HTML injection in Node, Express and MongoDB. (EJS templating engine)Node、Express 和 MongoDB 中的 HTML 注入。 (EJS 模板引擎)
【发布时间】:2020-12-24 06:58:56
【问题描述】:

我是网络开发的新手。我对安全知之甚少。我创建了一个论坛,用户可以在其中选择匿名交谈。所以我没有注册或要求用户登录。

我的应用程序有一个巨大的缺陷。当有人在我的输入字段中输入 HTML/CSS/JS 时,更改会呈现到实际网站上。我一直在集思广益,但无法找到解决此问题的方法。

如何检测用户是在输入 HTML 还是 CSS,以及如何克服用户的这种不当行为。由于键入的内容被保存到数据库中,因此每次都会呈现。请帮助伙计们!让溶液倒进去。

提前谢谢你。

【问题讨论】:

    标签: javascript html node.js mongodb ejs


    【解决方案1】:

    EJS 已经内置了防止 HTML 注入的机制。 <%= 标签转义 HTML。例如:

    <% var x = '<div>HTML Injection!</div>' %>
    <%= x %>
    

    将呈现类似于:

    &lt;HTML Injection!&gt;
    

    所以输出应该是安全的,即使它看起来像是有人在输入代码。

    HTML 注入在 EJS 中起作用的唯一方法是,如果您故意允许它使用 &lt;%- 而不是 &lt;%= 或重新定义 escape 选项。

    如果您真的需要使用&lt;%-,那么 EJS 将停止保护您免受 HTML 注入,并假设您知道自己在做什么。在这种情况下,避免 HTML 注入成为您的责任。您可以手动执行 EJS 为您执行的操作,方法是将 &amp;lt; 替换为 &amp;lt; 并将 &amp;gt; 替换为 &amp;gt; 或从用户输入中完全删除 HTML 标记:

    const some_input = req.query.some_data;
    
    escaped_html_input = some_input.replace(/</g, '&lt;').replace(/>/g, '&gt;');
    
    deleted_html_input = some_input.replace(/<.+?>/g, '');
    
    save(escaped_html_input);
    
    // or save(deleted_html_input);
    

    【讨论】:

    • 非常感谢兄弟!正是我想要的。再次感谢。我还有一个疑问,这是否也可以防止数据库注入,用户是否可以通过注入代码来获取我的数据?
    • 我还计划为表单添加一个文本编辑器。在这种情况下,如何存储用户输入评论的样式?
    • 在这种情况下,您可以做 Facebook 应用或 Shopify 所做的事情:禁止(如删除)特定的脚本标签。在我的脑海中,我会禁止img(将数据泄露到外部服务器的能力,如img src="myserver.com/some/php/script")、scriptlinkiframeobject - 也许更多,但这些是想到的那些
    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 2015-04-15
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多