私は日常的に、erlang アプリケーション ミドルウェアから Oracle および MySQL データベースを操作しています。これらのミドルウェア アプリケーションでは、i が実行されてNitrogen Web Framework
おり、Yaws Web Server
さらにRabbitMQ
. アプリケーションは、脆弱性があるにもかかわらず、信頼できるイントラネット内で実行されますSQL injection
。
ここに記載されているような攻撃:http://sqlzoo.net/hack/は、これらのアプリケーションを役に立たなくすることができます。これらの攻撃を防ぐ方法のライブラリ (Erlang) またはテクニックはありますか? のような他の言語ではPHP
、すべてのパラメーターが、ユーザーまたは攻撃者によって挿入される可能性のあるstringified
ものをエスケープすることによって確実に行われることを知っています。
文字列パラメーターといえば、関数を思いつきましたが、すべてを.single-quotes
escaping all single-quotes
replace_all
single-quotes (')
escaped version of themselves (\')
replace(Char,With,String)-> replace(Char,With,String,[]).いくつかの例でテストします。
replace(_,_,[],Done)-> リスト:reverse(完了); replace(Char,With,[Char|Rest],Buffer)-> replace(Char,With,Rest,[With|バッファ]); replace(Char,With,[Any|Rest],Buffer)-> replace(Char,With,Rest,[Any|Buffer])。
3> sql_protect:replace($m,$k,"ムザアヤ"). 「くざあや」 4> sql_protect:replace($a,$u,"ムザアヤ"). 「ムズユ」 5>しかし、この関数を使用してすべての一重引用符をエスケープするにはどうすればよいですか。と言う
String = "' OR 1=1'"
には、 に変更しましたString = "\' OR 1=1\'"
。あなたの助けに感謝します。
編集
これについてどう思いますか: すべての
ORACLE SQL KEYWORDS
andSQL SERVER KEYWORDS
と andのリストMYSQL KEYWORDS
が 1 つのリストにあり、クエリ パラメーターごとに、それを単語に分割し (つまり、スペースが含まれている場合)、これらのいずれにも含まれていないことを確認します。 words は予約語です。多くの SQL インジェクション攻撃を防ぐことができます。もっと良い方法があるようです。