2009-08-30 25 views
7

Tôi muốn tạo hệ thống đăng nhập bằng cookie/phiên nhưng tôi không chắc chắn về tính bảo mật và mức độ tương tự như vậy với chúng.Cookie và phiên làm việc của hệ thống đăng nhập (PHP)

Với phiên, nếu "đăng nhập" được đặt thành "có", tôi có thể tin tưởng điều đó không? Người dùng có thể thay đổi những gì nó trả về không? Tôi có nên lưu trữ mật khẩu được mã hóa và kiểm tra trên mỗi trang không?

Với cookie, tôi có phải kiểm tra những thứ như tiêm mysql không?

Điều này nghe có vẻ như nội dung mới bắt đầu, nhưng nó thực sự hữu ích nếu ai đó có thể làm rõ điều đó cho tôi. Cảm ơn trước cho bất kỳ trả lời!

Trả lời

7

Nếu bạn đặt biến phiên, người dùng không thể trực tiếp thay đổi trừ khi họ chiếm đoạt một cookie phiên khác.

Điều bạn chủ yếu phải xem là lưu trữ được chia sẻ, dữ liệu phiên của bạn không an toàn (thông thường các trang web khác có thể xem).

Điều đáng lưu ý là dữ liệu cookie cũng không an toàn. Nó không nên dựa vào cùng một cách mà dữ liệu biểu mẫu không nên dựa vào (bất kể xác thực khách hàng cho bạn biết).

thực hành tốt nhất của bạn với mật khẩu là:

  1. Store mật khẩu trong cơ sở dữ liệu ở dạng băm, tốt SHA1 (lựa chọn đầu tiên) hoặc MD5 (lựa chọn thứ hai);
  2. Khi bạn nhận mật khẩu của người dùng, hãy mã hóa mật khẩu và kiểm tra mật khẩu đó với những gì được lưu trữ trong cơ sở dữ liệu;
  3. Đặt tên người dùng đã đăng nhập trong phiên người dùng;
  4. Hết hạn cookie sau một khoảng thời gian (ngay cả khi ngày của nó) thay vì kéo dài mãi mãi; và
  5. Sử dụng kết nối an toàn (HTTPS không HTTP) nếu có thể. Chứng chỉ SSL có giá rẻ.
+0

Điều này có nghĩa rằng tôi nên kiểm tra người dùng đăng nhập và mật khẩu trên mỗi trang nạp? Và cách tốt nhất để giữ cho cơ sở dữ liệu mật khẩu và phương thức mã hóa an toàn như thế nào? –

+1

@Grue không chỉ khi họ đăng nhập mà bạn cần một chính sách mất hiệu lực hợp lý. Các địa chỉ IP khác nhau, khoảng thời gian, thời gian không hoạt động, v.v. Dù có ý nghĩa gì đối với những gì bạn đang bảo vệ (ví dụ: một trang web ngân hàng có những cân nhắc bảo mật khác nhau, bạn chỉ để lại nhận xét về video). – cletus

+3

Một số nội dung khá lỗi thời trong câu trả lời này. Không sử dụng SHA1 hoặc MD5 cho mật khẩu: http://stackoverflow.com/questions/1581610/how-can-i-store-my-users-passwords-safely –

3

Quy tắc chung: không tin vào đầu vào của người dùng. Cookie là đầu vào của người dùng, id phiên được lưu trữ trong cookie là đầu vào của người dùng, tiêu đề http là đầu vào của người dùng - những thứ này phải được kiểm tra ba lần cho mọi thứ có thể. Mặt khác, dữ liệu phiên được lưu trữ trên máy chủ của bạn, do đó, nó ít nhiều an toàn nếu không được lưu trữ trong/tmp.

Một trong những thiết lập phổ biến nhất cho ủy quyền phiên là: id phiên được lưu trữ trong cookie và mọi thứ khác bao gồm cả mật khẩu được lưu trữ trong phiên. Sau khi bắt đầu phiên dựa trên id từ cookie, bạn sẽ nhận được id người dùng từ dữ liệu phiên và sau đó kiểm tra xem mật khẩu được lưu trữ vẫn còn hợp lệ hay không.

0

Bất kỳ và tất cả người dùng nhập vào cần phải được xem xét kỹ lưỡng và vệ sinh tôn giáo, có thể là GET và POST dữ liệu, dữ liệu cookie ..

