Serangan pemalsuan permintaan merentas tapak (CSRF) ialah cara biasa serangan rangkaian, dan ia tidak terkecuali dalam aplikasi dalam PHP. Ia menggunakan status log masuk pengguna untuk melakukan serangan, dan menyamar sebagai pengguna yang sah untuk menyerahkan permintaan berniat jahat dengan membina permintaan palsu, dengan itu menyebabkan kemudaratan. Artikel ini akan memperkenalkan cara untuk menghapuskan kelemahan CSRF dalam aplikasi PHP, termasuk contoh kod khusus dan analisis terperinci.
Serangan CSRF memintas mekanisme perlindungan tapak web dengan memalsukan permintaan Kaedah pintasan biasa ialah serangan "kata laluan". Untuk mengelakkan serangan ini, token CSRF perlu ditambahkan pada borang tapak web.
Kod belakang:
<?php if($_SERVER['REQUEST_METHOD'] == 'POST'){ session_start(); if($_POST['csrf_token'] == $_SESSION['csrf_token']){ //请求数据合法,执行操作 }else{ //CSRF令牌不合法 } } ?>
Kod hadapan:
<form method="POST" action="submit.php"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"> <!-- 其他表单数据 --> <button type="submit">提交</button> </form>
Untuk meningkatkan lagi keselamatan, token CSRF yang berbeza harus digunakan untuk operasi yang berbeza.
Kod belakang:
<?php //生成新的CSRF令牌 function generate_csrf_token(){ return md5(mt_rand(1, 1000000) . microtime()); } //验证CSRF令牌 function validate_csrf_token($token){ if(!isset($_SESSION['csrf_token']) || $_SESSION['csrf_token'] !== $token){ die("CSRF Token验证失败"); } } //生成CSRF令牌 if(!isset($_SESSION['csrf_token'])){ //不存在令牌,生成新的令牌 $_SESSION['csrf_token'] = generate_csrf_token(); } //用户提交的数据需要先进行CSRF令牌验证 if($_SERVER['REQUEST_METHOD'] == 'POST'){ validate_csrf_token($_POST['csrf_token']); //请求数据合法,执行操作 } ?>
Kod hadapan:
<form method="POST" action="submit.php"> <input type="hidden" name="csrf_token" value="<?php echo generate_csrf_token(); ?>"> <input type="hidden" name="action" value="delete"> <input type="hidden" name="id" value="123"> <button type="submit">删除用户</button> </form>
Tujuan serangan CSRF adalah untuk memintas pengesahan keselamatan tapak web, dan langkah pencegahan adalah terutamanya ditambah semasa proses penyerahan borang mekanisme Pengesahan. Untuk meningkatkan lagi keselamatan, token CSRF boleh terikat kepada pengguna.
Kod belakang:
<?php //生成新的CSRF令牌 function generate_csrf_token(){ return md5(mt_rand(1, 1000000) . microtime()); } //验证CSRF令牌 function validate_csrf_token($token){ if(!isset($_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']]) || !in_array($_SERVER['HTTP_USER_AGENT'], $_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']])){ die("CSRF Token验证失败"); } if(!isset($_SESSION['csrf_tokens'][$token])){ die("CSRF Token验证失败"); }else{ unset($_SESSION['csrf_tokens'][$token]); } } //生成CSRF令牌 if(!isset($_SESSION['csrf_tokens'])){ $_SESSION['csrf_tokens'] = []; } if(!isset($_SESSION['csrf_ips'])){ $_SESSION['csrf_ips'] = []; } if(!isset($_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']])){ $_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']] = [$_SERVER['HTTP_USER_AGENT']]; }else{ $_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']][] = $_SERVER['HTTP_USER_AGENT']; //限制用户代理 if(count($_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']]) > 3){ array_shift($_SESSION['csrf_ips'][$_SERVER['REMOTE_ADDR']]); } } $new_token = generate_csrf_token(); $_SESSION['csrf_tokens'][$new_token] = true; ?>
Kod hadapan:
<form method="POST" action="submit.php"> <input type="hidden" name="csrf_token" value="<?php echo $new_token; ?>"> <input type="hidden" name="action" value="delete"> <input type="hidden" name="id" value="123"> <button type="submit">删除用户</button> </form>
Melalui kaedah di atas, kelemahan CSRF dalam aplikasi PHP boleh dihapuskan dengan berkesan. Walau bagaimanapun, perlu diingatkan bahawa kaedah ini tidak boleh dipercayai sepenuhnya dan perlu diselaraskan dan diperbaiki berdasarkan keadaan sebenar. Pada masa yang sama, anda perlu mengelak daripada menghantar token CSRF ke dalam URL atau kuki untuk mengelak daripada memperkenalkan risiko keselamatan baharu.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah ralat pemalsuan permintaan merentas tapak dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!