ホームページ >バックエンド開発 >PHPチュートリアル >PHP は安全なプログラミングを実装します: ハッカーに対する実際的な攻撃と防御
インターネットの継続的な発展と深化に伴い、さまざまなハッカー攻撃が頻繁に発生し、ネットワーク セキュリティに深刻な脅威をもたらしています。 PHP は、多くの企業や開発者が Web サイトやアプリケーションを作成するために一般的に使用されている Web 開発言語です。そのため、PHPプログラミングにおいては、いかに安全なプログラミングを実現するかが非常に重要になってきます。
この記事では、PHP 言語の一般的なセキュリティ脆弱性と、これらの脆弱性を防ぐ方法を紹介します。同時に、ハッカー攻撃の事例とその対策についても紹介します。
SQL インジェクションは、現在最も一般的な Web 攻撃手法の 1 つです。攻撃者は入力ボックスの SQL ステートメントの脆弱性を利用し、アプリケーションに特定の入力を通じて悪意のある SQL コードを実行させ、データを取得して改ざんします。
SQL インジェクションを防ぐにはどうすればよいですか?
① プリペアド ステートメントを使用する
PHP の PDO または MySQLi 拡張機能を使用して、プリペアド ステートメントを実装します。準備されたステートメントは、実行前に SQL ステートメントとユーザー入力を分離するため、SQL ステートメントに対するユーザー入力インジェクション攻撃を回避します。
サンプル コード:
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username'); $stmt->bindParam(':username', $username); $stmt->execute();
② 入力のフィルタリング
いかなる場合でも、ユーザーの入力を信頼しないでください。ユーザー入力を常にフィルターします。 PHP の filter_input 関数を使用することも、開発者が独自のフィルター関数を作成することもできます。
サンプル コード:
// 使用filter_input来避免SQL注入 $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_SPECIAL_CHARS);
③ ユーザー入力の制限
入力の制限は、ユーザーが悪意のある SQL コードを入力するのを防ぐ、より厳格な検証方法です。たとえば、ユーザー名に特殊文字を含めないこと、またはユーザー名の長さが 6 文字以上であることを規定できます。
クロスサイト スクリプティング攻撃は、Web アプリケーションに対する攻撃手法であり、攻撃者は Web サイトにスクリプト コードを埋め込み、 user Web サイトにアクセスしたときに実行されます。
XSS 攻撃を防ぐにはどうすればよいですか?
① ユーザー入力をフィルターする
SQL インジェクションを防ぐのと同じように、ユーザー入力もフィルターする必要があります。たとえば、 htmlspecialchars 関数を使用すると、ユーザー入力をフィルターし、特殊文字を HTML エンティティに変換できます。
サンプルコード:
echo htmlspecialchars($_POST['message']);
② Cookie を HTTP のみとしてマークする
Cookie を設定する場合、HTTP のみのタグを使用できます。これにより、JavaScript およびその他のクライアント側スクリプトが Cookie にアクセスできなくなります。攻撃者が Cookie にアクセスできない場合、セッション ハイジャック攻撃を使用することはできません。
サンプル コード:
setcookie('session_id', $session_id, time() + 86400, '/', '', true, true);
ファイル インクルードの脆弱性は、一般的な Web 攻撃手法です。攻撃者は何らかの手段を使用してサーバー ファイル システムを操作し、悪意のあるコードを封じ込めて実行します。
ファイルインクルードの脆弱性を防ぐにはどうすればよいですか?
① 絶対パスを使用する
相対パスは特定の状況下では使用できますが、限られたツールに遭遇したりディレクトリ構造が変更された場合に悪用される可能性があります。この種の問題を回避するには、絶対パスを使用してください。
サンプル コード:
// 路径在Unix系统下 include '/var/www/html/includes/config.php';
② ファイル インクルード ディレクトリの制限
インクルードできるディレクトリの制限は、ファイル インクルードのセキュリティを実現する最も直接的かつ効果的な方法の 1 つです。開発者は、アプリケーションに含めることができるファイル パスをハードコーディングすることも、php.ini ファイルの open_basedir オプションを使用して、アクセス可能なファイル パスを制限することもできます。
CSRF (クロスサイト リクエスト フォージェリ) 攻撃は、クロスサイト リクエスト フォージェリ攻撃とも呼ばれ、ログに記録されたユーザーの ID を使用する攻撃者を指します。 in user to ユーザーの知らないうちに特定のアクションを実行する攻撃。
CSRF 攻撃を防ぐにはどうすればよいですか?
① HTTP Referer ヘッダーを確認する
HTTP Referer ヘッダーは、ユーザーがターゲット ページにリンクする Web ページを参照します。 CSRF 攻撃では、攻撃者が正しい HTTP Referer ヘッダーを偽造できないことがよくあります。したがって、開発者は HTTP Referer ヘッダーを検証して、CSRF 攻撃の可能性を検出できます。
サンプル コード:
// 从HTTP Referer头中获取URL $referrer = parse_url($_SERVER['HTTP_REFERER']); if ($referrer['host'] !== 'example.com') { // 可能是CSRF攻击,拒绝请求 die('CSRF detected!'); }
② CSRF トークンの追加
CSRF トークンは、CSRF 攻撃を防ぐ効果的な方法です。フォーム送信ごとに、偽のフォーム送信を防ぐためにフォーム データに含まれる一意の識別子を生成します。
サンプルコード:
// 在表单中添加CSRF令牌 session_start(); $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
攻撃者がフォームを送信する際には、CSRFトークンが正しいかどうかを検証する必要があります:
// 验证CSRF令牌是否正确 session_start(); if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { // 可能是CSRF攻击,拒绝请求 die('CSRF detected!'); }
ハッカー攻撃のケースはよくあります。以下は典型的な攻撃シナリオです。
攻撃者はユーザー名とパスワードを取得した後、ターゲット Web サイトのユーザー リストを表示しようとします。この Web サイトは PHP を使用して開発され、情報の保存には MySQL データベースを使用します。攻撃者はいくつかの基本的な SQL インジェクション手法を試し、最終的にインジェクション攻撃を通じてターゲット Web サイトのユーザー リストを取得しました。
この攻撃にどう対処すればよいでしょうか?
この攻撃は以下の対策で防ぐことができます。
①ユーザー入力の厳格な検証
前述のように、ユーザー入力のフィルタリング、事前設定された処理を使用したユーザー入力の制限によって、ステートメントやその他のメソッドを使用すると、SQL インジェクション攻撃を回避できます。
② アクセス制御の強化
ユーザーデータのセキュリティを確保するためには、アクセス制御を強化し、適切な権限を設定する必要があります。特定の権限を持つユーザーのみが、ユーザー リストの表示などの関連操作を実行できます。
③ 暗号化
暗号化により、パスワードやアカウント情報などの機密情報を保護できます。すべての機密情報が保存および送信されるときに暗号化されていることを確認する必要があります。
要約
この記事では、PHP プログラミングにおける一般的なセキュリティ脆弱性と、SQL インジェクション、クロスサイト スクリプティング攻撃、ファイル インクルードの脆弱性、CSRF 攻撃などを含むこれらの脆弱性を防ぐ方法を紹介します。また、ハッカー攻撃事例も分析し、対応策を提供しました。これらの手段を通じて、開発者はアプリケーションのセキュリティを強化し、ユーザー データを保護できます。
以上がPHP は安全なプログラミングを実装します: ハッカーに対する実際的な攻撃と防御の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。