[英]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>
您能否以安全且正确的方式来编写该问题的答案,以防止这些安全问题发生?
在<script>
块中将PHP中的内容注入到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\u003c/code>还是会逃脱。)
JavaScript包含在HTML文档的
<script>
块中,因此至关重要的是,如果字符串</script>
在PHP字符串中,则它不会直接出现在源代码中—如果这样做了,则它不仅会结束字符串文字,但整个脚本块。 JSON_HEX_TAG通过将<
替换为转义\<
来防止这种情况的发生。 从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-
- 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
'?' + form_data
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.