Regex 仅用于Select查询的正则表达式?

Regex 仅用于Select查询的正则表达式?,regex,regex-negation,regex-lookarounds,Regex,Regex Negation,Regex Lookarounds,我正在寻找一个只允许选择查询的正则表达式, 不允许插入、删除、更改或任何类似的操作,并且查询可以有多行 我试过了 var pattern="(^select)^((?!insert|delete|alter).)*$"; var pattern=^(?!insert|delete|alter|modify|add|create|drop|truncate|rename|update|rollback|commit|grant|revoke|savepoint)(.(?!insert|delet

我正在寻找一个只允许选择查询的正则表达式, 不允许插入、删除、更改或任何类似的操作,并且查询可以有多行

我试过了

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中多行的insert或任何关键字不匹配

它失败了

Eg: select *
insert 
into

这意味着它应该以select开头,并且不能在查询中的任何位置插入,但这不起作用。

正如评论中提到的,这个想法存在很多问题。但就如何真正做到这一点而言:

/^select(?:(?!insert|delete|alter)[\s\S])*$/i
这将确保第一个单词是“不敏感地选择大小写”。然后我几乎准确地使用了你剩下的表情。我将*重复放入非捕获组,并更新了。到[\s\s]因为。匹配除换行符以外的任何字符。

如果可能的话,这并不容易

用户可能希望运行无数无害的查询,任何sane regex都会接受这些查询。例如,如果StackOverflow用户希望查找包含文本删除的所有问题,则查询结果可能是:

SELECT * FROM Questions WHERE Body LIKE "%delete%"
Regex单词边界\b不起作用,因为%和delete之间存在单词边界。添加空格可能有效,即/^*delete/但如果用户只想查找单词delete并执行以下操作,该怎么办

SELECT * FROM Questions WHERE Body LIKE "% delete %"

仍然是有效的查询。因此,除非您强制用户永远无法查询数据库中的任何同时也是SQL命令的单词,否则您就不走运了。

为什么要对SQL查询进行正则表达式验证?这是可能的,但这听起来很粗略。为什么不限制用户权限,这样他们只能执行选择而不能执行其他操作?同意,这只是一个额外的安全措施。。我还想确保字符串没有任何插入、删除关键字,即使在第一次选择之后。。所以strin.startswith不够好。如果用户希望执行查询SELECT*FROM Body(如%delete%)之类的问题,该怎么办?为什么您关心在第一次选择之后是否有关键字?将DELETE置于SELECT之后不会删除任何内容。您不能编写像SELECT foo这样的查询并将其删除。但是如果它是一个多行脚本呢。。仅在开始时选择不起作用。因为如果第二行有一个insert。。这将是一个问题。。并不是每一行都有选择。。它可能有一个集合。关于这个呢:从name=undelete;?的操作中选择*;?正如评论中提到的,这个想法有很多问题我想OP仍然可以看到一个表达式来学习如何做他们想做的事情。但是如果它是一个多行脚本呢。。仅在开始时选择不起作用。因为如果第二行有一个insert。。这将是一个问题。。并不是每一行都有选择。。它可能有一套。