这样做安全吗? PHP的json_encode和javascript

时间:2017-11-21 05:41:02

标签: javascript php html security

我一直在寻找有关在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

3 个答案:

答案 0 :(得分:1)

使用该行代码

var x = <?php echo $obj ?>;

...服务器应用程序回送通过“js”键提交给它的数据。它将是发送它的客户端将接收它,所以如果它在某种程度上是恶意的,那将是同一个客户处理后果。

实际发送到服务器实际上是链中不相关的部分:如果有人要提交数据,也可以直接将其分配给变量x而不会受到服务器的干扰(例如通过浏览器的开发)工具)。

如果在PHP中您将使用数据来操作服务器数据库,调用服务或以其他方式更改应用程序的状态,那将是一个不同的故事,您将不会首先验证该数据。

关于json_encode的使用:如果确实验证了参数是有效的JSON(通过检查返回值不是false),它将生成一个有效的JavaScript对象文字。不会出现已知的不兼容情况(字符U+2028U+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将只获得空对象。