将php信息添加到javascript中的安全性


Security of adding php information into javascript

我的脚本运行得很好,但我已经阅读了一些内容,现在我想知道这段代码是否安全,如果不安全,什么是安全的&正确的实现方式:

<?php
function get_current_page_url()
    {
        $url = $_SERVER['REQUEST_URI'];
        $main_url = explode('?', $url);
        $main_url = explode('/', $main_url[0]);
        return $main_url = end($main_url);
    }
?>
<script type="text/javascript">
var pageUrl = "<?php echo get_current_page_url() ?>?" + form_data;
</script>

你能用secure&实现它的正确方法,防止这些安全问题?

将PHP中的内容注入<script>块中的JavaScript文本:

var current = <?php echo json_encode(get_current_page_url(), JSON_HEX_TAG); ?>;
var pageUrl = current + '?' + form_data;

JSON编码生成一个包含引号的字符串文本。这对于JavaScript来说已经足够好了,因为JSON文本(几乎)是JavaScript文本的子集。

("几乎"是因为由于设计上的疏忽,JSON字符串文字中允许原始字符U+2018和U+2019,但JavaScript不允许。这在这里无关紧要,因为PHP无论如何都会将这些字符和其他非ASCII字符编码为'u转义。)

JavaScript被封装在HTML文档中的<script>块中,因此,如果字符串</script>在PHP字符串中,它就不会直接出现在源代码中,这一点至关重要——如果它出现了,它不仅会结束字符串文本,还会结束整个脚本块。JSON_HEX_TAG通过用转义'u003C替换<来防止这种情况的发生。从PHP 5.4开始,这并不是完全必要的,因为这些版本默认情况下也会转义/

使用JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS将对HTML上下文中的更多特殊字符进行编码,这在这里并不完全必要,但可以将其注入HTML <script>块、XHTML <script>块或HTML onxxx="..."事件处理程序中的字符串,而无需执行这些地方可能需要的htmlspecialchars()的额外层。

话虽如此,您最好不要向JavaScript中注入,因为很难跟踪多个嵌套的注入上下文。最好将JS完全排除在HTML文档之外。您可以使用普通的旧HTML转义将内容注入data-属性,就像您应该在将内容放入HTML的任何地方使用一样,然后直接从DOM:读取字符串

<body data-current-url="<?php echo htmlspecialchars(get_current_page_url()); ?>">
...
var current = document.body.getAttribute('data-current-url');
var pageUrl = current + '?' + form_data;

已经说过了,在这种情况下,所有这些都可能是多余的,因为您已经可以使用location对象直接从JavaScript读取文档的URL了。除非你正在做一些涉及mod_rewrite的古怪事情,否则只说也是一样的

var pageUrl = location.pathname.split('/').pop() + '?' + form_data;

如果你只想用不同的查询字符串创建一个到当前页面的相对链接,你甚至不需要这样做,你可以简单地使用'?' + form_data