Kes praktikal dan penyelesaian untuk mencegah serangan pendaftaran PHP
Pengenalan:
Dengan perkembangan pesat Internet, masalah keselamatan rangkaian menjadi semakin serius. Antaranya, serangan anti-leret pendaftaran ialah kaedah serangan biasa Penyerang menggunakan skrip automatik atau program berniat jahat untuk mendaftarkan sejumlah besar akaun, yang banyak menggunakan sumber pelayan dan menjejaskan penggunaan laman web biasa. Artikel ini akan memperkenalkan kes praktikal berdasarkan PHP dan menyediakan penyelesaian pertahanan yang sepadan.
Latar belakang kes:
Katakan kita mempunyai fungsi pendaftaran pengguna Pengguna perlu memasukkan nama pengguna, kata laluan, alamat e-mel dan maklumat lain untuk mendaftar. Selepas menerima maklumat pendaftaran yang dikemukakan oleh pengguna, sistem akan menulis maklumat pengguna ke dalam pangkalan data melalui skrip PHP.
Penyerang menggunakan program atau skrip automatik untuk menghantar sejumlah besar permintaan pendaftaran ke pelayan pada satu masa dan mendaftarkan sejumlah besar akaun berniat jahat serta-merta. Kaedah serangan ini akan menyebabkan sumber pelayan kehabisan, pengguna biasa tidak akan dapat mendaftar atau log masuk, menyebabkan masalah serius kepada laman web.
Penyelesaian pertahanan:
Kod pengesahan kini merupakan salah satu cara yang paling biasa digunakan untuk mencegah serangan robot. Dengan menambahkan fungsi kod pengesahan pada halaman pendaftaran pengguna, pengguna boleh diminta memasukkan kod pengesahan dalam gambar untuk memastikan pengguna adalah sahih.
Contoh kod:
<!-- 在注册页面的表单中添加验证码输入框 --> <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); ?>
Dalam kod di atas, anda perlu menambah kotak input kod pengesahan pada borang di halaman pendaftaran terlebih dahulu. Pengguna perlu memasukkan kod pengesahan dengan betul untuk melengkapkan pendaftaran. Pada masa yang sama, untuk menghasilkan imej kod pengesahan, fail captcha.php perlu dibuat pada pelayan. Fail ini menjana kod pengesahan rawak dan menyimpannya dalam SESI. Kemudian, gunakan fungsi imagecreatetruecolor()
PHP untuk mencipta imej kosong, menetapkan warna latar belakang dan warna teks dan menulis kod pengesahan ke dalam imej. Akhir sekali, imej kod pengesahan yang dijana adalah output kepada penyemak imbas melalui fungsi pengepala. imagecreatetruecolor()
函数创建一个空白图片,设置背景色和文字颜色,并将验证码写入图片中。最后,通过header函数将生成的验证码图片输出到浏览器中。
通过限制同一IP或同一用户在一定时间内只能注册一次,可以有效减缓注册防刷攻击的影响。
代码示例:
<?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()
Dengan mengehadkan IP yang sama atau pengguna yang sama untuk mendaftar sekali sahaja dalam tempoh masa tertentu, kesan serangan anti-memberus pendaftaran boleh dikurangkan dengan berkesan .
🎜Contoh kod: 🎜rrreee🎜Dalam kod di atas, mula-mula dapatkan alamat IP pengguna melalui$_SERVER['REMOTE_ADDR']
, dan hantar $_SESSION['user_id']
Dapatkan ID pengguna atau pengecam unik lain. Tetapkan had selang masa, seperti 60 saat. Kemudian, semak sama ada pengguna telah mendaftar dalam masa yang ditetapkan melalui fungsi checkRegistrationLimit()
. Jika ya, mesej ralat dipaparkan dan pendaftaran adalah dilarang jika tidak, logik pendaftaran lain dilaksanakan, dan selepas pendaftaran selesai, fungsi recordRegistrationInfo()
digunakan untuk merekodkan IP pengguna, ID pengguna dan maklumat lain. 🎜🎜Kesimpulan: 🎜🎜Dengan menambahkan fungsi kod pengesahan, IP dan sekatan pengguna, dsb., serangan anti-memberus pendaftaran PHP boleh dicegah dengan berkesan. Dalam pembangunan sebenar, pelarasan boleh dibuat mengikut keadaan tertentu dan langkah keselamatan lain boleh ditambah untuk meningkatkan keselamatan laman web. 🎜Atas ialah kandungan terperinci Kes dan penyelesaian praktikal untuk mencegah serangan pendaftaran PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!