2012-10-10 65 views
10

私は簡単な質問を受けました: ユーザー入力をサニタイズするのはいつベストですか? これらのいずれかがベストプラクティスと考えられています。ユーザー入力をlaravelでサニタイズする

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

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

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

+0

削除答え。私は思っているようにハードな、または速い方法はありません...フィルターの内容、IPアドレスへのクッキーの結びつき.Wikiのエントリには良い情報のロードがありますhttp: //en.wikipedia.org/wiki/Cross-site_scripting –

+0

@DavidBarker、あなたは間違っています。私が必要とするのは、ユーザー入力を表示するときにタグとJavaScriptが実行されないようにすることです。 – warmspringwinds

答えて

11

あなたは両方の場所が必要ですが、理由は異なると言います。データが到着したら、ドメインに従ってデータを検証し、要求に従わない要求を拒否する必要があります。たとえば、数字が必要な場合は、タグ(またはその件についてはテキスト)を許可することに意味がありません。 1年を表すパラメータについては、それがある範囲内にあることを確認したいこともあります。 フリーテキストフィールドのサニタイズが開始されます。 0バイトのような予期しない文字に対しても単純な検証を行うことができます。 IMHO安全なSQL(パラメーター化された照会)を介して生データを保管し、出力のために正しくエンコードすることが最善です。 2つの理由があります。第一に、サニタイザにバグがある場合、データベース内のすべてのデータで何をしているのでしょうか? Resanitizingは望ましくない結果をもたらす可能性があります。第二に、あなたは、私は、あなたがhttp://usman.it/xss-filter-laravel/それが役に立つかもしれません、Laravelに入力フィルタリングの記事全文を持ってここにあるあなたが(JSONやHTML、HTML属性など)を使用している方の出力のためのコンテキストエスケープ、

1

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

前述の例(コードスニペット)のようなものであれば、RAW形式(データベースが破損していないことを確認してください)に出力してください。 PHPを使用する場合は、htmlentities($string)を使用できます。

9

をしたいです

頻繁に必要となるかもしれない一般的な方法を書くためのライブラリがない場合は、グローバルXSSを自分で行うことができます。アプリケーション/ライブラリに新しいライブラリCommonを作成するよう依頼します。そして、(アプリケーション/ routes.phpの中に)あなたの前にフィルタの冒頭にこのコードを入れ

/* 
* 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; 
} 

:あなたの共通ライブラリでは、この2つのメソッドを入れ

//Our own method to defend XSS attacks globally. 
Common::global_xss_clean(); 
+0

どうすれば 'foo"のようなものを防ぐことができますonload = alert(document.cookie) '? – 735Tesla

3

私はこの質問を見つけました。これを行うもう1つの方法は、動的出力をこのような三角括弧で囲むことです。ブレードはあなたのために文字列をエスケープします。{{{ $var }}}そうすれば、潜在的に危険な文字をコードのどこか他の場所で重要なものにしておき、エスケープ文字列として表示することができます。

+0

' echo'を使う必要はありません。 –

+0

@HasibMahmud – 735Tesla

0

私はlaravelにおけるXSSを心配していたので、私はこれを見つけたので、これはパッケージgvlatko

それは簡単です:

クリア入力に

= $清掃= XSS ::クリーン(入力: :( 'コメント')を取得します。

ビューで使用するには= $清掃= XSS ::クリーン(入力::ファイル( 'プロフィール')、TRUE);

それはXSSに適用さdidntのよう