文字列定数内でALTER、CREATE、またはDROPが発生すると、偽陽性が発生する可能性があります。
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の多くの実装がインラインcommentsの区切り文字として/* */
を許可するので、それは、さらに複雑である可能性があります。
/* added 12/7/2011 */ CREATE /* TEMPORARY */ TABLE mytable ...
が良いappraochは、そのようなことを行うためのユーザーのためpersmiisionsを許可しないことです、唯一の管理これまでのテーブルを作成したり、変更したりdeltingしなければならないといないユーザーが権限を持ってshoudl。 – HLGEM
srslyなぜ上記のコメントはあなたの上に+1ですか?私はちょうどこれはセキュリティ上の理由からではないと書いています:) – Alex
そして、これは管理インタフェースではないことをどのように知っていますか?ソフトウェアの多くは、人々がテーブルを変更できるようにする管理インタフェースを備えています。通常、これらはユーザー定義のテーブルであり、コアのアプリケーションテーブルは許可されていませんが、これは正当な設計です。 – David