在将用户输入字符串注入模板引擎或说简单的 JS 模板字符串之前,如何清理 nodejs 中的用户输入字符串?

How to sanitize user input string in nodejs, before injecting it in a template engine or say simple JS template string?

我有网页(基本上是名片),其标题是根据用户输入创建的。 我打算为此目的使用简单的 JS 模板字符串,而不是某些模板引擎。 (为此我正在使用 express.js/node.js)

response.send(`
<html>

 <head>
  <title>${user_inputed_title_got_from_DB}</title>
  <meta property="og:title" content="${some_more_user_content}" />
 </head>

 <body>
  <script>
     window.location.href="/business-card/${user_input_number}";
  </script>
 </body>

</html>`)

如何避免恶意用户的 XSS 注入?

对于普通的 HTML 标签,this answer should suffice:

function escapeHtml(unsafe)
{
    return unsafe
         .replace(/&/g, "&amp;")
         .replace(/</g, "&lt;")
         .replace(/>/g, "&gt;")
         .replace(/"/g, "&quot;")
         .replace(/'/g, "&#039;");
 }

但是,您需要更加谨慎地对待脚本标记中的重定向。一种常见的方法是将重定向放在一个属性中,可以使用上述函数对其进行转义:

<script data-redir="/business-card/${escapeHtml(user_input_number)}">
    window.location.href = document.currentScript.dataset.redir;
</script>