ホームページ  >  記事  >  バックエンド開発  >  PHP 登録攻撃を防ぐ実際の事例と解決策

PHP 登録攻撃を防ぐ実際の事例と解決策

王林
王林オリジナル
2023-08-27 14:49:57719ブラウズ

PHP 登録攻撃を防ぐ実際の事例と解決策

PHP アンチ登録攻撃の実践的な事例と解決策

はじめに:

インターネットの急速な発展に伴い、ネットワーク セキュリティの問題はますます深刻になっています。深刻な。 。中でも登録アンチスワイプ攻撃は一般的な攻撃手法であり、攻撃者は自動スクリプトや悪意のあるプログラムを使用して大量のアカウントを登録し、サーバーのリソースを大幅に消費し、通常の Web サイトの使用に影響を与えます。この記事では、PHP をベースにした実際の事例を紹介し、それに対応する防御ソリューションを提供します。

事例の背景:

ユーザー登録機能があるとします。ユーザーは、ユーザー名、パスワード、メールアドレスなどの情報を入力して登録する必要があります。ユーザーが送信した登録情報を受信した後、システムは PHP スクリプトを通じてユーザー情報をデータベースに書き込みます。

攻撃者は自動化されたプログラムやスクリプトを使用して、一度に大量の登録リクエストをサーバーに送信し、大量の悪意のあるアカウントを瞬時に登録します。この攻撃手法によりサーバーのリソースが枯渇し、一般ユーザーの登録やログインができなくなり、Webサイトに重大な障害が発生します。

防御計画:

  1. 検証コード機能の追加

検証コードは、現在、ロボット攻撃を防ぐために最も一般的に使用されている手段の 1 つです。ユーザー登録ページに認証コード機能を追加することで、画像内の認証コードを入力することで本人であることを確認することができます。

コード例:

<!-- 在注册页面的表单中添加验证码输入框 -->
<form action="register.php" method="post">
  <!-- 其他表单字段 -->
  <label for="captcha">验证码:</label>
  <input type="text" name="captcha" id="captcha" required>
  <img src="captcha.php" alt="验证码">
  <!-- 其他表单字段 -->
  <button type="submit">注册</button>
</form>

<!-- 生成验证码的captcha.php文件 -->
<?php
session_start();

// 生成随机验证码
$code = substr(md5(rand()), 0, 4);

// 将验证码存入SESSION中
$_SESSION['captcha'] = $code;

// 创建一个空白图片
$image = imagecreatetruecolor(80, 40);

// 设置颜色
$bgColor = imagecolorallocate($image, 255, 255, 255);
$textColor = imagecolorallocate($image, 0, 0, 0);

// 填充背景色
imagefill($image, 0, 0, $bgColor);

// 写入验证码
imagestring($image, 5, 20, 10, $code, $textColor);

// 输出图片
header('Content-type: image/jpeg');
imagejpeg($image);

// 销毁图片
imagedestroy($image);
?>

上記のコードでは、まず登録ページのフォームに確認コード入力ボックスを追加する必要があります。登録を完了するには、ユーザーは確認コードを正しく入力する必要があります。同時に、検証コードイメージを生成するには、captcha.php ファイルをサーバー上に作成する必要があります。このファイルはランダムな検証コードを生成し、SESSION に保存します。次に、PHP の imagecreatetruecolor() 関数を使用して空の画像を作成し、背景色とテキストの色を設定して、画像に検証コードを書き込みます。最後に、生成された検証コード画像がヘッダー関数を通じてブラウザに出力されます。

  1. IP およびユーザー制限を追加する

同じ IP または同じユーザーが一定期間内に 1 回のみ登録するように制限することで、登録アンチブラッシングの影響が軽減されます。攻撃を効果的に軽減できます。

コード例:

<?php
session_start();

// 获取IP地址
$ip = $_SERVER['REMOTE_ADDR'];

// 获取用户ID或其他唯一标识符
$userId = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : '';

// 设置时间间隔限制(单位:秒)
$timeLimit = 60;

// 检查用户是否已经在规定时间内注册过
if (checkRegistrationLimit($ip, $userId, $timeLimit)) {
  // 用户已经在规定时间内注册过,显示错误信息,禁止注册
  echo '您已经在规定时间内注册过了!';
  exit;
}

// 其他注册逻辑

// 完成注册后记录IP和用户信息
recordRegistrationInfo($ip, $userId);

// 其他后续操作

// 检查用户是否在规定时间内已经注册过
function checkRegistrationLimit($ip, $userId, $timeLimit) {
  // 在数据库或文件中记录用户注册时间
  // 判断是否在指定时间内已经注册过
  // 返回true或false
}

// 记录用户注册信息
function recordRegistrationInfo($ip, $userId) {
  // 在数据库或文件中记录用户IP和用户ID等信息
}
?>

上記のコードでは、まず $_SERVER['REMOTE_ADDR'] を通じてユーザーの IP アドレスを取得し、$_SESSION[ ' user_id']ユーザーの ID またはその他の一意の識別子を取得します。時間間隔の制限 (60 秒など) を設定します。次に、checkRegistrationLimit() 関数を使用して、ユーザーが指定された時間内に登録したかどうかを確認します。存在する場合は、エラー メッセージが表示され、登録が禁止されます。そうでない場合は、他の登録ロジックが実行され、登録完了後、recordRegistrationInfo() 関数を使用してユーザーの IP とユーザー ID が記録され、その他の情報。

結論:

検証コード機能、IP およびユーザー制限などを追加することで、PHP 登録アンチブラッシング攻撃を効果的に防ぐことができます。実際の開発では、Web サイトのセキュリティを向上させるために、特定の状況に応じて調整を行ったり、その他のセキュリティ対策を追加したりすることができます。

以上がPHP 登録攻撃を防ぐ実際の事例と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。