13

簡単な質問があります。ユーザー入力をサニタイズするのに最適なのはいつですか。そして、これらのどれがベストプラクティスと見なされますか:

  1. データベースに書き込む前にデータをサニタイズします。
  2. 生データを保存し、ビューでサニタイズします。

たとえば、HTML::entities()結果を使用してデータベースに保存します。またはHTML、ビューでメソッドを使用します。この場合、laravelはデフォルトでを使用するためですHTML::entities()。または、両方を使用することもできます。

編集:興味深い例http://forums.laravel.com/viewtopic.php?id=1789を見つけました。これを解決する他の方法はありますか?

4

5 に答える 5

12

両方の場所が必要だと思いますが、理由は異なります。データが入ってきたら、ドメインに従ってデータを検証し、準拠していないリクエストを拒否する必要があります。例として、数値が必要な場合にタグ (またはテキスト) を許可しても意味がありません。年を表すパラメータの場合、ある範囲内にあるかどうかを確認することもできます。フリーテキストフィールドのサニタイズが開始されます。0 バイトなどの予期しない文字については、簡単な検証を行うことができます。私見では、安全な sql (パラメーター化されたクエリ) を使用して raw を保存し、出力用に正しくエンコードすることをお勧めします。理由は 2 つあります。1 つ目は、サニタイザーにバグがある場合、データベース内のすべてのデータをどうするかということです。再サニタイズは望ましくない結果をもたらす可能性があります。次に、使用している出力 (JSON、HTML、

于 2012-10-11T04:56:53.937 に答える
10

Laravel での入力フィルタリングに関する完全な記事があります。役立つかもしれませんhttp://usman.it/xss-filter-laravel/。この記事からの抜粋を次に示します。

グローバルな XSS クリーンを自分で行うことができます。頻繁に必要になる共通メソッドを記述するためのライブラリがない場合は、新しいライブラリ Common を application/library に作成するようお願いします。この 2 つのメソッドを Common ライブラリに追加します。

/*
 * Method to strip tags globally.
 */
public static function global_xss_clean()
{
    // Recursive cleaning for array [] inputs, not just strings.
    $sanitized = static::array_strip_tags(Input::get());
    Input::merge($sanitized);
}

public static function array_strip_tags($array)
{
    $result = array();

    foreach ($array as $key => $value) {
        // Don't allow tags on key either, maybe useful for dynamic forms.
        $key = strip_tags($key);

        // If the value is an array, we will just recurse back into the
        // function to keep stripping the tags out of the array,
        // otherwise we will set the stripped value.
        if (is_array($value)) {
            $result[$key] = static::array_strip_tags($value);
        } else {
            // I am using strip_tags(), you may use htmlentities(),
            // also I am doing trim() here, you may remove it, if you wish.
            $result[$key] = trim(strip_tags($value));
        }
    }

    return $result;
}

次に、このコードを before フィルターの先頭 (application/routes.php 内) に挿入します。

//Our own method to defend XSS attacks globally.
Common::global_xss_clean();
于 2013-02-11T13:14:10.657 に答える
3

この質問を見つけました。これを行う別の方法は、動的出力をこのように三重括弧で囲むことです。これにより{{{ $var }}}、ブレードが文字列をエスケープします。こうすることで、潜在的に危険な文字がコード内の別の場所で重要な場合に備えて保持し、エスケープ文字列として表示することができます。

于 2014-01-08T18:23:46.790 に答える
1

これは、ユーザーの入力に依存します。彼らが提供する可能性のあるコードを一般的に出力する場合 (たとえば、コード スニペットを提供するサイトである場合など)、出力時にサニタイズします。それは文脈に依存します。あなたがユーザー名を尋ねていて、彼らが HTML タグを入力している場合、あなたの検証はこれを拾い上げ、「いいえ、これはクールではありません!」となるはずです。

前に述べた例 (コード スニペット) のような場合は、RAW として通過させ (ただし、データベースが壊れないようにしてください)、出力時にサニタイズします。PHP を使用する場合は、htmlentities($string).

于 2012-10-11T04:38:40.913 に答える