我们说我有这样的事情:
<script>
var string = '<?= $_GET['var'] ?>';
</script>
为防止XSS,我想确保单引号被转义。 addslashes
可以做到这一点,但人们仍然可以通过设置$_GET['var']
来解决这个问题。例如
<script>
var string = '</script><script>alert(/test/)</script>';
</script>
也许我应该逃避(使用\
)单引号和<
?这是我需要逃脱的吗?
我认为这样的攻击现在更加困难,因为浏览器经常禁止在GET字符串中显示的代码被运行但是idk我仍然认为它应该受到保护。
答案 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>