我一直在寻找有关在javascript环境中使用PHP json_encode的安全问题,但我对结果并不完全满意
我收到很多关于这样做的警告,但他们总是假设我要将json_encode对象的数据直接注入HTML而不进行任何类型的清理
所以,我想知道是否只有这个小片段会出现任何安全问题(如xss攻击等)
<?php
$obj = isset($_POST['js']) ? json_encode($_POST['js']) : false;
if ($obj === false) $obj = '{}';
?>
<script>var x = <?php echo $obj ?>;</script>
编辑:
更改了片段以处理返回false的json_encode
答案 0 :(得分:1)
使用该行代码
var x = <?php echo $obj ?>;
...服务器应用程序回送通过“js”键提交给它的数据。它将是发送它的客户端将接收它,所以如果它在某种程度上是恶意的,那将是同一个客户处理后果。
实际发送到服务器实际上是链中不相关的部分:如果有人要提交数据,也可以直接将其分配给变量x
而不会受到服务器的干扰(例如通过浏览器的开发)工具)。
如果在PHP中您将使用数据来操作服务器数据库,调用服务或以其他方式更改应用程序的状态,那将是一个不同的故事,您将不会首先验证该数据。
关于json_encode
的使用:如果确实验证了参数是有效的JSON(通过检查返回值不是false
),它将生成一个有效的JavaScript对象文字。不会出现已知的不兼容情况(字符U+2028
和U+2029
),因为默认情况下json_encode
会转义这些字符。
答案 1 :(得分:-1)
根据编码是正确的。但是,您必须验证变量x
不应为空或已发布的值。
<script>var x = "<?php if(isset($_POST['js']))
{
echo json_encode($_POST["js"]);
}";
</script>
答案 2 :(得分:-1)
有时json_encode返回false,如果返回js表达式就会破坏。这样会更安全。
<script>var x = JSON.parse(<?php echo (json_encode($_POST["js"]) ? json_encode($_POST["js"]) : '{}'));</script>
如果json_encode返回false,则var x将只获得空对象。