1

私はクエリを作成しています:

$q = sprintf("UPDATE testTable SET Text='%s', [Read]=0, TimeUpdated='%s', [From]='%s' WHERE ID='%s'", ms_escape_string($text), $dateReceived, $from, $convID);  

そして私はそれを実行します:

$res = mssql_query($q, $dbhandle);

$textあらゆる種類の変な文字を含めることができるように、フリー テキストにする必要があります (ここでは ASCII に固執しましょう)。最も単純なシナリオは、$text に引用符が含まれている場合です。$text = "Mc'Donalds"

ms_escape_string関数内では、' を 2 つの引用符で置き換えることにより、これを防止しようとしています。クエリ文字列をエコーし​​ます。

UPDATE testTable SET Text='Mc''Donalds', [Read]=0, TimeUpdated='2012-08-03 12:44:49', [From]='bogus' WHERE ID='14'

(注: 同じデータベースで VS サーバー エクスプローラーからこのクエリを実行すると、問題なく動作します)

すべて問題ないように見えます - Mc''Donalds の二重引用符を参照してください - しかし、実行すると失敗します: [mssql_query(): message: Incorrect syntax near 'Mc'

SET QUOTED_IDENTIFIER が原因かもしれないと思ったので試してみました

 $q = "SET QUOTED_IDENTIFIER OFF";
 $resq = mssql_query($q,$dbhandle);

クエリを実行する前に、葉巻はありません - それでも同じエラーが発生します。

今私は立ち往生しています - 一重引用符を含む文字列を通過させるには何を変更すればよいですか?

4

1 に答える 1

1

この質問は、ネイティブの mssql_real_escape_string() 関数の欠如に関係しているようです。これは、このスレッドで対処されています

コメントで言及されているように、SQL インジェクション攻撃についてもっと心配する必要があります。

このタイプの「データの次の受信者に備えてエスケープする」ことは、FIEO マントラ (Filter Input Escape Output) の一部を形成します。

于 2012-08-03T13:36:41.237 に答える