SQLインジェクションを避けます
SQLインジェクションとは何ですか
SQLインジェクション攻撃(SQLインジェクション)、Web開発は、セキュリティの脆弱性の最も一般的な形態であり、インジェクション攻撃と呼ばれます。あなたは、データベースから機密情報を入手、またはデータベース機能を使用するためにそれを使用することができます輸出書類及び悪質な一連のアクションを実行するためにユーザーを追加、でも、データベース・システムのユーザーとさえ最高の権威が得ることができます。
SQLインジェクションの原因プログラムが効果的にユーザーの入力が正常にサーバーに悪質なSQLクエリのコードを提出する攻撃者は、プログラムが元で、その結果、クエリの一部として実行間違った攻撃を受けた後に入る可能性がありますフィルタリングしていないため、クエリロジックが変更され、攻撃者の追加の実行は、悪意のあるコードを細工しました。
SQLインジェクションの例
多くのWeb開発者はSQLクエリが信頼できるコマンドであるように、改ざんすることができますどのようにSQLクエリに気付いていません。誰もが知っているように、SQLクエリは、アクセス制御を回避することにより、標準の認証と承認のチェックをバイパスすることができます。詳細は何ですか、SQLを介してホストシステム・レベルのコマンドへのクエリを実行することが可能です。
以下、詳細にSQLインジェクションの方法を説明するために、いくつかの実際の例によることになります。
以下の簡単なログインフォームを考えてみましょう:
1 |
< フォーム アクション = "/ログイン" 方法 = "POST" > |
私たちのSQL処理が内部で次のようになります。
1 |
ユーザ名:= r.Form.Get("ユーザ名") |
次のようにユーザー名を入力した場合、任意のパスワード
1 |
MYUSER 'または' FOO '=' FOO ' - |
次のように私たちのSQLは次のようになります。
1 |
SELECT * FROM WHEREユーザー名= 'myuserの'または'foo'で = 'foo'で - ''とパスワード= ' XXX ' |
内部のSQLで--
大きな柱 SQLインジェクション攻撃のクエリが中断されるので、コメントタグです。これにより、攻撃者は任意の有効なユーザー名と正常にログインするためのパスワードを知らないことができます。
MSSQLのためにSQLインジェクションのはるかに危険なタイプがありますが、それは、制御システムは、以下の恐ろしい例では、MSSQLデータベースの一部のバージョンでシステムコマンドを実行する方法を示しますです。
1 |
SQL:= "製品SELECT * FROM WHERE名LIKE '%" + PROD + "%'" |
攻撃者が提出した場合はa%' exec master..xp_cmdshell 'net user test testpass /ADD' --
、変数PRODとしての価値を、そしてSQLはなります
1 |
SQL:= " '%%' execをmaster..xp_cmdshell LIKE名'ネットユーザーテストtestpassは/ ADDの製品SELECT * FROM - %'" |
MSSQL Serverは、システムに新しいユーザーを追加するためのコマンドを含むバッチ内のSQL文を実行します。このプログラムは、SAとMSSQLSERVERサービスの十分な権限を実行している場合、攻撃者がこのマシンにアクセスするには、システムのアカウントを取得することができます。
上記の例もののすることは、特定のデータベース・システムに接続されていますが、これは同様の攻撃が他のデータベースシステムに対してではないことを意味するものではありません。このセキュリティホールのビューでは、限り、異なる方法を使用するなど、様々なデータベースが苦しむ可能性があります。
SQLインジェクションを防ぐ方法
あなたは、攻撃者はSQLインジェクション攻撃のデータベース構造を実装するための情報を知っていると言うかもしれません。確かに、彼らは、漏れの危険性があるデータベースを得た後、誰もが、攻撃者がこの情報を取得する必要があります保証することはできません。あなたがデータベースにアクセスするためのオープンソースのソフトウェアパッケージを使用している場合は、そのようなフォーラムのプログラムとして、攻撃者が簡単に関連するコードを入手することができます。コードが不十分に設計されている場合、リスクはさらに大きくなります。現在、清華、phpwindは、これらおよびその他の人気のあるオープンソースのプログラムは、先例のSQLインジェクション攻撃されているphpcms。
これらの攻撃は常に低セキュリティコードで発生します。だから、特に選択ボックス、非表示のフォームフィールドやクッキーなど、ユーザーのデータから、外部からのデータ入力を信頼することはありません。上記の第1の例として、それが正常であっても、クエリにも災害を引き起こす可能性があります。
SQLインジェクション攻撃はあまり害、それに対抗するには?ここでは、SQLインジェクションの防止のための勧告が役に立つかもしれあります。
- Webアプリケーションは、厳密に、データベースを操作するデータベースインジェクション攻撃への被害を最小限に抑えた、彼らの最低限の権利の仕事を満たすことができるだけのユーザーを提供するために、権限を制限しました。
- 例えば、変数の型を、制限された所望のデータフォーマットを有する入力データを、いくつかのパケットの正規表現マッチング処理、またはそれがパケット列は、データの他の基本的なタイプに変換するのStrConvが決定されているかどうかをチェック。
- データベースに入力された特殊文字(「」角括弧&*;のように)エスケープ、またはエンコーディング変換.GO
text/template
パッケージ内のHTMLEscapeString
ファンクション文字列をエスケープすることができます。 - すべてのクエリがパラメータ化された文ではなく、直接SQL文をスプライシングされていないSQL文へのユーザ入力変数を埋め込むのパラメータを使用して、データベースが提供するパラメータ化クエリインターフェイスを使用することをお勧めします。たとえば、
database/sql
クエリ機能の内側Prepare
とQuery
かExec(query string, args ...interface{})
。 - テストのための専門的なSQLインジェクション検出ツールの推奨アプリケーションを公開し、修復が発見されたSQLインジェクションの脆弱性の前に。この点で多くのオンラインのオープンソースのツールは、例えばのために、ありますSQLMAP、SQLninjaようにと。
- 避けてくださいサイトは、このような一致しないフィールドとして、このようなエラーの種類として、SQLエラー情報をプリントアウトし、SQLステートメント内のコードは、これらのエラーメッセージのSQLインジェクションを使用して攻撃を防ぐために、暴露します。
概要
私たちが見ることができる上記の例では、SQLインジェクションは、有害ではなく、大きなセキュリティホールです。Webアプリケーションのために書く、それは非常に真剣にどんな小さなディテールのためにする必要がありますので、我々は通常、詳細は運命を決める、人生は、同様に、Webアプリケーションを書いて、そうです。