2016-04-29 23 views
0
var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE " + aColumn + " = '" + passedInValue + "'"); 

// normally when using parameters I would do something like this: 
var valueParam = SqlParameter("aValue", passedInValues); 
var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE Column1 = @aValue", valueParam); 
// NOTE: I would not do this at all. I know to use LINQ. But for this question, I'm concentrating on the issue of passing variables to a raw sql string. 

ではなく、列と値の両方がで「パラメータ」されているので、生のSQLを安全に作る:Entity Frameworkの

var retval = db.TestTable.SqlQuery("SELECT * FROM dbo.TestTable WHERE " + aColumn + " = '" + passedInValue + "'"); 

、両方のSQLインジェクションを防ぐためにあるのでしょうか?

答えて

1

first:whilelist aColumn:これは文字列の連結によって追加する必要がありますが、データベースのどの列がわかるか(またはスキーマビューを使用して確認できます)。

第2:エンティティフレームワークでは、表示するとおり、クエリの値にパラメータを使用できます。ただし、SqlParameterインスタンスを作成するのではなく、値を渡して@p0@p1、...を使用することができます。 SQLインジェクションを防ぐために

+0

あなたは、あなたの答えの最初の部分を拡張することができますか? 'whilelist 'aColumn'はどういう意味ですか? –

+0

@DaBestホワイトリストカラム: 'aColumn'があなたの既知のカラムのリストで完全に一致しない場合に失敗します:' if(!safeColumList.Contains(aColumn))throws new SecurityException( "Hacker !!"); '。 – Richard