簡體   English   中英

在一個字符串中找到多個模式

[英]find multiple patterns in a string

我知道這聽起來很簡單,但我需要第二意見。

我正在創建一個表單,用戶可以在其中輸入將在遠程數據庫上運行的數據庫查詢。 我要避免用戶輸入任何包含以下關鍵字“刪除,刪除,更新,插入,更改”的查詢。

我知道最簡單的方法是不授予用戶對數據庫的寫訪問權,但是僅出於驗證目的,我需要將此過濾器添加到表單中。

這是我到目前為止所做的

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"

我是否涵蓋了所有可能的情況? 還是用戶仍然可以給我帶來麻煩?

編輯

好吧,因此很明顯,此驗證也限制了沒有邊界字的關鍵字

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

我的意思是如果我的查詢是這樣的

查詢=“從液滴中選擇*”

它不會通過,類似“從插入的值表中選擇*”之類的東西也不會通過。

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

現在我再次想知道這樣的事情會做嗎?

您也可以使用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!!"

已經過去了幾年,並且失去了使用以下查詢的激動,您知道系統管理員現在已經是一天了,對開發人員的查詢不是很友好。但是,您是我為用戶提供如此出色的數據庫界面的唯一朋友:)

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"

這樣,您可以保持代碼的清潔和可讀性:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM