دسته بندی
Cross-Site Attacks
باگ Cross-Site Request Forgery (CSRF) یک نوع باگ امنیتی است که در برنامهها و وبسایتها رخ میدهد. در CSRF، حملهکننده با استفاده از اجرای برخی از درخواستها از طریق کاربران، عملیاتهای خطرناک را با اجازهی کاربر اجرا میکند. به عبارت دیگر، کاربر در وبسایتی وارد شده است که مخرب است و بدون اطلاع از آن، عملیاتهای خطرناک را در سایتها و برنامهها دیگر اجرا میکند.مثال:
فرض کنید یک برنامه وب وجود دارد که کاربران میتوانند با استفاده از فرمی مبلغی را به حساب خود اضافه کنند. کد
PHP به صورت زیر است:<?phpحملهکننده میتواند یک صفحه مخرب (مثلاً با نام
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$amount = $_POST['amount'];
$user_id = $_SESSION['user_id'];
// Add amount to user account
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Account Page</title>
</head>
<body>
<h1>Welcome, User!</h1>
<form action="" method="post">
<label for="amount">Amount:</label>
<input type="text" name="amount" id="amount">
<input type="submit" value="Add">
</form>
</body>
</html>
csrf.html) ایجاد کند و کد مخرب زیر را در آن قرار دهد:<html>وقتی کاربری که وارد برنامهی مخرب حملهکننده شده است، از طریق مرورگر به صفحه
<body>
<form action="http://victim-website.com" method="post">
<input type="hidden" name="amount" value="1000">
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
csrf.html میرود، این صفحه یک درخواست POST به آدرس victim-website.com ارسال میکند و مبلغ 1000 به حساب کاربر در این وبسایت اضافه میشود.روش های جلوگیری:
1- اضافه کردن یک توکن
CSRF به فرمها تا اطمینان حاصل شود که درخواستها توسط خود کاربر ارسال میشوند و نه از طریق حملهکننده.2- بررسی
Referer Header که نشان میدهد از کدام سایت درخواست ارسال شده است. اگر نشاندهنده سایت خارجی باشد، درخواست رد شود.3- اجازه دسترسی به کوکیها تنها به دامنههای مشخص داده شود.
4- فقط از متود
POST برای عملیاتهایی که تغییرهای حسابهای کاربری میآورند، استفاده کنید..