如何使用 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="..."
).
考虑通过 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="..."
).