2009-05-12 17 views
5

Tôi nghĩ rằng tôi tạo một mã hủy kích hoạt đặt trong liên kết hủy đăng ký cùng với id người dùng của họ. Sau đó, khi một người nhận bản tin của tôi nhấp vào liên kết, tôi có thể tra cứu id người dùng của họ và xem mã hủy kích hoạt có khớp không.Cách tốt nhất để triển khai liên kết hủy đăng ký nhận bản tin của bạn là gì?

Âm thanh này có phải là cách tốt nhất không?

Một số cách khác là gì?

Trả lời

8

Bạn chỉ có thể sử dụng thuật toán băm để bảo mật userID (để không ai có thể hủy đăng ký tất cả DB của bạn bằng vòng lặp khó chịu).

Bạn sẽ kết thúc với hai thông số: userID và băm.

Lợi thế là bạn sẽ không cần phải lưu trữ bất kỳ ánh xạ nào giữa mã hủy kích hoạt và ID người dùng.

+0

Hãy để tôi nhận được điều này ... thông số userID trong trường hợp này sẽ được băm với thông số băm. Vì vậy, các params là userID và hash, và sau đó hash (hashedUserID, hash) = userID .... đúng không? – Tony

+1

Tôi nghĩ anh ấy có nghĩa là url =/unsub? UserID = x & hash = $ hash (x + secret), nơi bí mật là thứ bạn không tiết lộ. –

+0

Sau đó, tôi phải giữ bí mật trong cơ sở dữ liệu mà về cơ bản sẽ là mã hủy kích hoạt. Vậy lợi thế là gì? – Tony

4

Từ góc độ người dùng, không yêu cầu người dùng nhập địa chỉ email để hủy đăng ký. Cách tiếp cận có tất cả thông tin được nhúng trong liên kết (như bạn mô tả) là tốt hơn nhiều.

6

Từ góc độ người dùng cuối, việc hủy đăng ký một lần nhấp là tuyệt vời.

Tuy nhiên, việc sử dụng hàm băm (id + secret) không an toàn vì kẻ tấn công thông minh có thể nhanh chóng "bạo lực", sau đó tiến hành hủy đăng ký mọi người dùng trong DB của bạn chỉ bằng cách tăng ID.

Sẽ an toàn hơn nhiều nếu giữ ID "bán bí mật" trên máy chủ và sử dụng địa chỉ email để tra cứu người dùng khi hủy đăng ký. Bằng cách này, việc hủy đăng ký thành công yêu cầu ghép nối địa chỉ email với ID chính xác. Bạn có thể làm điều này an toàn hơn bằng cách lưu khóa bí mật thực sự cho mỗi người dùng và sử dụng khóa đó thay vì ID. Điều này đặc biệt cần thiết nếu cặp email + ID được xuất bản.

Vì vậy, ví dụ, liên kết ngừng đăng ký của bạn sẽ trông như thế này:

http://mydomain.com/unsubscribe?email={$email}&hash={$hash} 

Và một chức năng phía máy chủ để tạo ra $ băm sẽ trông như thế này trong PHP:

<?php 
function unsubscribeHash($id, $email) { 
    $hashSecret = 'Fz!Fx~36N66>io3B-vlPDshdRxos8JjCd4+Ld-s2^ca{19Q/5u'; 
    return sha1($id . $email . $hashSecret); 
} 
?> 

Sau đó, để hoàn thành việc hủy đăng ký, bạn sẽ tra cứu người dùng bằng email và xác minh

$_GET['hash'] == unsubscribeHash($user_id, $_GET['email'])