ネットワークセキュリティ
 Computer >> コンピューター >  >> ネットワーキング >> ネットワークセキュリティ

PHP SQLインジェクションとは?知っておくべき仕組みと対策のすべて

インジェクション攻撃の中でも、PHP SQLインジェクション攻撃は特に顕著な脅威として知られています。実に多くのWebサイトがこの攻撃に対して脆弱であり、調査によればWebに対する攻撃の50%以上がSQLインジェクションによって行われています。本記事では、SQLインジェクションがどのように実行されるのか、そしてPHPアプリケーションでそれを防ぐための具体的な方法を詳しく解説します。

SQLインジェクション(SQLi)とは?

まず、SQLインジェクションの基本を理解しましょう。SQLインジェクション(SQLi)とは、攻撃者が実行されるSQLコマンドを偽装・改ざんすることで、バックエンドで動作するSQL文を書き換える攻撃手法です。この攻撃は主にフォームの入力フィールドを通じて行われ、データベースに深刻な被害をもたらします。最終的には、データベース内の機密性の高い情報が漏洩する結果につながります。攻撃者はSQLコマンドの注入によってデータベースを制御できるようになるため、データの挿入・更新、さらには削除まで自由に行えてしまいます。

SQLインジェクション攻撃は、コードが安全な方法で書かれていない場合に発生します。一見安全なコーディングに見えても、SQLiを許してしまう典型的なケースは以下のとおりです。

  • 空白文字のフィルタリングや型処理の誤り
  • サニタイズ(無害化)されていない、適切にエンコードされていないデータをデータベースに渡すこと
  • コードとデータの混在
  • 文字列の区切りに引用符を使用すること

要するに、ユーザー入力が適切に検証されていないと、ユーザーデータがデータベースによって悪意ある命令として解釈されることになります。フロントエンドから取得したユーザー入力をそのままクエリに挿入する実装も、同様にセキュリティ侵害につながります。

また、SQLiを招くもう一つの要因として、エラー内容がユーザーに表示されることが挙げられます。悪意のあるユーザーはこのエラー情報を悪用して、データベースの種類やバージョンに関する詳細を取得し、SQLインジェクション攻撃用のエクスプロイトを仕掛けることが可能になります。

PHP SQLインジェクションとは?

脆弱なコードの例

以下の脆弱なPHPコードを使って、PHP SQLインジェクション攻撃の仕組みを具体的に見てみましょう。

<?php
$username = $_POST['uname'];
$pass = $_POST['password'];
$sql = "SELECT * FROM user_table WHERE username='".$username."' AND userpwd='".$pass."'";
?>

上記のコードは、ユーザー入力を一切検証せずに直接受け入れ、データベース上で実行されるSQLクエリにそのまま挿入しています。攻撃者は、結果が常に真(true)となる論理クエリを挿入することもできます。例えば、$pass 変数に「' OR '1'='1」という値が渡されると、条件式は「1=1」となり常に真と評価されるため、認証を通過してログインに成功してしまいます。これは深刻なセキュリティ侵害につながります。

さらに、エラーがユーザーに表示されてしまう別のシナリオも見てみましょう。

<?php
...
...
elseif($mysqli->error)
{
print($mysqli->error);
}
?>

このようなケースでは、エラーログをユーザーの画面に表示するのではなく、エラーを専用のログファイルやデータベースに記録し、攻撃者からアクセスできないようにした上で、後からWebサイトがSQLi攻撃を受けた回数を分析できるようにするのがベストプラクティスです。

安全なコードの例

PHP SQLインジェクションを防ぐ安全なコーディングの例として、ユーザー名とパスワードに含まれる引用符などを事前に無害化する方法があります。

<?php
function checkUserInput($str)
{
return str_replace(array("'", '"'), array("&#39;", "&quot;"), $str);
}

$username = checkUserInput($_POST['uname']);
$pass = checkUserInput($_POST['password']);
?>

このように、ユーザー入力はSQLクエリに連結される前に検証・無害化できます。PHP SQLインジェクションを防ぐもう一つの効果的なアプローチが、プリペアドステートメント(PHP Data Objects:PDO)の使用です。これは、SQL文を安全に繰り返し実行できる効率的な手法です。PDOはパラメータ化クエリを簡単に扱えるメソッドを提供しており、コードの可読性と移植性も向上します。さらに、MySQLだけでなく他の種類のデータベースにも対応しています。PDOは、どの部分をユーザー入力として扱い、残りをデータベースコマンドとして扱うかを明確に分離します。

