2011-01-24 5 views
2

は、我々は次のようにアクションメソッドでそれらをサニタイズする必要があります。アクションメソッドに渡される文字列以外のパラメータをサニタイズする必要がありますか?文字列パラメータの場合

public ActionResult Browse(string genre) 
{ 
     string message = HttpUtility.HtmlEncode(genre); 

     return View(message); 
} 

は、次のように非文字列のparamsをサニタイズすることが必要ですか?

public ActionResult Details(int id) 
    { 
     int data = int.Parse(HttpUtility.HtmlEncode(id)); 
     return View(data); 
    } 
+4

消毒のように見えていないことを、あなたはのparamsをコードHtmlのです。サニタイズとは、ユーザーからの入力を浄化することで、データベースを高品質にするものではありません。 HTMLエンコーディングは、間違った文字が表示されないようにします。実際にはintであることを保証できるので、intをエンコードしないと害はありません。私は変数にどのような型があるのか​​わからないPHPに慣れています。 – Endophage

答えて

5

個人的には、これらの入力をビューで消毒することをおすすめします。 WebFormsビューエンジンを使用している場合は、<%: ... %>を使用してください。また、Razorを使用している場合は、@演算子を使用できます。これにより、システムからのデータの流れがビューに依存しないようになり、データとモデルをより簡単に共有することができます。

たとえば、データベースに格納する前のHTMLエンコードデータは、将来データをCSVファイルとして出力するビューを作成することを非常に困難にします。ビューがこれを実行する責任がある場合、ビューは独自のアプリケーションに応じてCSVエンコーディングまたはHTMLエンコーディングを選択できます。

文字列パラメータの場合
+0

SQLインジェクション攻撃の脆弱性をなくしてユーザ入力を保存していますか? – xport

+3

@xport - LinqToSql、EF、または他の同様のORMフレームワークを使用している場合、エスケープ入力文字列を処理します。手作業でINSERT文を生成する場合は、パラメータ化されたSQL(http://www.bing.com/search?setmkt=en-US&q=parameterized+sql)を使用してSQLインジェクションから身を守ることができます。パラメータ化されたSQLの特定の構文は、データレイヤーによって異なります。 – Levi

2

あなたはMVCを使用している場合、実際に何らかの理由でHtmlEncodeでビューにデータを送信する理由はありません。その理由は、それが自分自身の視点でずっと簡単にできるからです。

<!-- WEB FORMS VIEW ENGINE --> 
<!-- This is already encoded --> 
<%: Model.genre %> 

<!-- This is NOT encoded --> 
<%= Model.genre %> 



<!-- RAZOR VIEW ENGINE --> 
<!-- This is already encoded --> 
@Model.genre 

<!-- This is NOT encoded --> 
@MvcHtmlString.Create(Model.genre) 

サニタイズは、ワックスの異なるボールです。ジェフアトウッドはコードhereを持っており、それについてはhereと話しています。覚えておいてください、あなたはデータベースにどんなユーザー入力を保存することもできます。それは消毒とHTMLエンコーディングを必要とする出力です。

文字列以外のパラメータをエンコードします。通常は必要ありませんが、<%: Model.genre %><%= Model.genre %>の違いは開発時にはあまり重要ではありません。

3

、我々は次のようにアクションメソッドでそれらをサニタイズする必要があります。

公共のActionResultブラウズ(文字列のジャンル){

string message = HttpUtility.HtmlEncode(genre); 

return View(message); 

}

あなたはshouldnコントローラーアクションでこれほどのことをしてはいけません。この文字列をデータベースに保存する場合は、そのまま保存してください。データベースは、エンコードされていないHTMLについてはあまり気にしません。時間が出力に来るときもちろん、これはあなたのビューにあなたはそれが適切にエンコードされていることを確認する必要があります。

<%= Html.Encode(message) %> // WebForms ASP.NET 2.0 
<%: message %> // WebForms ASP.NET 4.0 
@message // Razor ASP.NET 4.0 
+0

「暗号化されていないHTMLをデータベースに保存する」はSQLインジェクションに対して脆弱ですか? – xport

+1

@xport、もちろんそれは脆弱ではありません。文字列の連結ではなくSQLクエリを構築する際にパラメータ化されたクエリを使用するだけですが、すでにそれらを使用していますか? –

+0

私はEntity Frameworkを使用します。 – xport

関連する問題