حمالات CSRF یا Cross-Site Request Forgeries که به معنای جعل درخواست بین سایتی میباشد یکی از باگ های امنیتی در اپلیکیشن های تحت وب میباشد . در این حمله نفوذ گر به کاربری که در سایت لاگین کرده و احراز هویت کرده یک لینک آلوده ارسال میکند و کاربر با کلیک بر روی آن لینک به سایتی که در آن احراز هویت کرده ، خساراتی را وارد میکند .
فرض کنید یک لینک به کاربر مورد نظر فرستاده شده که ظاهر آن لینک یک عکس باشد و href یا  src لینک یک مسیر مانند www.target.com/post/delete/25 میباشد.
به دلیل اینکه کاربر لاگین است و با کلیک بر روی آن لینک آلوده به راحتی post با آی دی 25 میتواند حذف شود .

برای جلوگیری از این نوع حملات باید برای هر کاربر یک token یکتا بسازید و آن را در سمت سرور (سشن) ذخیره نمایید و همچنین یک نمونه از آن را سمت کاربر در form های HTML کاربر ذخیره نمایید . کاربر در  درخواست های form خود ، token را به سمت سرور ارسال میکند، اگر مقدار آن token برابر با token ذخیره شده در سمت سرور یا سشن بود ، درخواست کاربر پذیرفته میشود ، در غیر اینصورت Request های کاربر اجرا نخواهد شد . هم چنین سعی کنید که در این موارد از متد post استفاده کنید .

برای جلو گیری از CSRF در PHP میتوان به صورت زیر عمل کرد . یک فرم تماس با ما که میخواهیم آن را ایمن نماییم .
2 مقدار Random را تولید کرده ، یکی را به عنوان نام و دیگری را به عنوان value در نظر میگیریم ، آن ها در session ذخیره کرده و همچنین در یک فیلد hidden در فرم به سمت سرور و controller ارسال میکنیم .

<!-- contact_us page -->

<!doctype html>
<html lang="en">
<head>
</head>
<body>
<?php
session_start();
$name = "Token-" . mt_rand();
$token = bin2hex(random_bytes(64));
$_SESSION[$name] = $token;
?>
<form action="ContactController.php" method="post">
    <input type="hidden" name="_csrfname"  value="<?php echo $name; ?>">
    <input type="hidden" name="_csrftoken" value="<?php echo $token; ?>">
    <button type="submit" name="sendBtn">Send</button>
</form>
</body>
</html>​

در این قسمت controller در سمت سرور ، tokenای که توسط فرم به سرور ارسال شده مورد بررسی قرار میگیرد ، اگر نام و مقدار آن مساوی توکن ذخیره شده در session باشد ، درخواست کاربر اجرا میشود ، در غیر اینصورت میتوان یک Exception را throw کرد .

// ContactController on server side

<?php

session_start();
error_reporting(E_ALL);
if (isset($_POST['sendBtn'])) {
    if (isset($_POST['_csrfname']) && isset($_POST['_csrftoken'])) {
        if (isset($_SESSION[$_POST['_csrfname']]) &&
            $_SESSION[$_POST['_csrfname']] === $_POST['_csrftoken'] && $_POST['_csrftoken'] !== '') {
            echo "Successful";
            //do anything
            unset($_SESSION[$_POST['_csrfname']]);
        } else {
            throw new Exception("token validation exception");
        }
    }
}

?>