SQL注入およびSQL注入の防止方法

1327 ワード

一、SQL注入の概要
WebフォームにSQLコマンドを挿入してドメイン名やページリクエストのクエリー文字列をコミットまたは入力することで、サーバをだまして悪意のあるSQLコマンドを実行します.
二、SQL注入攻撃の考え方
  • SQL注入位置
  • を見つける
  • サーバタイプとバックグラウンドデータベースタイプを判断する
  • 異なるサーバとデータベースの特徴に対してSQL注入攻撃
  • を行う
    三、SQL注入例
    ユーザー名とパスワードを入力するログインインタフェースのバックグラウンドプログラムで検証するSQL文は次のとおりです.
    select * from user_table where username=' "$username" ' and password= ' "$password" ';
    

    ログイン画面に次のユーザー情報を入力します.
       : 'or 1=1 --
      :
    

    バックグラウンドで検証されたSQL文は次のとおりです.
    select * from user_table where username= '' or 1=1 -- and password='' 
    

    条件の後ろにusername=’or 1=1というのは、必ず実行に成功することを意味します.
    四、SQL注入防止方法
  • ユーザ入力変数のデータ型とフォーマットをチェックするa.フロントエンドはJSを用いて不正文字が含まれているかどうかをチェックするb.正規表現を用いて入力パラメータをフィルタするc.PHP関数を用いて変数をチェックする
  • .
  • 特殊な記号をフィルタリングフォーマットを固定できない変数に対して、いくつかの特殊な記号のフィルタリングまたはエスケープ処理を行う.PHPでは、通常addslashes関数が使用されます.これには、単一引用符、二重引用符、逆スラッシュ、NULLを含む定義済み文字の前に、逆スラッシュエスケープが追加されます.この方法は比較的安全であるが,
  • を解読することができる.
  • 変数をバインドし、プリコンパイル文MySQLのmysqliドライバを使用してプリコンパイル文のサポートを提供します.プログラム言語によって、プリコンパイル文を使用する方法があります.実際、バインド変数はプリコンパイル文を使用するのがSQL注入を予防する最善の方法であり、プリコンパイルされたSQL文を使用しても意味は変わりません.SQL文では、変数は疑問符を使用しますか?これによりSQL文の構造を変えることができず、ユーザーが「'or 1=1-」と入力してもクエリを文字列として解釈するだけで、SQL攻撃の発生を根本的に根絶することができるということです.