我在我的网站上使用highslide库,有时不是所有时间,我使用的代码都打印在屏幕上,但我不知道为什么,这是我的代码:
<script type="text/javascript">
hs3.graphicsDir = '<?echo $RootPath;?>/ExternalLibrary/highslide/graphics/';
hs3.align = 'center';
hs3.transitions = ['expand', 'crossfade'];
hs3.fadeInOut = true;
hs3.outlineType = 'glossy-dark';
hs3.wrapperClassName = 'dark';
hs3.captionEval = 'this.a.title';
hs3.numberPosition = 'caption';
hs3.useBox = true;
hs3.width = 600;
hs3.height = 400;
hs3.addSlideshow({
//slideshowGroup: 'group1',
interval: 5000,
repeat: false,
useControls: true,
fixedControls: 'fit',
overlayOptions: {
position: 'bottom center',
opacity: 0.75,
hideOnMouseOut: true
},
thumbstrip: {
position: 'above',
mode: 'horizontal',
relativeTo: 'expander'
}
});
var miniGalleryOptions1 = {
thumbnailId: 'thumb1'
}
</script>
其中$ RootPath是php变量,其值为Portal。打印在屏幕上的代码是$ RootPath变量之后的代码,有什么想法吗?
答案 0 :(得分:0)
$ RootPath包含一些注入,并且不值&#34; Portal&#34; - 什么!?!?忍受我。
它包含&#34;&lt; / script&gt;&#34;或类似的;如果你是Doubting Taha,查看实际呈现的HTML 。这反过来导致浏览器关闭脚本元素,导致以下内容被处理为普通的非脚本HTML。 (如果遇到序列&#34;&lt; /&#34;,浏览器在技术上可以终止脚本元素的PCDATA,但据我所知,现代浏览器要求它至少为#34;&lt; /脚本&#34;。)
要修复/阻止此操作, 始终使用json_encode
来获取/作为JavaScript 中使用的PHP的值。这应该是自动,就像在将不保证安全的HTML文本写入HTML上下文时自动使用htmlentities一样。
以下是如何正确编写代码(尽管我建议使用<?= ?>
标记):
hs3.graphicsDir = <?echo json_encode("$RootPath/ExternalLibrary/highslide/graphics/"); ?>;
在此更改之后,注入将导致错误/无效的graphicsDir值,但它不&#34; break&#34; HTML本身。 (再次,查看实际HTML 以查看$ RootPath的真正价值。)
使用json_encode还可以整理PHP / JavaScript界面;在上面它允许省略周围的JavaScript引号,因为它们是生成的JSON String值的一部分。如果需要传递许多值,请考虑构造数组并使用相同的技术提供JSON编码的结果。