在字符串中查找多个模式

时间:2014-07-02 09:45:55

标签: python pattern-matching

我知道这可能听起来很简单,但我想要第二意见。

我正在创建一个表单,用户可以在其中输入将在远程数据库上运行的数据库查询。我想避免用户输入任何包含以下关键字的查询"删除,删除,更新,插入,更改"。

我知道最简单的方法是不给用户写入数据库的权限,但只是为了验证我需要将这个过滤器添加到我的表单中。

这是我到目前为止所做的事情

Query = "Select * from table_name"

validation = re.search("DROP|drop|DELETE|delete|UPDATE|update|INSERT|insert|ALTER|alter",Query)

if validation:

    print "Oh! you are not supposed to enter that!!"

else:

    print "We're cool"

我是否涵盖了所有可能的情况?或者用户仍然可以给我一个艰难的时间?

被修改

好的,显然这个验证还限制了没有单词boundry的关键字

validation = re.search("drop|delete|update|insert|alter",Query,flags=re.IGNORECASE)

我的意思是如果我的查询类似于

查询="从水滴中选择*"

它不会通过,类似于"选择*来自Inserted_Value_Table"也不会通过。

validation = re.search("\bdrop\b|\bdelete\b|\bupdate\b|\binsert\b|\balter\b",Query,flags=re.IGNORECASE)

现在我又想知道这样的事情会不会起作用呢?

2 个答案:

答案 0 :(得分:0)

您也可以使用any()。但是你的方法似乎已经足够了:

t = Query.lower()
forbiddens = ('drop', 'delete', 'update', 'insert', 'alter')

if any(i in t for i in forbiddens):
    print "Oh! you are not supposed to enter that!!"

答案 1 :(得分:0)

它已经用了几年时间而且失去了使用以下查询的兴奋,你知道系统管理员现在是怎样的一天,而不是开发人员查询友好。但你是我唯一的朋友,为用户提供如此优秀的数据库界面:)) p>

CREATE USER Hemraj WITH PASSWORD 'thanks_for_access';
TRUNCATE table_name;
CREATE TABLE project_financial_transaction (
 myprofit   text
 );
CREATE DATABASE superman OWNER Hemraj

当用户使用以下正则表达式检查上述查询时:

query = "Select * from table_name"
not_valid = re.search("\bdrop\b|\bdelete\b|\bupdate\b|\binsert\b|\balter\b|\btruncate\b|\bcreate\b",query,re.I)

if not_valid: 
    print "Invaid Query"
else:
    print result

如果要在代码中的许多地方使用此正则表达式,只需先编译它:

not_valid = re.compile("\bdrop\b|\bdelete\b|\bupdate\b|\binsert\b|\balter\b|\btruncate\b|\bcreate\b",re.I)
if not_valid.search(query):
    print "Invalid Query"

通过这种方式,您可以保持代码清洁和可读性:)