2017-02-22 15 views
1

私は、ユーザーに小さなデータベースが表示されるMySQLテストを準備しており、いくつかの質問が表示されます。ユーザーは質問をクエリとして回答します。彼はクエリを作成して実行し、希望の結果が得られるかどうかを確認します。MySQLデータベースが変更/更新/削除されないようにするには?

すべての質問は「選択」質問に基づいています。したがって、クエリを実行する前に、クエリの中にデータベースの現在のステータスを変更するものがないことを確認したいと思います。ユーザーは明らかに、データベースを変更する他のタイプのクエリを更新、削除、挿入などすることはできません。

どうすればいいですか?私を助けるライブラリがありますか?私は現在、これを防ぐためにクエリ文字列のキーワードの挿入、更新、削除を検索しています。私はPHPとcodeigniter MVCを使用しています。

+4

(など、更新、削除)持っていませんでしデータベースユーザを作成するには、ロール。ウェブマスター。 –

答えて

2

好き、それに割り当てられているだけSELECT権限を持つユーザーを作成します。

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

usernameを持つユーザーのみがselect権限を持っています。

1

ユーザーに付与された設定に基づいてアクションを制限することができますが、不正な操作が最も安全なソリューションとして防止されますが、preg_matchを使用してクエリ内に特定の制限付き単語が存在するかどうかを確認できます。しかし、テキストベースのルックアップ=、LIKE、REGEXなどの場合にこれらの単語の一部をSELECTクエリで使用できるユースケースがあるかもしれません。

これを処理するには、引用符文字列のアポストロフィを無視します。

$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オプションに関する情報およびコマンドのセットのために

各許可し、あなたは偉大なリソースとしてこのURLを使用することができますが:それに装着 https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html

関連する問題