2017-04-09 114 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。