2012-02-02 94 views
0

我想在我的SQL中搜索特定模式,以便它只用SELECT启动,而不是用INSERT,UPDATE,DELETE启动。Jquery正则表达式

我怎样才能实现这个使用JQuery,我想用JQuery来做一个不区分大小写的字符串匹配。

编辑

我还要考虑子查询也。

因此我的要求是查询不应该在任何地方包含任何INSERT,UPDATE,DELETE语句。 它应该只包含SELECT statments

+0

仅供参考,正则表达式是javascript的一部分。这里不需要jQuery。 – 2012-02-02 10:23:51

+1

你能更具体吗? jQuery是一个大型图书馆,正则表达式是一个广泛的主题,“不区分大小写”只是RegExp的一个选项。你遇到了什么真正的问题? – 2012-02-02 10:24:12

+0

好吧,但我怎么能实现它或者使用Javscript或JQuery – Vivek 2012-02-02 10:24:41

回答

1

我会用一个白名单为,而不是一个黑名单:

function isValidQuery(str) { 
    return /^select\s+([a-z_*]+,?)+\s+from\s+[a-z_]+$/i.test(str); 
} 

这只比赛查询形式SELECT field, [field, ...] FROM table。这也可以扩展为允许某些种类的WHEREGROUP BY说明符。如果这还不够,你还可以使用更严格的黑名单:

function isValidQuery(str) { 
    if (/delete|update|insert|truncate|create|drop/i.test(str)) return false; 
    // possibly more excluding rules... 
    return true; 
} 

如果你想用这个来保护您的数据,我肯定不会依靠第二种方法,因为它大概可以规避(你忘记了一个危险的命令,SQL走私......)很多更好的方法是创建一个专用数据库用户,该用户只能通过此接口读取要访问的表。

+0

谢谢Niklas ....这肯定有助于.. :) – Vivek 2012-02-02 11:09:12

1

您可以使用类似以下内容:

function isSelect(str) { 
    return /^select/i.test(str) && !/insert|update|delete.*/.test(str); 
} 

isSelect("select * from foo"); // true 
isSelect("SELECT id, name from foo"); // true 
isSelect("update ..."); // false 
isSelect("DELETE ..."); // false 
+0

谢谢..这工作。但是谈到Niklas问的问题,我该如何修改正则表达式,以便查询不会包含UPDATE,DELETE,INSERT在sql中的任何位置。 它应该只包含SELECT语句。 – Vivek 2012-02-02 10:52:36

+1

很高兴帮助:-)我可能只是在'isSelect()'函数中添加额外的检查。已经更新了我的答案。 – jabclab 2012-02-02 11:02:25

+1

@jakeclarkson:如果OP想用这个保护数据,我认为你的代码不是一个好建议。例如,它允许使用'drop'或'truncate'语句,以及像'create table'这样的建设性语句。即使将这些添加到黑名单中,也可能会被绕过(SQL走私等)。更好的建议是使用*白名单*,并(另外)使用DB内部权限机制来仅允许读取某些表。 – 2012-02-02 11:06:02