0

jQuery を介して JSON 形式のデータを取得しており、それをユーザーに表示する必要がありますが、XSS 攻撃に対して脆弱です。ここでのオプションは何ですか? データをデータベースに入れる前に文字を削除する必要がありますか? 私が使用しているフレームワーク(Kohana)には気の利いた機能HTML::Chars();がありますが、javascriptでデータを表示しているため、そこでは使用できません。

1つのオプションは、jsonでエンコードされているすべての配列要素を調べて適用HTML::Chars();することです。それが唯一の選択肢ですか?もしそうなら、これを行う最適な方法は何ですか?

例:

  1. ユーザーはいくつかのデータを入力します:title, body
  2. データはデータベースに保存されます
  3. 次に、他のユーザーがサイトに入り、データ配列がデータベースから取得され、json 形式にエクスポートされます
  4. 私のjQueryスクリプトはjsonを取得し、新しい要素をページの本文に追加しています。

コード:

$(document).ready(function(){
    $.ajax({
        url: '/timeline/latest/1',
        dataType: 'json',
        success: function(data){
            $.each(data, function(key, val) {
                switch (val.type){
                    case 'post': // I have only made post so far
                        addPost(val);
                        break;
                }
            });
        }
    });
})
function addPost(val){
    $('.content .timeline').prepend(val.title + '<br />' + val.body); // xss vulnerable
}

データベースからデータを取得する

<?php

class Controller_Timeline extends Controller{
    public function Action_Latest(){
        $parentID = $this->request->param('id');
        $modelTimeline = new Model_Timeline();

        // Here I get latest entries, big array
        $latest = $modelTimeline->Latest($parentID);

        // Response it and encode with JSON
        $this->response->body(json_encode($latest));
    }
}

これまでの私の解決策は次のとおりです。 $latest をエコーアウトする前に、配列をウォークスルーしてアンチ xss 関数を適用しますが、それがどれほど最適かはわかりません。

array_walk($latest, function(&$latest){
    foreach ($latest as &$key){
        $key = HTML::chars($key);
    }
});
4

2 に答える 2

1

Drupal のようにすることをお勧めします。

Drupal は入力をフィルタリングしません。この HTML コードがフィルタリングされずに表示された場合、XSS の脆弱性を持つデータベースにテキストを保存します。

代わりに、出力をフィルタリングします。あなたは間違いなくサーバー側でそれを行うべきです。

filter_xss()Drupal が使用する関数からインスピレーションを得る必要があります。

各エントリに適用されていることを確認してください。もちろん、次のように、可能であればグローバルに実行します。

// In the Model_Timeline class
public function Latest( $id ) {

    // Get your array, and then
    foreach ( $array as $entry ) {

        // Filter each entry
        // I use $util->filter_xss but use it how you implemented it
        $entry = $util->filter_xss( $entry );
    }

    // And return the filtered array
    return $array;
}
于 2012-04-26T11:00:36.567 に答える
0

データベースに保存する前にmysql_real_escape_stringを呼び出す必要があります。htmlspecialcharsはオプションです。あなたの問題は、ユーザーにhtmlを表示したくないということです。そのため、htmlspecialcharsはそのようなものをエンコードする<a>ため機能&lt;a&gt;しないため、ユーザーページでhtmlを使用する場合は適切ではありません(冗長になるように、再び使用可能なhtmlに戻す必要があります)。

この場合、簡単な答えはありません-それはあなたが扱っているhtmlの種類に依存しますか?それが純粋にプレゼンテーションである<em> <p> <strong>場合は、htmlサーバー側を厳密に解析し、これらのものだけが含まれていることを確認し、のような危険なものを拒否または削除する必要があり<script>ます。ただし、onClick = "do something bad"のような要素属性のjavascriptにもうんざりする必要があるため、より複雑です。

要約すると、PHPでJSONを送信する前にHTMLをサニタイズします。これは、最高の担当者です:http: //htmlpurifier.org/

于 2012-04-26T11:10:39.513 に答える