如何使用 PHP 安全地为 JavaScript 准备字符串?

How to safely prepare a string for JavaScript using PHP?

考虑通过 PHP 呈现的以下代码片段:

<script type="application/javascript">
    const str = '<?= $str ?>';
</script>

如何准备 $str 以便安全地渲染它?

P.S. Safely 定义为“JavaScript 获得与 [=19 相同的 Unicode 内容=]$str 在 PHP".

您可以使用 PHP's json_encode:

<script type="application/javascript">
  const str = <?=json_encode($str)?>;
</script>

这将 return 表示您的字符串的 JSON,这意味着:

  • 会用双引号括起来
  • 转义可能在字符串本身中的双引号
  • 转义 Unicode 字符

仅此代码(const str = ...),XSS风险绝对为零。 String本身是安全的,可以被JS操作

但是,如果你像这样使用该字符串,它可能会成为 XSS 危险:

  • eval(str); 原因显而易见
  • elem.innerHTML = str; 例如 str === '<button onclick="sendCookiesToEvilServer()">Click me</button>''<style>body { display: none; }</style>'
  • ...该列表并不详尽

如果您想向用户显示该字符串,请选择 .innerText 而不是 .innerHTML,或者查看 strip_tags.

如果您确实需要使用 innerHTML 因为字符串允许包含一些 HTML,您需要针对 XSS 对其进行适当的清理。而且它有点难,因为那样的话,你需要一个解析器来 allow/remove 只有一些 HTML 标签 and/or 属性。 strip_tags 将允许您在一定程度上这样做 (例如,您只能允许 <b>,但这不会阻止 <b> 具有属性onclick="...").