MySQLデータベース向けのPDO実装例は以下のとおりです。

// DB接続情報
define('DB_HOST', 'localhost');
define('DB_USER', 'John_Reaper');
define('DB_PASS', 'admin@wsxdn.com@$$w0rd$');
define('DB_NAME', 'users');

if(isset($_GET['id']))
{
$id = $_GET['id'];
if(is_numeric($id) == true)
{
try
{
$dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$q = "SELECT username FROM users WHERE id = :id";
$sth = $dbh->prepare($q);
$sth->bindParam(':id', $id);
$sth->execute();
$sth->setFetchMode(PDO::FETCH_ASSOC);
$res = $sth->fetchColumn();
print(htmlentities($res));
$dbh = null;
}
catch(PDOException $e)
{
error_log('PDOException - '.$e->getMessage(), 0);
http_response_code(500);
die('データベースへの接続に失敗しました');
}
}
else
{
http_response_code(400);
die('不正なリクエストのため処理できません');
}
}

PHP SQLインジェクションを防ぐためのベストプラクティス

以下のベストプラクティスを実践することで、WebサイトをSQLインジェクションから効果的に保護できます。

  1. JavaScriptによるフロントエンド、またはPHPによるバックエンドのいずれかで、ユーザー入力を必ず検証する。
  2. エラーをユーザーに表示しない。代わりにエラーをファイルに記録し、攻撃者がアクセスできないようにする。ユーザーに表示するエラーメッセージは、データベースに関する情報を一切漏らさない、ごく一般的な内容にする。
  3. SQLクエリのどの部分をユーザー入力として扱うかを明示的に指定できる、パラメータ化クエリ(プリペアドステートメント)を使用する。
  4. 悪用されやすいため、未使用のストアドプロシージャを削除し、SQLインジェクションの攻撃経路を減らす。
  5. 攻撃者が認証をバイパスした場合に備え、各ユーザーに必要最小限の適切な権限のみを付与し、被害の拡大を防ぐ。

PHP SQLインジェクションからの究極の保護

AstraのようなWAF(ファイアウォール)を導入することで、SQLiに対する耐性をさらに高めることができます。SQLiに加えて、Astra Security Suiteは、悪質なボット、XSS、CSRFなど、100種類以上の攻撃からWebサイトを守ります。

PHP SQLインジェクションとは?知っておくべき仕組みと対策のすべて

当社のマルウェアスキャナーは、10分以内にWebサイト全体をスキャンでき、2回目以降のスキャンはさらに短時間(1分未満)で完了します。また、セキュリティ監査およびペネトレーションテストサービスでは、Astraのエンジニアがコードの一行一行を手動で精査し、Webサイトの脆弱性を発見・修復することで、外部からの侵入を許さない堅牢なセキュリティを実現します。

PHP SQLインジェクションとは?知っておくべき仕組みと対策のすべて

今すぐAstraのデモをお試しください!

  1. BIMとは?知っておくべき基礎知識と活用方法を徹底解説

    デジタル時代の到来はさまざまな分野に変革をもたらしましたが、建設業界もその例外ではありません。建物の設計・施工に使われるツールの歴史を振り返ると、その始まりは鉛筆と紙でした。その後、CAD(コンピュータ支援設計)が登場し、手作業中心の製図を効率的な電子ドキュメントへと変革。さらにCADは3D化へと進化し、現在ではBIM(Building Information Modeling:ビルディング・インフォメーション・モデリング)が新たなスタンダードとなりつつあります。 建設業界を大きく変えるテクノロジートレンドとして注目されているのが、BIMです。BIMとは、施設の機能的・物理的な特徴をデジタル上

  2. ビーコンテクノロジー完全ガイド:仕組みから業界別の活用事例まで徹底解説

    2016年、「ポケモンGO」が世界中のニュースフィードを席巻し、老若男女を問わず多くの人々がスマートフォン片手に街へ繰り出しました。オフラインとオンラインの世界が融合したこの社会現象の陰には、実世界とデジタル世界をつなぎ、リアルタイムなインタラクションを実現した「ビーコンテクノロジー」の存在があります。本記事では、ビーコンテクノロジーの基本的な仕組みから、さまざまな業界での活用事例までを詳しく解説します。 ビーコンテクノロジーとは? ビーコンとは、壁やカウンターなどに設置する小型のハードウェア端末です。Bluetooth技術を利用して近くにあるモバイルデバイスを検知し、スマートフォンやタブレ