ホームページ >バックエンド開発 >Python チュートリアル >Django で SQL インジェクションを回避する方法
Django で SQL インジェクションを回避する方法: 1. ユーザー入力を確認する; 2. SQL の動的アセンブリを使用しない; 3. 機密情報を直接保存しない; 4. アプリケーション例外情報を指定する必要がある 使用は最小限にする可能な限りプロンプトを表示; 5. Dajngo の ORM を使用して、SQL インジェクションを効果的に回避します。
#SQL インジェクションとは何ですか?
いわゆる SQL インジェクションとは、ページ リクエストのドメイン名やクエリ文字列を送信または入力するために Web フォームに SQL コマンドを挿入し、最終的にサーバーをだまして悪意のある SQL コマンドを実行させることです。 。具体的には、既存のアプリケーションを使用して、(悪意のある) SQL コマンドをバックエンドのデータベース エンジンに挿入して実行する機能であり、(悪意のある) SQL ステートメントを Web フォームに入力することで、セキュリティの脆弱性のある Web サイトの情報を取得できます。設計者が意図したとおりに SQL ステートメントを実行するよりも、たとえば、これまでの多くの映画やテレビの Web サイトでは、主に WEB フォームを通じてクエリ文字を送信することによって VIP メンバーのパスワードが漏洩していましたが、このようなフォームは特に SQL インジェクション攻撃に対して脆弱です。 たとえば、現在データベースにfront_user テーブルがあります。テーブル構造は次のとおりです:class User(models.Model): telephone = models.CharField(max_length=11) username = models.CharField(max_length=100) password = models.CharField(max_length=100)
次に、ネイティブ SQL ステートメントを使用して次の要件を実現します:
1. ユーザー ID に基づいてユーザーの詳細を取得するビューを実装します。サンプル コードは次のとおりです。def index(request): user_id = request.GET.get('user_id') cursor = connection.cursor() cursor.execute('select id,username from front_user where id=%s' % user_id) rows = cursor.fetchall() for row in rows: print(row) return HttpResponse('success')これは、表面上は問題ないようです。ただし、ユーザーによって渡された user_id が 1 または 1=1 の場合、上記の結合された SQL ステートメントは次のようになります。
select id,username from front_user where id=1 or 1=1上記の SQL ステートメントの条件は、id=1 または 1=1 です。 id=1 である限り、または 2 つの 1=1 のうちの 1 つが true の場合、条件全体が true になります。 1=1 が確実に成立するのは間違いありません。したがって、上記の SQL ステートメントを実行すると、front_user テーブル内のすべてのデータが抽出されます。 2. ユーザー名に基づいてユーザーを抽出するビューを実装します。サンプル コードは次のとおりです。
def index(request): username = request.GET.get('username') cursor = connection.cursor() cursor.execute('select id,username from front_user where username='%s'' % username) rows = cursor.fetchall() for row in rows: print(row) return HttpResponse('success')これは、表面上は問題ないようです。ただし、ユーザーによって渡されたユーザー名が zhiliao' または '1=1 の場合、上記の結合後の SQL ステートメントは次のようになります。
select id,username from front_user where username='zhiliao' or '1=1'上記の SQL ステートメントの条件は、username='zhiliao' または文字列です。 、何も疑いません、文字列の判断は間違いなく確立されています。したがって、front_user テーブル内のすべてのデータが抽出されます。
SQL インジェクション防御は次の点に分類できます。
以上が SQL インジェクションの原理です。彼は、自身の目的を達成するために、いくつかの悪意のあるパラメータを渡して、元の SQL ステートメントを破壊します。もちろん、SQL インジェクションは決して単純ではなく、ここで説明しているのは氷山の一角にすぎません。では、SQL インジェクションを防ぐにはどうすればよいでしょうか? 1. ユーザー入力を決して信用しないでください。ユーザーの入力を検証するには、正規表現を使用したり、長さを制限したり、一重引用符や二重 '-' を変換したりすることができます。 2. SQL の動的アセンブリは決して使用しないでください。データのクエリとアクセスには、パラメーター化された SQL を使用するか、ストアド プロシージャを直接使用できます。例:def index(request): user_id = '1 or 1=1' cursor = connection.cursor() cursor.execute('select id,username from front_user where id=%s',(user_id,)) rows = cursor.fetchall() for row in rows: print(row) return HttpResponse('success')3. 管理者権限を持つデータベース接続は決して使用せず、アプリケーションごとに権限が制限された別のデータベース接続を使用してください。 4. 機密情報を直接保存せず、パスワードや機密情報を暗号化またはハッシュ化してください。 5. アプリケーションの例外情報では、プロンプトをできるだけ少なくする必要があります。カスタム エラー情報を使用して、元のエラー情報をラップするのが最善です。
概要:
1. SQL ステートメントを使用して、Web ページに対してインジェクション攻撃を実行します。Web ページはユーザー入力パラメーターを取得しますが、一部の悪意のあるユーザーは特別な SQL ステートメントを使用します。取得したパラメータの正当性を最後に判断しないと、データベースに損害を与える可能性があります2. getやpostでデータをアップロードする際は、パラメータを確認してください3. Django は特殊文字をエスケープしているため、Dajngo の ORM を使用すると SQL インジェクションを効果的に回避できます。
以上がDjango で SQL インジェクションを回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。