2011-08-09 14 views
4

には、以下のURLを考える:データバインドされたリピータコントロールでクエリ文字列をサニタイズする方法は?

domain.com/page.aspx?id=123 

それは、このようなリピータのSqlDataSourceコントロールとしてデータバインドコントロールで使用されたとき、私はそのクエリ文字列値をサニタイズすることができますどのように?

<asp:SqlDataSource ID="projectDataSource" runat="server" 
    ConnectionString="MyConnectionStrings" 
    SelectCommand="select foo from bar"> 
    <SelectParameters> 
     <asp:QueryStringParameter 
      DefaultValue="0" 
      Name="idfromqs" 
      QueryStringField="id" 
      Type="Int32" /> 
    </SelectParameters> 
</asp:SqlDataSource> 

このように?id=asdfに間違いはありませんか?

これらに類似の質問は良い答えを持っていますが、それらのどれも非常に私の問題

注:これは、ローカルIPアドレスの小さなブロックに制限されている内部アプリケーションです。私は、悪意のあるSQLインジェクションを心配することは少なく、精通していないユーザーには厄介なエラーメッセージが表示されないようにします。

答えて

2

SQLDataSourceのイベントSelectingを使用して、照会値を確認できます。 Selectメソッドが呼び出される前にこのイベントが発生します。

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e) 
{ 
    SqlDataSource1.SelectParameters.Clear(); //Clear existing parameters 
    // based on your check, you can pass the default value 
    SqlDataSource1.SelectParameters["idfromqs"].DefaultValue = "Set Value here"; 

} 
+0

だから、:SqlDataSourceコントロールは、クエリがデータベース上で実行される前にトリガーされるイベントがあり、そしてこのイベントに私が進む前に、値が正しいかどうかを確認たりすることはできませんか? –

+0

yah、それは100%正しいです。 –

1

ただオフにしてください。 querystringは明示的に別のもの(int32のようなもの)に変換しない限り、すでに文字列です。 int32に変換する何らかの理由がある場合は、ロジックを適用するのが簡単な場所でコードを後で行うことができます。私が正しく理解していれば

<asp:QueryStringParameter 
    DefaultValue="0" 
    Name="idfromqs" 
    QueryStringField="id" /> 
+1

IDがintで、文字列(WHERE id = 'asdf')と比較した場合、何も得られません。エラーもありません。パラメータを使用している限り、注入に関する問題はありません。もちろん、クエリ文字列のid変数が数値ではない値を持っていると、それを調べる価値があるかもしれません。 – Chains

+0

えええええええええええええええええええええええええええええええええええええええええええええ投稿者:何も返さず、空のコントロールを持っているのとは対照的に、データベースからnvarchar値 'asdf'をデータ型intに変換すると変換に失敗しました。 –

+0

これは、SQLサーバの話のように聞こえます...その変数を使って何をしていますか? – Chains

関連する問題