web-dev-qa-db-ja.com

laravel)でユーザー入力をサニタイズする

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

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

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

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

12
warmspringwinds

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

12
Erlend

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

自分でグローバルXSSクリーンアップを行うことができます。頻繁に必要になる可能性のある共通メソッドを作成するライブラリがない場合は、アプリケーション/ライブラリに共通の新しいライブラリを作成するようにお願いします。この2つのメソッドを共通ライブラリに配置します。

/*
 * 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/routers.php内)に配置します。

//Our own method to defend XSS attacks globally.
Common::global_xss_clean();
9
Muhammad Usman

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

3
735Tesla

ユーザー入力によって異なります。彼らが提供する可能性のあるコードを一般的に出力する場合(たとえば、コードスニペットを提供するサイトなど)、出力をサニタイズします。それは文脈に依存します。ユーザー名を要求していて、HTMLタグを入力している場合、検証ではこれを取得して「いいえ、これはクールではありません」と実行する必要があります。

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

1
Oddman

laravelのxssが心配だったので、これを見つけたので、これはパッケージです gvlatko

容易いものだ:

入力をクリアするには= $ cleaned = Xss :: clean(Input :: get( 'comment');

ビューで使用するには= $ cleaned = Xss :: clean(Input :: file( 'profile')、TRUE);

0
Andres Felipe