XSS・SQLインジェクション対策の基本

Webアプリケーション開発において、セキュリティ対策は避けて通れません。
PHPでシステムを構築する際にも、サニタイズ、SQLインジェクション防止、XSS対策などの基本を押さえることで、安全なアプリケーションが実現できます。

本記事では、PHP開発者が最低限知っておくべき3つの重要なセキュリティ技術を、具体的なコード例付きでわかりやすく解説します。


サニタイズとエスケープ(htmlspecialchars)

サニタイズ(Sanitize)とは、ユーザーから受け取った入力を無害化する処理です。特にHTML出力時にはhtmlspecialchars()を使って、JavaScriptの実行やHTML構造の崩壊を防ぐことが重要です。

例:ユーザー名の表示

<?php 
 $name = $_POST["name"] ?? ""; 
 // サニタイズ(出力時に使用) 
 $safe_name = htmlspecialchars($name, ENT_QUOTES, "UTF-8"); 
 echo "ようこそ、{$safe_name} さん!"; 
?>

<script>alert(1)</script>のような入力も無害化され、HTMLとして正しく表示されるだけになります。


SQLインジェクション対策(プリペアドステートメント)

SQLインジェクションは、悪意のある入力によってSQL文を改ざんされる攻撃です。PHPではPDO + プリペアドステートメントを使うことで安全にクエリを実行できます。

悪い例(NG)

<?php 
 // 危険:変数をSQLに直接埋め込んでいる 
 $id = $_GET["id"]; 
 $sql = "SELECT * FROM users WHERE id = $id"; 
 $result = $pdo-&gt;query($sql); 
?>

安全な書き方(OK)

<?php 
 $id = $_GET["id"] ?? 0; 
 $stmt = $pdo-&gt;prepare("SELECT * FROM users WHERE id = :id"); 
 $stmt-&gt;bindValue(":id", $id, PDO::PARAM_INT); 
 $stmt-&gt;execute(); 
 $user = $stmt-&gt;fetch(); 
?>

これにより、1 OR 1=1 のような不正なクエリを防ぐことができます。


クロスサイトスクリプティング(XSS)対策

XSS(クロスサイトスクリプティング)は、ユーザーが入力したスクリプトを他のユーザーに表示・実行させる攻撃です。
特に掲示板やコメント欄など、他人の入力を表示する機能では要注意です。

安全な出力の例

<?php 
 $comment = $_POST["comment"] ?? ""; 
 // HTMLエスケープ 
 $safe_comment = htmlspecialchars($comment, ENT_QUOTES, "UTF-8"); 
 echo "<p>" . $safe_comment . "</p>"; 
?>

htmlspecialchars() を適切に使うことで、タグとして認識されず、文字列として安全に表示されます。

保存時のサニタイズ vs 表示時のエスケープ

保存時: できるだけ「元の入力」をそのまま保存
表示時: htmlspecialchars()必ずサニタイズ


まとめ

今回は、PHPでWebアプリケーションを作成する際に最低限知っておきたいセキュリティ対策を紹介しました。

  • サニタイズ: htmlspecialchars()でXSSを防ぐ
  • SQLインジェクション: プリペアドステートメントで安全なDB操作
  • XSS対策: 特にユーザー投稿型機能で厳重に対応

これらは「守りの技術」ですが、セキュリティ対策こそが信頼できるWebアプリケーションの基本です。

次回は、認証強化やCSRF対策、パスワードリセット機能など、「セキュリティ応用編」に進んでいきます!

採用情報 長谷川 横バージョン
SHARE
PHP Code Snippets Powered By : XYZScripts.com