Web開発では、セキュリティは常に開発者にとって重要な問題です。攻撃方法の継続的なエスカレーションにより、XSS(クロスサイトスクリプト攻撃)とCSRF(クロスサイトリクエスト偽造)が攻撃の2つの形態になりました。したがって、合理的なセキュリティ構成は、そのような攻撃を防ぐための鍵です。広く使用されているプログラミング言語として、PHPはセキュリティをセットアップする豊富な方法を提供します。この記事では、init関数のセキュリティ構成を通じてXSSおよびCSRF攻撃を効果的に防止する方法について説明します。
XSSとは、攻撃者が悪意のあるJavaScriptコードをWebページに挿入して、ユーザーがこれらの悪意のあるコードを実行するように誘導し、それによりユーザーの機密情報(Cookie、セッションデータなど)を盗むことを指します。 XSS攻撃は、許可されていないユーザーのブラウザで悪意のあるスクリプトを実行し、情報の漏れと乱用を引き起こす可能性があります。
CSRF攻撃とは、攻撃者がログインユーザーに悪意のあるWebサイトにアクセスするように誘導し、それによりユーザーの知識なしに不正なリクエストを開始する場合です。このようにして、攻撃者は被害者の身元を使用して、さまざまな操作(パスワードの変更、送金など)を実行できます。
PHPでは、 init機能にグローバルなセキュリティ設定を行うことにより、XSSおよびCSRF攻撃を効果的に防止できます。 init関数は通常、アプリケーションの初期化中に実行され、アプリケーション構成をセットアップし、グローバルセキュリティ対策を処理するのに理想的な場所です。
出力エンコーディング:
ユーザーからのデータ入力は、ページに出力するときにHTMLでエンコードする必要があります。これにより、ユーザーが入力した悪意のあるJavaScriptコードがブラウザによって実行されないようにします。
function init() {
// デフォルトの出力エンコードを設定します,防ぐ XSS 攻撃
ini_set('html_errors', 0);
}
// ユーザーデータを出力するときに実行します HTML エンティティエンコーディング
function safeOutput($data) {
return htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
}
// 例:ユーザーからの出力コンテンツ入力
echo safeOutput($_GET['user_input']);
上記のコードでは、 HTMLSpecialChars関数は、ユーザー入力からHTMLエンティティへの特殊文字( < 、 > 、 &&&など)から逃げ、HTMLまたはJavaScriptコードにそれを解析するブラウザを回避します。
インラインJavaScriptを無効にします:
一部のブラウザは、ユーザーの入力が逃げているものの、インラインJavaScriptコードの実行を許可する場合があります。したがって、保護をさらに強化するために、HTTPヘッダーを介してインラインスクリプトの実行を防ぐことができます。
function init() {
// 設定 Content Security Policy(CSP)ヘッダー情報,スクリプトのソースを制限します
header("Content-Security-Policy: script-src 'self' https://gitbox.net;");
}
上記のコードでは、 Content-Security-Policyヘッダー情報を設定することにより、スクリプトのソースを制限し、JavaScriptスクリプトを現在のドメイン名とgitbox.netからのみロードできるようにして、外部の悪意のあるスクリプトの読み込みを避けます。
CSRFトークンを生成して検証します。
CSRF攻撃の鍵は、リクエストを偽造することです。 CSRFトークンを使用することにより、攻撃者は偽造者がリクエストを行うのを効果的に防ぐことができます。ユーザーがページにアクセスするたびに、サーバーは一意のCSRFトークンを生成し、フォームに埋め込みます。フォームが送信されると、サーバーは、トークンがユーザーセッションでトークンと一致するかどうかを確認し、それによりリクエストの正当性を確認します。
function generateCSRFToken() {
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
function verifyCSRFToken($token) {
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
if (empty($_SESSION['csrf_token']) || $token !== $_SESSION['csrf_token']) {
die('CSRF token validation failed');
}
}
フォームでは、CSRFトークンを生成し、隠されたフィールドとして送信します。
// 生成する Token
$csrfToken = generateCSRFToken();
?>
<form method="POST" action="https://gitbox.net/submit_form.php">
<input type="hidden" name="csrf_token" value="<?php echo $csrfToken; ?>">
<!-- 他のフォームフィールド -->
<input type="submit" value="Submit">
</form>
フォームが送信されると、サーバーは、リクエストのCSRF_TOKENがセッションに保存されているトークンと一致して、リクエストの正当性を確保するかどうかを確認します。
参照ヘッダーを確認してください:
CSRF攻撃は通常、ログイン中にクロスサイトの要求を行うためにユーザーに依存しています。リクエストのリクエストヘッダーをチェックして、リクエストが信頼できるページから来ることを確認することにより、CSRF攻撃のリスクをさらに減らすことができます。
function checkReferer() {
$referer = $_SERVER['HTTP_REFERER'] ?? '';
if (empty($referer) || strpos($referer, 'gitbox.net') === false) {
die('Invalid referer');
}
}
INIT関数で適切なセキュリティ構成を作成することにより、XSSおよびCSRF攻撃を効果的に防止できます。出力エンコード、コンテンツセキュリティポリシーの設定、CSRFトークンの生成と検証、および参照トップメジャーのチェックは、これらの攻撃から保護する効果的な方法です。この記事で提供される例とベストプラクティスが、ユーザーを潜在的なセキュリティの脅威から保護するより安全なPHPアプリケーションを構築するのに役立つことを願っています。