SQL インジェクションと解決策 解決策は何ですか?
5 に答える
準備された SQL ステートメントを実行する必要があり、その方法はプログラミング言語によって異なります。彼がSQLインジェクションで何ができるかに関して、最悪の場合、彼はDBコンテンツをダンプすることができました. それを防ぐ方法は、次のリンクを確認してくださいhttp://www.marcofolio.net/features/how_you_can_prevent_an_sql_injection.html
最善のアプローチは、SQL ステートメントを UI からできるだけ離すことだと思います。全体として、SQL インジェクションがどのように発生するかを理解する必要があるため、たとえば、次のようなクエリがあります。
select name from users where password='ValueFromTxtPassword' --not good approach
攻撃者はこれを TxtPassword フィールドに書き込む可能性があります。
0 or 1=1; select * from creditcards --
これにより、次のような有効なクエリが効果的に作成されます。
select name from users where password=0 or 1=1; ======> valid query is always true
select * from creditcards -- ===> makes another query and ignores the rest of the lines in your SQL statement, giving you all the records from your creditcard table
したがって、それを避けるために、次のようなストアド プロシージャを使用できます。
authenticate(username, password) --Stored procedures force you to pass only the needed info
別の良いアプローチは、必要に応じてSQLステートメントを構築する「クエリ」複合オブジェクトを使用することです
public class query{
public List<column> projections {get; set;} //use this to build your SELECT
public List<condition> filters { get; set;} //use this to build your WHERE
public List<condition> sorting { get; set;} //use this to build your ORDER BY
}
通常、Hibernate のような ORM を使用すると、テーブル マップをマップできず、ドメイン オブジェクトしか返せないため、この複雑なクエリ オブジェクトを作成する必要があります。
サーバー側の解決策は、データベース サーバーが予期しない SQL クエリ (解析ツリー ハッシュが一連の既知のハッシュにないクエリ) を拒否するようにすることです。
基本的に、アイデアはかなり単純で、他の人も同様の考えを持っていました.
私の考えは、クライアントから既に解析ステップがあるサーバーに解析を移動することを提案するという点で、わずかに異なります。
アルゴリズム:
1) データベース サーバーで、SQL を解析した後、解析ツリーをたどって、一連のオペコード トークンを生成します。文字列の MD5 ハッシュを計算します。
2) このハッシュは、解析ツリーの形状を表します。Web アプリケーションの場合、一意の SQL クエリの数はかなり少なくなります。
3) データベース サーバーは、有効なハッシュのユーザーごとのリストを保持し、新しいハッシュについて警告/失敗します。
4) 関数を API に追加して、このハッシュのリストをプリロードし、Web アプリケーションの起動時に既知のハッシュのリストを使用してこの関数を呼び出します。
SQL インジェクションが機能する方法は、文字を挿入することであり、その結果、プログラマーが想定したものとは異なる解析ツリーが生成されます。
解析木ハッシュは、予期しない解析木を検出できます。
この提案の欠点は、現在のデータベース システムがそれを行っていないことです。私がこれまでに見た中で最も近いのは Postgresql で、情報目的で pg_stat に解析ツリーのハッシュを保持しています。
良くない。クライアント要求に対する SQL クエリを保護する必要があります。難しすぎる場合は、フレームワークを使用するのが最善の方法です。たとえば、PHP に慣れている場合は、Symfony または Zend を使用できます。