2011-09-10 8 views
1

私は、これは、これまでうまく働いてい、単純なSQLの問題:含まれているテキスト文字列でSQLのINSERT文を作る '文字

INSERT INTO Table1 
VALUES (value1, value2, value3…) 

の構文に従ってください。しかし今、私は "私は家に帰る"のような普通の英語のテキストを含むいくつかの値を持っています。 '文字はC#のSQLコマンドを破棄します。私は次のように書かれている:

command.CommandText = "INSERT INTO Bio VALUES ('" + name + "','"I'm going home" + "'); 

は明らかに動作しません

INSERT INTO Bio VALUES ('Peter','I'm going home') 

に評価されます。特殊文字がSQL文を壊さないようにするにはどうすればよいですか?

答えて

8

天国のために使用SqlParameter。そうしないと、プログラムはSQL Injectionに脆弱になります。また、特殊文字の問題も解決します。

+3

を意味し、パラメータ化クエリは、最適化の恩恵を受ける可能性が高い - などのプリコンパイル、サーバー側のキャッシング、 –

+0

はありがとうございます。これは明らかな答えです。 –

1

を2つの使用単一引用符あなたの代わりにこのようなあなたのクエリを構築する、あなたが選択した言語でパラメータ化クエリを使用する必要があります。また

を脱出したい単一引用符がある時はいつでも。文字をエスケープすると、SQLインジェクションの扉が開きます。

4

は、あなたのプロバイダのパラメータ化クエリについて学びます。彼らは、私はそれが消え、すべてそのSQLインジェクションのものを作る

HttpUtility.HtmlEncode(text) 

使用しないなど、ODBC、OLEDB、SQL、

command.CommandText = "INSERT INTO Bio Values (@name, @text)"; 
command.Parameters.Add(/* appropriate param type for your provider */); // add for @name, @text, etc. 
// execute query 
+0

私はそれらを以前使用しました。しかし、今私はその目的を理解しています。 –

-1

のために存在し、それがパラメータを使用するよりも簡単そうです。 は、バックあなたはそれが

+0

を参照してください[私にパラメータ化されたSQLを与える、または私に死を与える](http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html)。パラメータは難しくありません@Anthony Pegramの例を見てください。あなたは冗長ADO.NETを見つけた場合は、[ORM](http://en.wikipedia.org/wiki/Object-relational_mapping)を使用することを検討してください。 – TrueWill

+0

データの純度を破壊します。データは、それを使用しているアプリケーションから独立していなければなりません。まず名前 'O'Connel'は' O'Connel'、ない 'O ' Connel'でなければなりません。デスクトップアプリケーションで使用され、WSDL/REST APIを介してクエリされ、集約され、分析されます。 – Oybek

1

通常あなたが別のものでスクリーニングすることにより、単一引用符をエスケープすることができ受けた形で、あなたの入力を取得する

HttpUtility.HtmlDecode(text) 

を使用することを忘れないでください。私はあなたがパラメータを使用することをお勧めしかし は、例えば、以下は有効な文

INSERT INTO myTable (Column1) VALUES ('Hello I''m Jack'); 

です。

command.CommandText = "INSERT INTO Bio VALUES (@Name, @OtherValue)"; 
command.Parameters.AddWithValue("Name", name); 
command.Parameters.AddWithValue("OtherValue", "I'm going home"); 

パラメータを使用することを推奨する点の1つは、書式設定などの負担がないことです。私はそれに加えてなど、日付値、uniqueidentifiers、

関連する問題