Tại sao và khi nào tôi nên sử dụng session_regenerate_id()
hàm trong php? Tôi có nên luôn sử dụng nó sau khi tôi sử dụng session_start()
? Tôi đã đọc rằng tôi phải sử dụng nó để ngăn chặn việc cố định phiên, đây có phải là lý do duy nhất?
Tại sao và khi nào tôi nên sử dụng session_regenerate_id()
hàm trong php? Tôi có nên luôn sử dụng nó sau khi tôi sử dụng session_start()
? Tôi đã đọc rằng tôi phải sử dụng nó để ngăn chặn việc cố định phiên, đây có phải là lý do duy nhất?
Câu trả lời:
session_regenerate_id()
gì?Như tên hàm đã nói, nó là một hàm sẽ thay thế ID phiên hiện tại bằng một ID mới và giữ thông tin về phiên hiện tại.
Nó chủ yếu giúp ngăn chặn các cuộc tấn công cố định phiên. Các cuộc tấn công cố định phiên là nơi người dùng độc hại cố gắng khai thác lỗ hổng trong hệ thống để sửa (đặt) ID phiên (SID) của người dùng khác. Bằng cách đó, họ sẽ có quyền truy cập hoàn toàn với tư cách là người dùng ban đầu và có thể thực hiện các tác vụ yêu cầu xác thực.
Để ngăn chặn các cuộc tấn công như vậy, hãy gán cho người dùng một ID phiên mới session_regenerate_id()
khi anh ta đăng nhập thành công (hoặc cho mọi yêu cầu X). Giờ đây, chỉ anh ấy có ID phiên và ID phiên cũ (đã cố định) của bạn không còn hợp lệ.
session_regenerate_id()
?Như symbecean chỉ ra trong các nhận xét bên dưới, id phiên phải được thay đổi ở bất kỳ quá trình chuyển đổi nào trong trạng thái xác thực và chỉ khi chuyển đổi xác thực.
Đọc thêm:
Bạn nên sử dụng session_regenerate_id()
để ngăn chặn việc chiếm quyền điều khiển phiên và cố định phiên .
Từ câu trả lời Security.SE này :
Đánh cắp phiên đề cập đến việc đánh cắp cookie phiên. Điều này có thể dễ dàng thực hiện nhất khi chia sẻ mạng cục bộ với các máy tính khác. Ví dụ: tại Starbucks. Ví dụ ... một người dùng có phiên Y đang duyệt trang web của James tại Starbucks. Tôi đang lắng nghe lưu lượng truy cập mạng của họ, nhấm nháp ly cà phê của mình. Tôi đưa người dùng với cookie của phiên Y cho trang web của James và thiết lập trình duyệt của tôi để sử dụng chúng. Bây giờ khi tôi truy cập trang của James, trang của James.
Từ trang web này :
Cố định phiên là một kỹ thuật tấn công buộc ID phiên của người dùng đến một giá trị rõ ràng. Tùy thuộc vào chức năng của trang web mục tiêu, một số kỹ thuật có thể được sử dụng để "sửa chữa" giá trị ID phiên. Các kỹ thuật này bao gồm từ khai thác Cross-site Scripting đến peppering trang web với các yêu cầu HTTP đã thực hiện trước đó. Sau khi ID phiên của người dùng đã được sửa, kẻ tấn công sẽ đợi người dùng đó đăng nhập. Khi người dùng làm như vậy, kẻ tấn công sử dụng giá trị ID phiên được xác định trước để giả định danh tính trực tuyến giống nhau.
Khi nào sử dụng
Khi người dùng đang chỉnh sửa / cập nhật một số đầu vào quan trọng (thay đổi mật khẩu, thông tin đăng nhập, quên mật khẩu, v.v.) có thể ảnh hưởng đến bảo mật trang web hoặc chính sách quyền riêng tư.
Xem thêm:
Tôi nghĩ rằng vấn đề ngộ độc phiên đã được đề cập khá tốt.
Để trả lời câu hỏi "Khi nào tôi nên sử dụng cái này?" , điều quan trọng là phải lùi lại và xem xét ứng dụng của bạn đang làm gì với phiên. Hay nói một cách khác, đây là câu hỏi bảo mật quan trọng bạn cần trả lời
Nếu ai đó nắm giữ phiên này, họ sẽ thu được gì?
Nếu tất cả những gì bạn làm là theo dõi dữ liệu ẩn danh (người dùng truy cập trang web và bạn sử dụng nó để theo dõi lượt truy cập của họ) thì có rất ít lý do để tạo lại một phiên. Một kẻ không tặc sẽ không thu được bất kỳ thứ gì có giá trị bằng cách lấy phiên đó.
Tuy nhiên, rất nhiều trang web cung cấp thông tin đăng nhập. Một đăng nhập thay đổi rất nhiều thứ. Tôi có thể truy cập hồ sơ của mình. Tôi có thể thay đổi cài đặt. Vì vậy, một kẻ không tặc có thể muốn quyền truy cập tài khoản của tôi, đặc biệt nếu người dùng bình thường và quản trị viên đều sử dụng phiên để quản lý đăng nhập. Vì vậy, khi mọi người truy cập trang web của tôi và đăng nhập, tôi sẽ tạo lại phiên. Nó bổ sung thêm một lớp bảo mật mà người dùng mới đăng nhập của tôi ít có khả năng bị tấn công hơn.
Bất cứ khi nào chúng tôi thêm dữ liệu quan trọng vào một phiên, bạn nên xem xét việc tạo lại ID phiên. Nếu bạn cần làm cứng ứng dụng của mình chống lại sự cố định thì việc tái tạo ngẫu nhiên có thể hữu ích nhưng tôi KHÔNG BAO GIỜ tái tạo theo mọi yêu cầu. Theo mặc định, PHP lưu trữ các phiên trong các tệp trên đĩa cục bộ. Bạn đang thêm rất nhiều I / O đĩa để giảm thiểu một vectơ tấn công tương đối nhỏ. Nếu bạn thực sự cần thêm bảo mật, tôi sẽ ủng hộ việc sử dụng HTTPS đầy đủ thay vì tái tạo một cách thường xuyên (HTTPS khiến việc khắc phục rất khó thực hiện).
session_regenerate_id
?Bạn nên sử dụng nó để ngăn chặn việc cố định phiên .
session_regenerate_id
?Bất cứ khi nào trạng thái xác thực thay đổi, đó chủ yếu là đăng nhập và đăng xuất.
Bob ngồi tại một máy tính công cộng và bằng cách duyệt qua stackoverflow.com, anh ấy sẽ mở một phiên mới ở đó. ID phiên được lưu trong cookie (có httpOnly
gắn cờ để ngăn truy cập thông qua javascript). Hãy tưởng tượng Stack Overflow có HTTPS luôn được bật và cũng là secure
cờ được đặt cho cookie.
Làm thế nào chúng ta có thể đánh cắp phiên làm việc bây giờ?
Bob ghi lại ID phiên. Anh ta rời khỏi máy tính mà không đóng trình duyệt. Bây giờ Alice đến máy tính này và thấy Stack Overflow đã được tải. Cô ấy đăng nhập ngay bây giờ.
Bây giờ chúng tôi đang ở giai đoạn mà bạn nên sử dụng session_regenerate_id
. Nếu bạn không tạo ID phiên mới tại đây trong khi đăng nhập, Bob có thể sử dụng phiên trước mà anh ấy đã viết ra để truy cập phiên của Alice và sẽ được đăng nhập với tư cách Alice ngay bây giờ.
session_regenerate_id()
phát hành, Alice có thể truy cập vào tài khoản bobs? Có đúng không?
Bạn có thể sử dụng nó để bảo mật tốt hơn.
Với cách này, bạn đang tạo id phiên để sử dụng một lần.
Giả sử id phiên người dùng của bạn là = 3
Một số hacker đã tấn công khách hàng của bạn và lấy được session_id của họ. Vì vậy, hacker có thể sử dụng cookie đó để sử dụng phiên của họ.
Nếu bạn có mã như
session_start();
session_regenerate_id();
bạn có thể thay đổi phiên của họ mỗi khi họ sử dụng trang web của bạn.
Bây giờ hacker nhận được sessionid = 3
nhưng bạn đã thay đổi phiên sau khi anh ấy sử dụng phiên đó nên
người dùng có sessionid = 4 // auth
hacker có session = 3 // null
Nhưng có một điểm nhỏ cho phép nói rằng bạn đang sử dụng phương pháp tái tạo và khách hàng của bạn chỉ cần đăng nhập vào trang web và đóng trình duyệt hoặc không hoạt động. Khách hàng của bạn có sessionid = 4 và nếu hacker lấy được cookie ở phần đó, họ sẽ có cùng sessionid.
Như đã giải thích ở trên theo cách này, bạn có thể bảo vệ máy khách của mình khỏi bị đánh cắp dữ liệu theo một cách, nhưng cách này vẫn không khắc phục được vấn đề này.
Nhưng nó sẽ an toàn hơn rất nhiều nếu bạn sử dụng mã hóa SSL.
Xin lỗi về tiếng Anh kém.
Một trường hợp sử dụng đơn giản:
// User visits a webshop
$shopcart = new Cart();
Một phiên được bắt đầu và một mục nhập được tạo trong cơ sở dữ liệu. Shopcart của người dùng được xác định bằng id phiên của anh ta.
// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);
Đối với mỗi sản phẩm được thêm vào, một bản ghi sẽ được lập trong bảng shopcart của tôi. Cũng được xác định bởi id phiên.
// User saves cart in order to use it later
$shopcart->save();
Người dùng đã quyết định lưu giỏ hàng của mình. Nó hiện đang được đính kèm với id người dùng của anh ấy.
// Regenerate session id for user to be able to make a new cart
session_regenerate_id();
Id sesssion được tạo lại và người dùng bây giờ có thể bắt đầu tạo lại một shopcart khác.