Cross Site Request Forgery: تفاوت بین نسخه‌ها

از Secure Coding

سطر ۵: سطر ۵:
 
برای مثال مهاجم با ارسال فرم حاوی درخواست تغییر کلمه عبور مدیر اپلیکیشن، کلمه عبور مدیریت را بدون اطلاع مدیر ویرایش می نماید.
 
برای مثال مهاجم با ارسال فرم حاوی درخواست تغییر کلمه عبور مدیر اپلیکیشن، کلمه عبور مدیریت را بدون اطلاع مدیر ویرایش می نماید.
  
نمونه فرم آسیب پذیر:
+
== نمونه فرم آسیب پذیر: ==
  
 
<form method="post" action="process.php">
 
<form method="post" action="process.php">
سطر ۱۳: سطر ۱۳:
 
</form>
 
</form>
  
روش های جلوگیری
+
== روش های جلوگیری ==
 +
 
 +
=== روش های جلوگیری در PHP ===
  
 
۱) ایجاد توکن تصادفی برای درخواست ها
 
۱) ایجاد توکن تصادفی برای درخواست ها
سطر ۱۹: سطر ۲۱:
 
ایجاد مقدار تصادفی در فرم:
 
ایجاد مقدار تصادفی در فرم:
  
 +
<div lang="en" dir="ltr" class="mw-content-ltr">
 +
<pre>
 
<?php
 
<?php
 
// Generate CSRF token
 
// Generate CSRF token
سطر ۳۱: سطر ۳۵:
 
   <button type="submit">Login</button>
 
   <button type="submit">Login</button>
 
</form>
 
</form>
 +
</pre>
 +
</div>
  
 
بررسی صحت مقدار ارسالی در سمت سرور
 
بررسی صحت مقدار ارسالی در سمت سرور

نسخهٔ ‏۲۳ مارس ۲۰۲۳، ساعت ۱۴:۱۵

آسیب پذیری جعل درخواست کاربر یا Cross-Site Request Forgery (CSRF)، به جعل درخواست های دارای احراز هویت یا احراز هویت نشده کاربر را گویند.

در این آسیب پذیری هدف درخواست توسط مهاجم تغییر پیدا می نماید.

برای مثال مهاجم با ارسال فرم حاوی درخواست تغییر کلمه عبور مدیر اپلیکیشن، کلمه عبور مدیریت را بدون اطلاع مدیر ویرایش می نماید.

نمونه فرم آسیب پذیر:

<form method="post" action="process.php">

 <input type="text" name="username">
 <input type="password" name="password">
 <button type="submit">Login</button>

</form>

روش های جلوگیری

روش های جلوگیری در PHP

۱) ایجاد توکن تصادفی برای درخواست ها

ایجاد مقدار تصادفی در فرم:

<?php
// Generate CSRF token
$csrf_token = bin2hex(random_bytes(32));
$_SESSION['csrf_token'] = $csrf_token;
?>

<form method="post" action="process.php">
  <input type="hidden" name="csrf_token" value="<?php echo $csrf_token; ?>">
  <input type="text" name="username">
  <input type="password" name="password">
  <button type="submit">Login</button>
</form>

بررسی صحت مقدار ارسالی در سمت سرور

<?php session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

 if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
   // CSRF token mismatch
   die('Invalid CSRF token');
 }
 // Process login request
 $username = $_POST['username'];
 $password = $_POST['password'];
 // ...

}