我的脚本工作得很好,但我已经阅读了一些内容,现在我想知道这段代码是否安全,如果不安全,实现它的安全和正确的方法是什么:
<?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>
最佳答案
Can you write an answer to this question with the secure & correct way to implement it, preventing these security issues?
将 PHP 内容注入(inject)到 <script>
中的 JavaScript 文本中 block :
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 包含在 <script>
中HTML 文档中的 block ,因此如果字符串 </script>
位于 PHP 字符串内部,它不会直接在源代码中出现 - 如果出现,它不仅会结束字符串文字,还会结束整个脚本 block 。 JSON_HEX_TAG 通过替换 <
来防止这种情况发生。与逃脱\u003C
。从 PHP 5.4 开始,这并不是完全必要的,因为这些版本也逃脱了 /
默认情况下。
使用JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS
将对 HTML 上下文中的更多特殊字符进行编码,这在此处并非完全必要,但允许您注入(inject) HTML <script>
中的字符串。 block 以及 XHTML <script>
block 或和 HTML onxxx="..."
事件处理程序,无需执行 htmlspecialchars()
的额外层这在这些地方可能是必要的。
话虽如此,您最好根本不注入(inject) JavaScript,因为跟踪多个嵌套注入(inject)上下文很困难。理想情况下,最好将 JS 完全排除在 HTML 文档之外。您可以将内容注入(inject) data-
具有普通旧 HTML 转义的属性,就像您应该在将内容放入 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
.
关于javascript - javascript中添加php信息的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34568686/