【问题标题】:Security of adding php information into javascript将php信息添加到javascript中的安全性
【发布时间】:2016-01-02 17:32:54
【问题描述】:

我的脚本工作得非常好,但我已经阅读了一些内容,现在我想知道这段代码是否安全,如果不是,那么实现它的安全和正确方法是什么:

<?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>

【问题讨论】:

  • 为什么当前页面的url会是机密信息?用户可以在地址栏中一直看到它。
  • 另外,为什么不直接从 javascript 获取这些信息呢?来自位置对象?
  • 或者使用相对路径..
  • 同意直接从 JS 读取location.search 似乎是一种更简单的方法。但是,是的,无论如何,您在这里都有 JavaScript 注入和 HTML 注入,因为您没有为 &lt;?php echo 中的周围上下文转义。
  • @toskv 因为我们以一种独特的方式使用 mod_rewrite,因此无法直接从 JS 获取它

标签: javascript php security


【解决方案1】:

您能否用安全且正确的方式来解决这个问题,防止这些安全问题?

将 PHP 中的内容注入到 &lt;script&gt; 块中的 JavaScript 文字中:

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

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

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

JavaScript 包含在 HTML 文档中的 &lt;script&gt; 块中,因此如果字符串 &lt;/script&gt; 在 PHP 字符串中,则它不会直接出现在源代码中,如果它出现,它将结束,这一点很重要不仅是字符串文字,还有整个脚本块。 JSON_HEX_TAG 通过将&lt; 替换为转义符\u003C 来防止这种情况发生。从 PHP 5.4 开始,这不是完全必要的,因为这些版本默认也会转义 /

使用JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS 将编码更多在 HTML 上下文中特殊的字符,这在此处并非完全必要,但允许您在 HTML &lt;script&gt; 块以及 XHTML &lt;script&gt; 中注入字符串块或 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

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 2015-10-04
    • 2020-09-13
    • 1970-01-01
    • 2012-06-15
    • 2015-08-05
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多