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')
select id,username from front_user where id=1 or 1=1
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')
select id,username from front_user where username='zhiliao' or '1=1'
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')
概要:
1. SQL ステートメントを使用して、Web ページに対してインジェクション攻撃を実行します。Web ページはユーザー入力パラメーターを取得しますが、一部の悪意のあるユーザーは特別な SQL ステートメントを使用します。取得したパラメータの正当性を最後に判断しないと、データベースに損害を与える可能性があります2. getやpostでデータをアップロードする際は、パラメータを確認してください3. Django は特殊文字をエスケープしているため、Dajngo の ORM を使用すると SQL インジェクションを効果的に回避できます。
以上がDjango で SQL インジェクションを回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。