我知道这可能听起来很简单,但我想要第二意见。
我正在创建一个表单,用户可以在其中输入将在远程数据库上运行的数据库查询。我想避免用户输入任何包含以下关键字的查询"删除,删除,更新,插入,更改"。
我知道最简单的方法是不给用户写入数据库的权限,但只是为了验证我需要将这个过滤器添加到我的表单中。
这是我到目前为止所做的事情
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)
现在我又想知道这样的事情会不会起作用呢?
答案 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"
通过这种方式,您可以保持代码清洁和可读性:)