文字列定数内で ALTER、CREATE、または DROP が発生すると、1 つの誤検知が発生する可能性があります。
INSERT INTO News (headline) VALUES ('Stocks DROP for no reason!');
またstrpos()
、リテラル部分文字列のみを検索します。部分文字列が長い単語の一部であるかどうかはわかりません。
SELECT * FROM CLOTHING_ALTERATIONS
したがって、正規表現を使用して、単語がステートメントの先頭にあり、単語全体であることを確認することができます。
$num_matches = preg_match("/^\s*(ALTER|CREATE|DROP|RENAME)\b/m", $sql);
文字列に SQL 行コメントが含まれている場合は、複数行の正規表現マッチングを使用することが重要です。
-- the following statement is run in my add_column() function
ALTER TABLE mytable ADD COLUMN ...
SQL の多くの実装ではインラインコメント/* */
の区切り文字として許可されているため、さらに複雑になる可能性があります。
/* added 12/7/2011 */ CREATE /* TEMPORARY */ TABLE mytable ...