web-dev-qa-db-ja.com

PHP)を使用してJSONデータをファイルに安全に書き込む方法

画像編集用のHTMLフォームがあります。すべてのデータはJSONで保存されます。現在の画像を変更するときは、PHPスクリプトを使用して、変更をテキストファイルに保存します。前の画像に戻ると、この構成はこのファイルからフォームに再度送信されます。

私の質問は:

この種のデータを安全に読み書きする方法。JS/ PHPコードのインジェクションを防ぐために、どこでどのように効果的にデータをチェックしますか?

以下にいくつかのコンセプトコードを添付しました。

JavaScript(jQueryを使用):

// Writing
$.ajax({
    global: false,
    type: "POST",
    cache: false,
    dataType: "json",
    data: ({
        action: 'write',
        config: JavaScriptJSON_Obj
    }),
    url: 'read-write.php'
});

// Reading
$.ajax({
    global: false,
    type: "POST",
    cache: false,
    dataType: "json",
    data: ({
        action: 'read'
    }),
    url: 'read-write.php',
    success: function(data){
        JavaScriptJSON_Obj = data;
    }
});

PHPの例(read-write.php):

switch ($_REQUEST['action']) {
    case 'write':
        file_put_contents('config.txt', $_REQUEST['config']);
        break;
    case 'read':
        $s = file_get_contents('config.txt');
        echo json_encode($s);
        break;
}
15
Max Barnas

まず、JSONはJavaScriptではなく、その逆も同様です。そして、JSONはJavaScriptの適切なサブセットではありません。

さらに、一部のユーザー入力をPHPとして解釈することも、一部の出力をJavaScriptとして解釈することもないため、心配する必要はありません。ただし、出力を適切に指定することを忘れないでください。

header('Content-Type: application/json;charset=utf-8');
$s = file_get_contents('config.txt');
echo json_encode($s);
5
Gumbo

コードの問題は、コードが機能しないこと、セキュリティの問題は別としてです。ファイルに保存する前に、データをシリアル化するか、jsonにエンコードする必要があります。このような:

switch ($_REQUEST['action']) {
    case 'write':
        file_put_contents('config.txt', json_encode($_REQUEST['config']));
        break;
    case 'read':
        readfile('config.txt');
        break;
}

シリアル化は次のように機能します。

switch ($_REQUEST['action']) {
    case 'write':
        file_put_contents('config.txt', serialize($_REQUEST['config']));
        break;
    case 'read':
        $data = unserialize(file_get_contents('config.txt'));
        echo json_encode($data);
        break;
}

読み取り/書き込み先のパスが正しいことを確認する限り、このコードにコードインジェクションの問題はありません。唯一の潜在的な問題は、使用するファイルを選択できる場合です(コードに "config.txt"をハードコードするのではなく)。次に、ファイルが特定のディレクトリなどにあることを確認するために検証する必要があります。

6
Jakob Egger

返されるデータを常にチェックして、期待する形式であるかどうかを確認します。画像を保存しているとしましょう... MIMEチェックなどを使用して、画像であることを確認してください。サーバーにデータをそのまま保存するだけでは、潜在的なセキュリティの問題が発生する可能性があります。

どの画像が表示されたかに関するデータを保存するだけの場合でも、そのデータにアクセスして使用する方法と場所によっては、問題が発生する可能性があります。そのため、整数以外を除外する場合は、受信して保存するデータが整数以下であることを確認してください。

0
inquam