3

私は日常的に、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-quotesreplace_allsingle-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 KEYWORDSandSQL SERVER KEYWORDSと andのリストMYSQL KEYWORDSが 1 つのリストにあり、クエリ パラメーターごとに、それを単語に分割し (つまり、スペースが含まれている場合)、これらのいずれにも含まれていないことを確認します。 words は予約語です。多くの SQL インジェクション攻撃を防ぐことができます。

もっと良い方法があるようです。

4

2 に答える 2

2

erlang ライブラリについてはわかりませんが、実行時に文字列を自動的に「サニタイズ」する準備済みステートメントを作成できると思います。これは、PDO と mysqli を使用する php ランドでも推奨される方法です。escape_strings と mysql ドライバーは、知る限り非推奨です。

于 2013-02-28T08:04:14.893 に答える