我试图找出一个字符串是否包含某些通过以下方式更改数据库的 SQL 命令:
- 创建新表
- 删除现有表
- 创建新的表列
- 删除现有表列
现在我正在对 strpos 进行搜索ALTER
,CREATE
并且DROP
应该可以。
是否还有其他命令可以执行上述操作并且我应该在搜索中包含这些命令?
请注意,出于安全原因,我不需要这个。我只需要知道表架构是否更改,这样我就可以更新架构信息的本地缓存...
对于某些 DBMS(PostgreSQL、MS SQL Server、Informix)SELECT ... INTO ...
可以创建新表。
这将很难通过字符串检查来完成。
还有其他方法可以进行更改,例如:
SELECT *
INTO SomeTable
FROM SomeOtherTable
sp_rename 'OldTable' 'NewTable'
安全或 DDL 触发器可能是更好的选择。
如果 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 的许多实现允许/* */
作为内联注释的分隔符。
/* added 12/7/2011 */ CREATE /* TEMPORARY */ TABLE mytable ...