2011-10-12 10 views
7

私は文字列を持っていますアポストロフィを文字列の二重アポストロフィと置き換える方法は?

good overview of ESP's in more detail than you probably needです。

それがエラーを与えているSQLテーブルに挿入しながら。だから私は

C#でこれを操作する方法

good overview of ESP''s in more detail than you probably need

のような二重のアポストロフィを文字列にアポストロフィを置き換えたいですか?

+1

あなたは、データベースのエスケープ関数を使用する必要があります。そうしないと、SQLインジェクションに脆弱なままになる可能性があります。 http://stackoverflow.com/questions/249567/algorithm-to-avoid-sql-injection-on-mssql-server-from-c-code – CheeseSucker

+0

または、さらに良い:パラメータ化クエリ。 – MatBailie

答えて

10

非常に簡単:

string s = "good overview of ESP's in more detail than you probably need."; 
string escaped = s.Replace("'","''"); 

注:コマンドのパラメータを使用することは通常より安全です。特に、入力文字列の値がコード(つまりユーザエントリ)によって制御されていない場合

+3

これは技術的には正しいですが、元の質問者を間違った方向に操縦しています。適切なパラメータを使用し、SQLインジェクションの脆弱性を回避する方がはるかに優れています。 –

+0

文字列がエスケープされていても、注射を続行できますか?私が理解しているように、注入は単一のapostophyを使用してSQLを早期に終了させます。 –

8

は、Parameterオブジェクトを使用します。

myCommand.InsertCommand.Parameters.Add("@myString", SqlDbType.VarChar, 200); 
    myCommand.InsertCommand.Parameters["@myString"].Value = @"good overview of ESP's in more detail than you probably need."; 
0

String.Replace(String,String)は正常に動作するはずです。この例では、あなたはしたいと思います:

String.Replace("'", "''") 

しかし、私はそれがあなたの問題を解決するだろうとは思いません。私は、あなたがより適切に探していると想像:そのMySQLのである。このため

String.Replace("'", "\'") 

理由、と私は、SQLの他のバージョンを想像して、文字列を単一引用符で囲むことを期待したいです。

+0

私はこれが直接質問に答えることに同意しますが、悪い習慣でOPを支援します。パラメータ化されたクエリが使用されている場合、この問題は解消され、注入攻撃からの保護、実行計画キャッシュのアシストなどを行います。 – MatBailie

+0

@dambrisco:SQLの方言の中には、エスケープの代わりに二重アポストロフィ( '')あなたがMySQLのために提案したシーケンス(\ ')。 –

+0

@Dems - 私は完全に同意しますが、質問を受けて、私は赤ちゃんの措置を取る方が良いかもしれないと思っていました。エスケープシーケンスについて知らないような人にパラメータ化を説明することは、悪いスタート地点になる可能性があります。しかし、Daokのソリューションは私のものよりもはるかに良いでしょう。 –

2

私は年齢のため、この問題に取り組んでいました。単一引用符を2つの単一引用符で置き換えて、クライアント上で行います。これは、複数のvarchar入力パラメータを使用してspを実行している場合に機能します。これに伴う唯一の問題はSQLインジェクションです。つまり、クライアントにとってあなたが何を目の当たりにしているかを人々は見ることができません。これを丸める唯一の方法は、前述のように、サーバー上でSQLparametersを使用することです。

0

myCommand.InsertCommand.Parameters.Add( "@ののmyString"、SqlDbType.VarChar、200); myCommand.InsertCommand.Parameters [ "@ののmyString"]。バリュー

関連する問題