我正在寻找一个只允许严格选择查询的正则表达式, 不允许插入,删除,更改或任何类型的查询,并且查询可以有多行..
我试过
var pattern="(^select)^((?!insert|delete|alter).)*$";
var pattern=^(?!insert|delete|alter|modify|add|create|drop|truncate|rename|update|rollback|commit|grant|revoke|savepoint)(.(?!insert|delete|alter|modify|add|create|drop|truncate|rename|update|rollback|commit|grant|revoke|savepoint))*$";
如何使其与多行上的插入或任何关键字不匹配(在javascript中)。
失败
Eg: select *
insert
into
这意味着它应该以"选择"并且不能在查询中的任何位置插入,但这不起作用。
答案 0 :(得分:0)
正如评论中所提到的,这个想法存在很多问题。但就如何实现这一目标而言:
/^select(?:(?!insert|delete|alter)[\s\S])*$/i
这将确保select
(不区分大小写)是第一个单词。然后我几乎完全使用了你表达的其余部分。我将*
重复投放到非捕获组中,并将.
更新为[\s\S]
(因为.
匹配任何字符 ,除了 换行符。
答案 1 :(得分:0)
这不容易(如果有的话)。
用户可能想要运行的无数无害查询,任何理智的正则表达式都会被提取。例如,如果StackOverflow用户想要查找包含文本“delete”的所有问题,则查询可能最终成为:
SELECT * FROM Questions WHERE Body LIKE "%delete%"
正则表达式单词边界(\b
)不起作用,因为%
和delete
之间存在单词边界。添加空格可能有效,即。 /^ *delete/
但是,如果用户想要只找到删除这个词,那该怎么办:
SELECT * FROM Questions WHERE Body LIKE "% delete %"
仍然是有效的查询。因此,除非你强迫用户永远不能查询数据库中也是SQL命令的任何单词,否则你就不走运了。