Để trả lời câu hỏi của bạn nếu lưu trữ trạng thái đăng nhập trong một var phiên là an toàn, câu trả lời là có. Chỉ cần nhớ vệ sinh mọi thứ mà người dùng gửi cho bạn, bất kể nó an toàn đến mức nào.

5

Như nhiều người ở đây đã tuyên bố, không tin tưởng vào đầu vào của người dùng - bao giờ hết. Bằng cách làm vệ sinh đầu vào của bạn, đặc biệt là tên người dùng & các trường mật khẩu bạn giúp ngăn chặn các cuộc tấn công SQL Injection.

Đối với tất cả những điều tốt là & thánh không lưu trữ tên người dùng hoặc mật khẩu trong cookie, chúng được gửi lại & cho máy chủ theo mọi yêu cầu và bất kỳ ai xem luồng có thể lấy dữ liệu đó ... gặp rắc rối lớn.

Dưới đây là một vài bài viết bạn nên đọc trên phiên, bảo mật và băm - chỉ cần băm mật khẩu của bạn để SHA1 hoặc MD5 là không đủ, muối chúng để chúng thậm chí còn mạnh mẽ hơn. Không có thứ gì như an ninh không thể xuyên thủng - ngay cả khi bạn làm mọi thứ đúng, ai đó có thể phá vỡ nó - điều đó là không thể tránh khỏi. Công việc của bạn là làm cho mọi thứ trở nên khó khăn để phá vỡ/khai thác càng tốt.

Càng có nhiều công việc liên quan đến việc đột nhập vào trang web của bạn, nội dung của bạn càng đáng để có giá trị nỗ lực. Công việc của bạn là ngăn cản người dùng độc hại.

Bài viết này có một số thông tin tốt về việc tạo ra dấu vân tay độc đáo cho khách truy cập, giúp để làm cho phiên tặc khó khăn hơn - PHP Security Guide: Sessions

giao dịch Bài viết này với mật khẩu cơ bản băm & kỹ thuật ướp muối - Password Hashing

này là do không có nghĩa là kết thúc tất cả & là tất cả - bạn có thể tạo sự nghiệp làm bảo mật và tương tự, nhưng chúng là điểm khởi đầu tốt. Một người nào đó ở đây có thể có thể trỏ đến các bài viết tốt hơn/nâng cao hơn, nhưng cá nhân tôi thấy những điều này hữu ích trong việc lưu trữ mã của tôi.

2

Cách thực hành tốt để sử dụng là có 3 biến được lưu trữ. Một cho nếu họ đăng nhập, một cho tên người dùng của họ và một cho một băm được tạo ngẫu nhiên (được tạo ra khi họ đăng nhập và lưu trữ trong cơ sở dữ liệu cùng với thông tin người dùng khác). Bằng cách này, nếu họ thay đổi tên người dùng của họ có thể được lưu trữ trong cookie, tên người dùng đó sẽ không khớp với tên người dùng được tạo cho người dùng đó khi họ đăng nhập.

Ví dụ: Dữ liệu cookie có thể là: logged_in = true; người dùng = 'quản trị'; sessionid = [id được tạo ngẫu nhiên (tôi thường chỉ md5 một từ được tạo ngẫu nhiên mà tôi tạo)]

Mỗi lần đăng nhập, một sessionid mới được tạo và lưu trữ trong cơ sở dữ liệu trong trường riêng của nó. Bây giờ nếu tôi đã thay đổi thông tin cookie của mình và thay đổi biến người dùng để nói 'người dùng' (đó sẽ là một người dùng khác mà họ có thể đang cố gắng hi-jack). Sessionid sẽ không còn khớp với phiên cho người dùng thứ hai và thông tin đăng nhập sẽ bị từ chối.

Dưới đây là một ví dụ nhanh tôi đã đánh cắp từ một dự án CI tôi đã làm việc trên một vài tuần trước:

function logged(){ 
$logged_in = $this->session->userdata('logged_in'); 
if($logged_in){ 
    $userid = $this->session->userdata('userid'); 
    $sessionhash = $this->session->userdata('hash'); 

    $this->db->where('id', $userid); 
    $this->db->where('hash', $sessionhash); 
    $query = $this->db->get('members'); 

    if($query->num_rows == 1){ 
    return TRUE; 
    }else{ 
    return FALSE; 
    } 
} 
} 
Các vấn đề liên quan