Khi nào và tại sao tôi nên sử dụng session_regenerate_id ()?


95

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?


bởi vì sau khi phiên bắt đầu, được tạo và trên trang khác khi bạn bắt đầu phiên, các biến có mặt: -
HaRsH

@HaRsH Oo? Session_regenerate_id xóa ID phiên cũ và tạo ID phiên mới để tránh chiếm quyền điều khiển phiên với XSS. Nó không có bất kỳ ảnh hưởng nào đến khả năng hiển thị của các biến SESSION trong các tài liệu khác.
Xatenev

vâng tôi biết rằng tôi không có ảnh hưởng đến biến khác, nhưng nếu bạn không bắt đầu phiên giao dịch ngày có trang biến không có mặt trên trang đó trong php lõi
khắc nghiệt

1
Nhưng đây là về session_regenerate_id, không phải về session_start ...
Xatenev

1
Tôi khuyên bạn nên đọc RFC nơi nó được đề xuất: wiki.php.net/rfc/precise_session_management
jankal

Câu trả lời:


96

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ó làm gì?

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ệ.

Khi nào tôi nên sử dụng 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:


2
Và điều gì sẽ xảy ra nếu hacker thực hiện cuộc gọi thứ 20? Session ID được thay đổi và ông là người duy nhất sở hữu phiên;))
fred727

@ fred727 Nếu hacker may mắn thực hiện được cuộc gọi thứ 20, thì người dùng sẽ có một id không hợp lệ và không được xác thực nữa. Không có sự tái tạo nào cả hacker và người dùng sẽ được xác thực.
Bradmage

nó cũng có thể hữu ích khi gọi session_regenerate_id khi lưu trữ thông tin nhạy cảm trong các phiên (vì vậy không chỉ ở các lần xác thực)
Adam

Có thể sửa phiên nếu thông tin phiên không có trong cookie không? Tôi đang lưu trữ thông tin phiên trong các tệp trong máy chủ của mình, có cần thiết để tạo lại id không?
Gonzalo

"để sửa (đặt) ID phiên (SID) của người dùng khác" .... điều này phải được thay thế bằng "để sửa (đặt) ID phiên (SID) trên máy tính của người dùng khác, sau đó sử dụng nó sau khi anh ta xác thực nó "
Kế toán م

24

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êncố đị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:

Hướng dẫn bảo mật PHP: Phiên

Cố định phiên (Đọc tốt)


22

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).


2
HTTPS không thay đổi bất kỳ điều gì về định hình.
kelunik

4
Nhưng nó làm cho các cuộc tấn công đánh hơi khó khăn hơn, có thể được sử dụng để lấy id phiên ngay từ đầu.
devilkoryu

ứng dụng php của tôi đăng xuất trong vòng vài giây, đang sử dụng tính năng tái tạo, có giới hạn tệp phiên có thể được thực hiện hay có giới hạn về id được tạo lại có thể gây ra đăng xuất không?
sqlchild 19/07/18

Không phải nói chung, không. Bạn có thể muốn đăng một câu hỏi riêng về nó
Machavity

16

Tại sao tôi nên sử dụng session_regenerate_id?

Bạn nên sử dụng nó để ngăn chặn việc cố định phiên .

Khi nào tôi nên sử dụng 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.

Thí dụ

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ó httpOnlygắ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à securecờ đượ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ờ.


Nhưng cho đến khi session_regenerate_id()phát hành, Alice có thể truy cập vào tài khoản bobs? Có đúng không?
Akam

2
@akam - Đã muộn, nhưng đáng để phản hồi ... 1. Bob không đăng xuất, Alice có thể sử dụng thông tin đăng nhập của anh ấy - 2. Bob đăng xuất, Alice không đăng nhập, Alice có thể sử dụng ID phiên của anh ấy, nhưng không có đăng nhập hoạt động để truy cập dữ liệu của anh ấy - 3. Bob đăng xuất, Alice đăng nhập, Bob sử dụng ID phiên, có một đăng nhập đang hoạt động, Bob truy cập dữ liệu của Alice. Nhưng cụ thể là: phụ thuộc vào bảo mật tập lệnh, một ID phiên không nhất thiết có nghĩa là bạn có thể truy cập vào dữ liệu của người dùng đã đăng xuất, nhưng nói chung là có thể xảy ra và rủi ro cao.
codekandis

15

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.


12

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.


4

session_regenerate_id (): Không thể tạo lại id phiên - phiên không hoạt động

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.