MySqlでアポストロフィ( ')をエスケープする方法は?


147

MySQLのドキュメントは、それがあるべきと述べています\'。ただし、siteとmysqlの両方で''機能します。私はそれを見て、うまくいきました。私は何をすべきか?


あなたはかどうかについて話している''か、\'正しいですか?
ラプター

\'MySQL固有''ですが、誤解しない限りANSI SQLに準拠しています
apokryfos

SQLの実装に応じて、-'' \ ''、 '\' '、および' [']' 'はコードからの脱出を許可します。これに加えて、任意の数のunicode置換がこのチェックをバイパスします。ここでのゲーム全体は、最終的なカウントが奇数ではなく偶数であることを必要とする ''ベースのエスケープの品質を悪用しています。複数のエスケープメソッドを相互にマッシュして奇妙な結果になった場合は、エスケープを無効にして生のSQLを注入できます。話の教訓:文字列補間を使用しないでください。常に準備されたステートメントを使用してください。
Shayne

回答:


186

あなたが引用するMySQLのドキュメントは、実際にはあなたが言及するよりも少し多くを述べています。また、

'」で囲まれた文字列内の「'」は、「」と書くことができます''

(また、MySQL 5.0バージョンのTable 8.1。Special Character Escape Sequencesにリンクしており、現在のバージョンは5.6ですが、現在のTable 8.1。Special Character Escape Sequencesは非常によく似ています。)

パラメータに関するPostgresのメモは参考backslash_quote (string)になると思います。

これは、引用符を\'文字列リテラルで表すことができるかどうかを制御します。引用符を表すための推奨されるSQL標準の方法は、引用符を2倍にすることです('')が、PostgreSQLも歴史的に受け入れてい\'ます。ただし、を使用すると\'セキュリティリスクが生じます...

これは、二重引用符を二重引用符でエスケープするために使用するよりも、二重引用符文字を使用する方が全体的かつ長期的にはより良い選択であると私に言います。

ここで、言語の選択、SQLデータベースの選択とその非標準の癖、およびクエリフレームワークの選択を方程式に追加したい場合は、別の選択肢になる可能性があります。あなたはあなたの制約についてあまり情報を与えません。


42

標準SQLは二重引用符を使用します。MySQLはそれを合理的に準拠するために受け入れる必要があります。

'He said, "Don''t!"'


「すべき」ではなく「かもしれない」とありますが、情報はそこにあります(表の下):文字列内に引用文字を含めるにはいくつかの方法があります:「'」で囲まれた文字列内の「'」は''「 。「"」で囲まれた文字列内の「"」は、「」と書くことができます""。引用文字の前にエスケープ文字(「」)を付けます。
ジョナサンレフラー2014

1
これは、アポストロフィを2倍にしてエスケープするための最良の方法です。
Alex _TNT

10

user2087510の意味は次のとおりです。

name = 'something'
name = name.replace("'", "\\'")

私もこれを成功させました。


1
上位の回答がうまくいかなかったのに私のために働いた
Jared

1
なぜ\ 'ではなく\\'なのか?
ビニアム2015年

@biniam_Ethiopia 2番目の\は最初の1つをエスケープします
Juha Untinen

2
可能なセキュリティの問題。文字列にすでに\ 'が含まれている場合は、SQLインジェクションを取得できるため、\を挿入します。代わりにname.replace( "'"、 "' '")を使用してください
Garr Godfrey

6

私の''代わりに'2回書いてください'


1
1つの代わりにアポストロフィを2回使用します
MRRaja

5

次に例を示します。

SELECT * FROM pubs WHERE name LIKE "%John's%"

二重引用符を使用して、単一引用符を囲みます。

一重引用符の使用を主張する場合(および文字をエスケープする必要がある場合):

SELECT * FROM pubs WHERE name LIKE '%John\'s%'

4

私が知っている方法は3つあります。1つ目はかわいらしくなく、2つ目はほとんどのプログラミング言語で一般的な方法です。

  1. 別の単一引用符を使用します。 'I mustn''t sin!'
  2. \一重引用符の前にエスケープ文字を使用します''I mustn\'t sin!'
  3. 単一引用符の代わりに二重引用符を使用して文字列を囲みます。 "I mustn't sin!"

私の好みは\'、非常に多くのプログラミング言語で使用されていますが''、より多くのSQL方言でサポートされているため、互換性のためにオプション1を使用することをお勧めします。たとえば、Sqliteはバックスラッシュエスケープでは機能しません。
okdewit

0

文字列を置き換える

value = value.replace(/'/g, "\\'");

ここで、valueはデータベースに格納する文字列です。

さらに、

このためのNPMパッケージ、あなたはそれを調べることができます

https://www.npmjs.com/package/mysql-apostrophe


回答としてツールやライブラリを投稿しないでください。少なくとも、それ自体が問題をどのように解決するかを答え自体で示してください。
Baum mit Augen

それはうまくいきません。あなたは物事を脱出することを忘れました。replace(/ \ '/ g、 "\\\'")
Michael

0

アポストロフィがあるデータポイントがある場合は、アポストロフィの前にアポストロフィを1つ追加できます。

例えば。「これはジョンの家です」

ここでMYSQLは2つの文「これはジョンです」の場所を想定しています

「これはジョンです」という場所を置くことができます。そのように機能するはずです。



0

おそらくトピック外ですが、HTMLフォームからのテキスト入力をサニタイズする方法を探してここに来たので、ユーザーがアポストロフィ文字を入力しても、SQLにテキストを書き込もうとしたときにエラーがスローされません。ベースのテーブル。これを行うにはいくつかの方法があり、SQLインジェクションについても読みたいと思うかもしれませんが、PHPの簡単なオプションは、すべてのアポストロフィをおそらく格納したいものに変換するhtmlspecialchars()関数を使用する'ことです。とにかく。


エンコーディングは保存用ではなく、表示用です。準備されたステートメントを使用します。
mickmackusa

準備されたステートメントは、セキュリティと信頼性のゴールドスタンダードであることに同意します。テキストデータをHTMLとして保存する特定のケースを強調表示しました。その場合、私のメソッドは、バインドされたパラメーターを使用する代わりに、代わりに使用されます。HTML入力、HTML出力。
Grindlay
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.