2017-02-22 172 views
1

我準備一個MySQL的測試,讓用戶將看到一個小的數據庫,我們將展示一些問題。用戶將回答問題作爲查詢。他會創建一個查詢並運行它,看看他是否得到了預期的結果。如何防止Mysql數據庫被更改/更新/刪除?

所有問題都基於「選擇」查詢的問題。因此,運行查詢之前,我想確認,有什麼在改變數據庫的當前狀態的查詢。用戶顯然不能運行更新,刪除,插入等修改數據庫的任何其他類型的查詢。

我該怎麼做?有一些圖書館可以幫助我嗎?我目前只是在查詢字符串中搜索關鍵字插入,更新和刪除以防止出現這種情況。我正在使用PHP和codeigniter MVC。

+4

創建數據庫用戶這沒有必須(刪除,更新等)的作用附着在其上。 http://webmasters.stackexchange.com/questions/2242/how-to-create-separate-users-in-phpmyadmin-each-one-cant-see-others-databases –

回答

2

創建僅SELECT分配給它的特權用戶喜歡:

"GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password'; 

現在用username用戶只有select特權。

1

雖然可以限制基於授予用戶的設置,這將阻止未經授權的操作是最安全的解決方案的操作,您可以使用的preg_match檢查的查詢某些受限制詞的存在。但是,可能會出現這樣的用例,其中某些單詞可能用在SELECT查詢中,如果您需要它們用於基於文本的查找=,LIKE,REGEX等。

要處理此問題,可以去掉引號內的任何內容或字符串中的撇號,以便忽略它們。

$query = preg_replace('/"[^"]+"/','', $query); 
$query = preg_replace("/'[^']+'/",'', $query); 

然後,用你已經離開的字符串,檢查被禁止的MySQL單詞或短語的列表。

if(preg_match('/[alter|set|update|insert|delete|replace|into|grant]/',strtolower($query))) { 
    $bad_query = true; 
} 

這是一個更復雜的實際PHP解決方案。最安全的辦法是限制你的MySQL調用的訪問,但是,如果你的目標是測試特定的語法 - 你可以實現這一目標。

有關GRANT選項和信息的命令集都允許,你可以使用這個網址作爲一個偉大的資源: https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html