2017-04-09 181 views
2

我有这个代码检查json是否有效,如果是,json中的每个对象都计为1美元(我的网站上的货币)。下面是代码这个JSON代码是否安全?

<?php 
if(isset($_POST['data'])) { 
    $testJson = json_decode($_POST['data']); 
    if($testJson) { 
    $price = 0; 
    foreach($testJson as $amount) 
     // I do something with $amount... 
     $price++; // Augment the price 
    } 
    } 
} 

所以基本上如果$_POST['data'][{"item":2,"id":1092,"x":198,"y":-1}],那么价格将是1美元。如果它是[{"item":2,"id":1092,"x":198,"y":-1},{"item":2,"id":1098,"x":198,"y":-1}]价格将是2等...

我的问题是,有人可以操纵JSON,以便他们可以购买0美元的项目,即使有JSON字符串内有多个对象?

谢谢

+0

更让我担心的是,如果价格是200美元呢?或者更糟的是,十个盛大? – Prajwal

+0

@Prajwal不哈哈!在我的网站(游戏)的货币是不实际的美元过程中,他们可以操纵什么被发送到服务器的 – Jane

+0

....你永远不能信任用户输入 – charlietfl

回答

1

如果你读了OWASP top 10,那么你就可以看到这个代码很容易受到CSRF。我也会密切关注SQL注入,因为这在PHP中很常见,因为许多应用程序不使用ORM。

+0

谢谢回答,我意识到这一点,但这码只是一个演示,而不是实际的演示 – Jane

+0

@Jane你还没有提供足够的细节让任何人准确地回答你的问题。如果OWASP top 10没有回答您的安全问题,那么请考虑添加更多详细信息。 – rook

1

JSON代码本身是安全的(它只是一个字符串)。但是您需要验证/清理任何您从$ _POST变量中检索到的东西。

如果您想要将数据保存在mysql数据库中,您还应该使用预处理语句(http://php.net/manual/en/pdo.prepared-statements.php)对其进行消毒以防止sql注入。注意:mysql_real_escape_string不提供任何安全性,它只是转义字符串内的字符。

如果您希望在任何时候输出您从网站中的$ _POST中检索到的数据,您还应该将其转义(以确保您不会受到跨站点脚本攻击)。

我也建议你使用任何逻辑之前验证针对JSONschema的JSON。