Web サイトを Web ホストに転送する準備がほぼ整いましたが、その前に、可能な限り十分に保護したいと考えています。MySQL インジェクションやその他の直面する可能性のある問題について聞いたことがありますが、どうすれば自分のサイト、MySQL データベース、およびファイルをそれらから保護できますか?
mysql エクステンションから mysqli または PDO に変更する予定ですが、どちらをお勧めしますか?
私は PDO を個人的に使用します。mysqli よりも優れています。mysql インジェクションが生データを次のようにクエリに挿入する場所であることがわからない場合:
$query = "SELECT * FROM users WHERE username='" .$_GET['user']. "' AND password='" .$_GET['password']. "'";
入力をサニタイズせずに、誰かが admin をユーザー名' OR '1'='1
として、パスワードとして入力すると、クエリは次のようになります。
SELECT * FROM users WHERE username='admin' AND password='' OR '1'='1'
これにより、クエリはパスワードを無視し、常に 1=1 である限り管理者としてログインします。mysql を使用するだけでmysql_real_escape_string($_GET['user'])
、クエリに影響を与える可能性のあるものをエスケープするために使用できます。攻撃者は、管理者としてログインするよりもはるかに悪いことを行う可能性があることに注意してください。たとえば、drop コマンドを使用してデータベース構造全体を削除し、その後のコードをコメントアウトしたり、実際に奇妙なシェルコードで Web サーバーに影響を与えたりする可能性があります。
PDO や MySQLi のようなものでは、準備されたステートメントは最初にデータベースにクエリがどうなるかを伝え、次にクエリに実際に情報を含めるのではなく、次のように情報を送信します。
$stm = $pdo->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stm->execute(array($_GET['user'], $_GET['password']));
編集:もう1つ、pdoを使用してmysqlインジェクションを実行することはまだ可能だと思いますが、それがどのように機能するかわかりませんので、もう少し調査して何かを見つけることができるかどうかを確認することをお勧めします.