Sinh vien hoa sen


Login - Đăng Nhập
Cũ 07-04-2008, 11:58 PM   #1 (permalink)
Profile - Thông Tin Cá Nhân
123... trốn
 
Avatar của hiepgia
 
Mặc định Cross-Site Request Forgeries (CSRF) – Ném đá giấu tay

Lỗi bảo mật này thường ít được chú ý đến, nhưng thiệt hại của nó cũng không kém so với XSS. Cơ chế của lỗi này là đánh lừa người dùng thực hiện việc họ không muốn như xóa dữ liệu, tài khoản, gửi nội dung sai mục đích... Lỗi này thường được kết hợp với XSS để đánh lừa dễ dàng hơn. Ví dụ ta có một form gửi bài viết mới: post-csrf.php

<?php
if(isset($_GET['title'])) {
file_put_contents('new_post.txt', $_GET['title']."\n", FILE_APPEND);
echo 'OK';
} else {
?>
<form action="">
Title: <input type="text" name="title"/>
&nbsp;<input type="submit" value="Post">
</form>
<?php } ?>
Sau đó, chèn đoạn mã sau đây vào trang nào đó:

<img src="http://localhost/post-csrf.php?title=test" />
Khi chạy trang có chèn mã trên, nội dung sẽ được lưu trữ trong new_post.txt. Đối với ví dụ này thì không có gì nguy hiểm, nhưng nếu website có đường dẫn để xóa bài viết hay tài khoản nào đó:

<img src="http://localhost/post-csrf.php?type=post&id_delete=123" />
Nếu không bảo mật, bài viết thứ 123 sẽ bị xóa khi bất kỳ ai truy cập vào trang có đoạn mã trên. Nếu là một trang bán hàng nào đó, có URL: buy.php?item=1 thì rất có thể người dùng sẽ bị thiệt hại tài sản khi đặt hàng những thứ mà mình không có chủ ý mua. Hoặc nguy hiểm hơn, hacker có thể đánh lừa người quản trị truy cập trang có mã độc để xóa hay sửa đổi dữ liệu của website mà người quản trị không hay biết. Website sẽ chứa đầy spam nếu phần xử lý gửi bài viết của diễn đàn, trang tin chưa xử lý lỗi CSRF!!!

Cách chống CSRF
- Lỗi này một phần là do bạn đã sử dụng phương thức $_GET để thực hiện các hành động. Cách tốt nhất là hãy chuyển sang $_POST và hãy quên đi $_REQUEST. - Dùng token để xác thực hành động và nên tạo một trang xác nhận khi thực hiện hành động nào đó.


Mã:
  1. set_magic_quotes_runtime(FALSE);
  2. $token = md5(uniqid(rand(), TRUE));
  3. $_SESSION['token'] = $token;
  4. $_SESSION['token_timestamp'] = time();
  5. ?>
  6. <form action="" method="POST">
  7. <input type="hidden" name="token" value="<?=$token?>" />
  8. Item: <input type="text" name="item_id" />&nbsp;<input type="submit" value="Post">
  9. </form>
  10. <?php
  11. if(isset($_POST['item_id']) && !empty($_POST['item_id'])) {
  12. if (isset($_POST['token']) && isset($_SESSION['token']) && $_POST['token'] == $_SESSION['token'])
  13. {
  14. $token_limit = time() - $_SESSION['token_timestamp'];
  15. if ($token_limit <= 300) {
  16. // Quá hạn thời gian
  17. } else {
  18. // Hành động hợp lệ
  19. }
  20. }
  21. }
Đoạn mã trên tạo một token và lưu nó vào trong Session tại thời điểm người dùng duyệt trang này, như vậy sẽ không thể thực hiện hành động lúc nào cũng được.
Tạo trang xác nhận: Bạn hãy để ý trang Yahoo 360, khi xóa blog nào đó, bạn sẽ bấm vào liên kết GET, lúc đó mới chuyển qua trang xác nhận và hành động xóa được thực hiện bằng POST, cách này khá an toàn và thân thiện.

