Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyelesaikan masalah ralat pemalsuan permintaan merentas tapak dalam PHP?

Bagaimana untuk menyelesaikan masalah ralat pemalsuan permintaan merentas tapak dalam PHP?

王林
王林asal
2023-12-17 08:38:311121semak imbas

Bagaimana untuk menyelesaikan masalah ralat pemalsuan permintaan merentas tapak dalam PHP?

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.

  1. Tambah token CSRF

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>
  1. Gunakan token CSRF yang berbeza untuk setiap operasi

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>
  1. Ikat alamat IP dan maklumat ejen pengguna

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn