Tôi cố gắng để ngăn chặn CSRF trong php theo cách sau:Làm thế nào để ngăn chặn yêu cầu cross-site giả mạo (CSRF) một cách hiệu quả trong PHP
Một
$_SESSION['token']
được tạo ra ở đầu mỗi trang. Tôi đã biết rằng việc sử dụng$_COOKIES
hoàn toàn sai vì chúng được gửi tự động cho mỗi yêu cầu.Trong mỗi
<form>
, đầu vào sau:<input type="hidden" name="t" value="<?php echo '$_SESSION['token']; ?>">
được nối thêm.Các
$_SESSION['token'];
được xác nhận với$_POST['t']
Bây giờ tôi có một số câu hỏi nhỏ:
- Đây có phải là một cách tốt để ngăn chặn CSRF? Nếu không xin vui lòng giải thích.
- Khi một trang khác được mở cũng đặt cùng một biến số
$_SESSION
, trang trước đó (vẫn mở) trở nên không hợp lệ, cách ngăn chặn điều này? - Đối với các hình thức, phương pháp này rõ ràng, nhưng cách xử lý các liên kết thông thường? Có cần thiết phải gắn thêm mã thông báo cho mỗi liên kết không?
Cảm ơn bạn rất nhiều trước.
Có nhiều cách để bạn có thể củng cố thêm điều này (ví dụ:gắn mã thông báo vào các biểu mẫu riêng lẻ để chúng không thể được sử dụng lại trong một ngữ cảnh khác, đó là thư viện [anti-csrf] (https://github.com/paragonie/anti-csrf) của chúng tôi. Nhưng những gì bạn mô tả là những gì hầu hết mọi người làm. –
Cảm ơn bạn @ScottArciszewski về liên kết và gợi ý, tôi muốn giữ mọi thứ trong tay mình thay vì dựa vào thư viện của bên thứ ba cho việc này nhưng đó là một ý tưởng rất hay để thậm chí hạn chế hơn nữa. –