始める前に、私が試みていることが奇妙でハックであることを認識しています。これは、隔離された侵入テスト、特に SQL インジェクション用です。
私がしなければならないことは、MySQL データベースで実行するときと SQL Server データベースで実行するときの動作が異なる SQL ステートメントを作成することです。
編集
作成できるクエリの制限は、"WHERE id =" 句の後にあるものしか変更できないことです。クエリの他の部分に影響を与えることはできません。具体的には、SQL サーバーによってのみ実行される "UNION SELECT * FROM some_other_table" を入力の最後に添付できるようにする必要があります。
MySQL には私が結合しているテーブルがないため、これは明らかに MySQL を爆破します。
具体的には:
SELECT * FROM USERS
WHERE id = My input -> (MySQL code: 'x' or 1=1 )
(MSSQL code 'x' or 1=1 UNION SELECT * FROM table)
問題は、いずれかのステートメントが意図されていないデータベースによって実行された場合、それが爆発することです (そして、私が必要とする方法ではありません)。
これにより、MySQL で Conditional/Executable Comments が発見されました。
SELECT * FROM USERS
WHERE id = /*! This will be executed but only by mysql */
それは素晴らしいことですが、それでも MySQL が MSSQL を実行するのを防ぐことはできません! MSSQL が MySQL コードを実行するのを止めることしかできません。
私の最初のアイデアは、次のように MySQL 条件内にコメントを入れることでした。
SELECT * FROM USERS
WHERE id = /*! 4 or 1=1 --*/ MSSQL code that is ignored by mysql
しかし、これは「」の近くに何もない行で構文をチェックするようにというエラーをスローします。
なぜこれが機能しないのか完全には理解できませんが、私が知っているどの形式の MySQL コメントでも機能しないことはわかっています (試行 #、/*)。
奇妙な SQL ステートメントを機能させる方法はありますか? または、MSSQL で条件付きコメントを行う方法はありますか? 条件付きの後にMySQLが何も無視する必要があるだけですが、コメントなしでそれを実現する方法がわかりません。