Chữ Ký Của Webmaster hiepgia Thanks nếu bạn thấy hay ^^!
I'm Pinky's Husband ^^!
Quy định về chữ ký: http://www.sinhvienhoasen.com/forum/...ad.php?t=13396. Đề nghị các Admin, Smod thực hiện...
hiepgia đang ẩn  
Lần đọc: 369
Trả lời với trích dẫn
Cũ 08-04-2008, 12:04 AM   #2 (permalink)
Profile - Thông Tin Cá Nhân
123... trốn
 
Avatar của hiepgia
 
Mặc định

Đoạn mã trên tạo một token và lưu nó vào trong Session tại thời điểm người dùng duyệt trang này, như vậy sẽ không thể thực hiện hành động lúc nào cũng được.
Tạo trang xác nhận: Bạn hãy để ý trang Yahoo 360, khi xóa blog nào đó, bạn sẽ bấm vào liên kết GET, lúc đó mới chuyển qua trang xác nhận và hành động xóa được thực hiện bằng POST, cách này khá an toàn và thân thiện.
Mã:
<input type="hidden" name="item_id" value="<?=$_GET['delete_id']?>" />
Tạo tên trang ngẫu nhiên theo thủ thuật nào đó mà bạn nghĩ ra, có thể là thời gian lúc xem trang, tên của tài khoản được cộng trừ, cắt ghép sao cho không thể đoán ra. Mỗi liên kết thực hiện hành động là mỗi liên kết khác nhau tại các thời điểm và hacker khó mà sử dụng liên kết đó để lừa người dùng. http://localhost/post-csrf.php?type=...cure=kHfgyjshH
Ngoài ra còn có một kỹ thuật Iframe Post bằng cách dùng iframe để qua mặt cách dùng POST khi thực hiện hành động. Vì vậy, để an toàn hơn nữa, nên lọc các thẻ iframe có trong trang! Cũng có thể khắc phục phần nào bằng cách đặt đoạn javascript chuyển trang mở trong iframe sau vào trang xác nhận hành động, nó sẽ chuyển về trang chủ nếu trang được mở trong một iframe:

Mã:
  1. if(top != self) {
  2. top.location.href = 'http://domain_name.com/action_demo.php';
  3. }
Để an chắc chắn hơn nữa, bạn có thể kết hợp thêm Captcha (Completely Automated Public Turing test to tell Computers and Humans Apart - en.wikipedia.org/wiki/Captcha, captchas.net) tại trang xác nhận hành động.

Chữ Ký Của Webmaster hiepgia Thanks nếu bạn thấy hay ^^!
I'm Pinky's Husband ^^!
Quy định về chữ ký: http://www.sinhvienhoasen.com/forum/...ad.php?t=13396. Đề nghị các Admin, Smod thực hiện...
hiepgia đang ẩn  
Lần đọc: 369
Trả lời với trích dẫn
Trả lời

Công cụ bài viết
Kiểu hiển thị

Quyền viết bài
Bạn không thể gửi chủ đề mới
Bạn không thể gửi trả lời
Bạn không thể gửi file đính kèm
Bạn không thể sửa bài viết của mình

BB code đang Mở
Mặt cười đang Mở
[IMG] đang Mở
HTML đang Tắt
Trackbacks are Mở
Pingbacks are Mở
Refbacks are Mở


Address: Hoa Sen University, Ho Chi Minh City, Viet Nam.
Designed by hiepgia.
Best Viewed in 1024x768 with IE6+, Firefox 1.5+, Chrome, Opera 9+.
Truy cập vào Website, nghĩa là bạn đã chấp nhận Quy Định của Forum!
RSS RSS 2.0 XML MAP

Valid XHTML 1.0 Transitional Valid CSS!
vBulletin v3.8.4 Licensed & Copyright © 2008 - 2009, Hoa Sen University.