如何在javascript字符串中防止XSS

时间:2017-02-23 17:05:56

标签: javascript php xss

我们说我有这样的事情:

<script>
var string = '<?= $_GET['var'] ?>';
</script>

为防止XSS,我想确保单引号被转义。 addslashes可以做到这一点,但人们仍然可以通过设置$_GET['var']来解决这个问题。例如

<script>
var string = '</script><script>alert(/test/)</script>';
</script>

也许我应该逃避(使用\)单引号和<?这是我需要逃脱的吗?

我认为这样的攻击现在更加困难,因为浏览器经常禁止在GET字符串中显示的代码被运行但是idk我仍然认为它应该受到保护。

2 个答案:

答案 0 :(得分:1)

通过

<script>
var string = <?= json_encode($_GET['var']) ?>;
</script>

没有周围的引号。

答案 1 :(得分:0)

<script>
var string = <?= json_encode($_GET['var'], JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS) ?>;
</script>

请注意,不需要周围的报价。 json_encode()生成带引号的字符串"bla-bla-bla"。 参数JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS"<>&'转换为十六进制,如\u003C。当JS内联时,这有助于防止XSS:

<?php
    $_GET['var'] = " '><a href=/test>click me<!--";
?>
<div onmouseover='x = <?= json_encode($_GET['var'], JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS) ?>'></div>