Hướng dẫn php session management best practices - các phương pháp hay nhất về quản lý phiên php

Thay đổi ngôn ngữ:

Gửi báo cáo yêu cầu kéo một lỗi

Mục lục

  • Cơ bản quản lý phiên
  • Đảm bảo phiên bản INI

Liên kết bên ngoài: »& nbsp; sửa lỗi phiên

Quản lý phiên HTTP thể hiện cốt lõi của bảo mật web. Tất cả các biện pháp giảm thiểu có thể nên được áp dụng để đảm bảo các phiên được bảo đảm. Các nhà phát triển cũng nên kích hoạt/sử dụng các biện pháp bảo mật áp dụng.

+ Thêm một ghi chú

Người dùng đóng góp ghi chú

Không có người dùng đóng góp ghi chú cho trang này.

Cập nhật bảo mật: Tính đến 2017-10-23: Lời khuyên trong câu trả lời này, trong khi có ý nghĩa lịch sử, là hoàn toàn không an toàn. Người ta không bao giờ nên sử dụng MD5 trong việc băm mật khẩu vì nó rất dễ bị ép buộc. Xem câu trả lời này về cách sử dụng API Password_* tích hợp để băm và xác minh mật khẩu.: as of 2017-10-23: The advice in this answer, while of historical significance, is completely insecure. One should never use md5 in hashing a password because it is so easily brute forced. See this answer about how to use the built-in password_* api to hash and verify passwords.


Tôi đã xử lý các hệ thống đăng nhập/xác thực trước đó và tôi tìm thấy một số thiếu sót trong phương pháp này:

  • Bạn "MD5 mật khẩu của anh ấy và kiểm tra cơ sở dữ liệu" - điều này có nghĩa là nếu một người có quyền truy cập vào cơ sở dữ liệu, anh ta có thể tìm ra ai có cùng mật khẩu!

Phụ lục (19 tháng 9 năm 2015) * Nhìn vào liên kết này. Nó giải thích tất cả những điều cơ bản, các phương pháp bạn có thể thực hiện, tại sao bạn nên thực hiện các phương pháp đó và cũng cung cấp cho bạn mã PHP mẫu. Nếu quá dài để đọc, chỉ cần đi đến cuối, lấy mã và được thiết lập! Look at this link. It explains all the basics, the approaches you could take, why you should take those approaches and also gives you sample PHP code. If it's too long to read, just go to the end, grab the code and get set!

Cách tiếp cận tốt hơn: Để lưu trữ MD5 của username+password+email+salt trong cơ sở dữ liệu, muối là ngẫu nhiên và được lưu trữ cùng với hồ sơ của người dùng.: to store md5 of username+password+email+salt in the database, salt being random, and stored together with the user's record.

  • Sử dụng 'UID' trực tiếp trong các biến phiên có thể rất rủi ro. Hãy xem xét điều này: Bạn tôi đã đăng nhập từ trình duyệt của tôi và anh ấy rời đi để rò rỉ. Tôi nhanh chóng kiểm tra cookie nào được đặt trong trình duyệt của anh ấy và giải mã 'uid' của anh ấy. Bây giờ tôi sở hữu anh ta!

Cách tiếp cận tốt hơn: Để tạo ra một phiên ngẫu nhiên khi người dùng đăng nhập thành công và lưu trữ ID phiên đó trong mảng $_SESSION[]. Bạn cũng sẽ cần liên kết SessionID với UID của anh ấy (sử dụng cơ sở dữ liệu hoặc memcached). Ưu điểm là:: to generate a random sessionid when the user logs in successfully, and store that session ID in the $_SESSION[] array. You will also need to associate the sessionid with his uid (using the database, or memcached). Advantages are:

  1. Bạn thậm chí có thể liên kết một sessionID với một IP cụ thể để không thể bị lạm dụng sessionID ngay cả khi nó bị bắt
  2. Bạn có thể vô hiệu hóa một sessionID cũ hơn nếu người dùng đăng nhập từ một vị trí khác. Vì vậy, nếu bạn tôi đăng nhập từ máy tính của chính mình, sessionid trên máy tính của tôi sẽ tự động trở nên không hợp lệ.

Chỉnh sửa: Tôi đã luôn sử dụng cookie theo cách thủ công cho công cụ xử lý phiên của mình. Điều này giúp tôi tích hợp các thành phần JavaScript của các ứng dụng web của tôi dễ dàng hơn. Bạn có thể cần giống nhau trong các ứng dụng của bạn, trong tương lai.

Hướng dẫn php session management best practices - các phương pháp hay nhất về quản lý phiên php

Giao thức chuyển siêu văn bản bắt đầu như một giao thức không trạng thái. Điều này có nghĩa là mọi yêu cầu đối với máy chủ đều khép kín, nó mang tất cả bối cảnh mà máy chủ cần phục vụ trang web được yêu cầu. Mỗi thông báo mà máy khách gửi đến máy chủ đều có thể được tự xử lý - máy chủ không duy trì trạng thái, cũng như thông tin về kết nối.

Các ứng dụng web cần một cách để duy trì bối cảnh về khách truy cập-từ danh tính người dùng đã đăng nhập, giỏ hàng trong các cửa hàng thương mại điện tử, đến dữ liệu lâu dài như lịch sử mua hàng hoặc lịch sử trò chuyện trong các ứng dụng mạng xã hội.

Đây là lý do tại sao nó cần thiết cho HTTP và tất cả các ứng dụng được xây dựng trên đỉnh của nó, để tìm các giải pháp để quản lý tính không quốc tịch vốn có này trong HTTP. Giải pháp chính là cookie.

PHP có thể là ngôn ngữ lập trình được sử dụng nhiều nhất cho web (W3Tech cung cấp cho nó gần 80%) và nó có giải pháp riêng cho các phiên này - PHP. Trong bài viết này, chúng tôi sẽ mô tả các cơ chế phiên PHP, chúng tôi sẽ khám phá bảo mật phiên PHP và cách bảo mật cookie phiên PHP.

Chúng ta sẽ thấy những lỗ hổng tiềm năng là gì và thực tiễn bảo mật phiên PHP là gì.

HTTP và trạng thái

HTTP đã được mở rộng thông qua các tiêu đề của nó từ những ngày đầu. Điều này có nghĩa là chức năng có thể được thêm vào các yêu cầu và phản hồi HTTP thông qua các tiêu đề có thể xác định được người dùng.

Tiêu đề là các trường trong mọi yêu cầu và phản hồi có thể chứa các phần siêu dữ liệu khác nhau.

Cookies đã được công bố như là một bổ sung cho tiêu chuẩn HTTP của IETF vào năm 1997, và đặc điểm kỹ thuật đã được nâng cao kể từ đó cuối cùng được xác định trong RFC 6265, có tiêu đề Cơ chế quản lý trạng thái HTTP.

Cookie được định nghĩa bởi IETF là một cơ chế bao gồm các trường tiêu đề HTTP có thể được sử dụng bởi các máy chủ để lưu trữ các phần dữ liệu (trạng thái) trong các máy khách HTTP. Điều này giúp máy chủ có thể giữ một bối cảnh trạng thái, được gọi là phiên, trên nhiều yêu cầu HTTP.

Trình duyệt của người dùng (máy khách) sau đó gửi lại các cookie này đến máy chủ theo các yêu cầu tiếp theo, giúp máy chủ có thể xây dựng lại các trạng thái, chẳng hạn như hành trình của người mua, giỏ hàng hoặc tài khoản truyền thông xã hội.

Chúng ta có thể phân biệt giữa cookie phiên và cookie dai dẳng. Cookie phiên là thoáng qua - chúng chỉ kéo dài trong suốt thời gian của phiên trình duyệt cụ thể đó. Họ sống trong bộ nhớ trình duyệt. Bởi vì chúng hết hạn khi phiên bản trình duyệt hiện tại bị tắt, họ không có ngày hết hạn.

Cookie dai dẳng có ngày hết hạn, chúng có nghĩa là kéo dài trong một khoảng thời gian cụ thể.

Chúng được sử dụng cho những thứ như cá nhân hóa trải nghiệm người dùng, quản lý phiên - bao gồm người dùng đã đăng nhập / đăng xuất trạng thái, xe đẩy và để theo dõi hành vi của người dùng.

Cookie thường lưu trữ một lượng dữ liệu rất hạn chế (tối đa là 4096 byte cho mỗi trang web) và chúng được lưu trữ trên các máy của khách truy cập. Điều này làm cho cookie hạn chế và không an toàn - không đủ để cung cấp cho các nhu cầu phiên của các trang web hiện đại.

Giữ an toàn cho các ứng dụng của bạn trên đám mây

Cloudways cung cấp 2FA, SSL miễn phí và các tính năng bảo mật nâng cao hơn trên các máy chủ được quản lý để giữ cho ứng dụng của bạn an toàn.

Phiên PHP

PHP như một ngôn ngữ lập trình web thuộc về lớp ứng dụng. PHP xây dựng trên cookie HTTP để cung cấp một cơ chế để duy trì ngữ cảnh qua nhiều yêu cầu. Đối với điều này, nó kết hợp tiêu đề cookie cụ thể, tùy chỉnh với lớp xử lý phiên riêng:

SessionHandler implements SessionHandlerInterface , SessionIdInterface {
/* Methods */
public close ( ) : bool
public create_sid ( ) : string
public destroy ( string $id ) : bool
public gc ( int $max_lifetime ) : int|bool
public open ( string $path , string $name ) : bool
public read ( string $id ) : string
public write ( string $id , string $data ) : bool
}

Cơ chế này có thể được mở rộng hoặc viết lại hoàn toàn bằng cách kế thừa lớp sessionHandler hoặc bằng cách triển khai sessionHandlerInterface.

Trong PHP, các phiên mặc định vẫn tồn tại dưới dạng các tệp trên máy chủ. Các tập tin mang tên của ID phiên tương ứng của họ. Khi phiên được bắt đầu, PHP sẽ đặt cookie phpsessid với ID phiên. Sau đó, khi trình duyệt của khách truy cập trả về cookie đó trên mỗi yêu cầu, máy chủ liên kết dữ liệu phiên trong tệp liên quan đến phiên đó. Kết quả là trạng thái phiên liên tục trên nhiều trang trên một trang web.

Sử dụng các phiên trong PHP

Một phiên trong PHP có thể được bắt đầu bằng một cuộc gọi đến một hàm session_start (). Chức năng này bắt đầu một phiên mới hoặc khôi phục một phiên hiện có được chuyển đến máy chủ trong cookie hoặc trong POST hoặc nhận các tham số yêu cầu. $ _Session Superglobal mảng sau đó được sử dụng để đặt hoặc để có các biến trong một phiên.session_start() . This function either starts a new session, or restores an existing session passed to the server in a cookie, or in POST or GET request parameters. $_SESSION superglobal array is then used to set or to get variables in a session.

Nếu sau đó chúng tôi muốn sử dụng các biến phiên trên các trang khác của cùng một trang web, một tài liệu PHP khác cần sử dụng session_start (). Điều này sẽ tạo ra các biến $ _Session, có thể đã được đặt trên các trang/tài liệu web khác, có sẵn trên bộ hiện tại.$_SESSION variables, which may have been set on other web pages/documents, available on the current one.

session_close () cam kết các thay đổi thành $ _session đối với đĩa commits the changes to $_SESSION to the disk

Chức năng session_destroy () sẽ phá hủy tất cả dữ liệu phiên. Để loại bỏ hoàn toàn phiên, cũng cần phải tháo ID phiên và xóa rõ ràng cookie phiên. Ngoài những điều cơ bản này, PHP còn có một loạt các chức năng khác để xử lý phiên. function will destroy all the session data. To fully remove the session, it is also necessary to unset the session ID, and explicitly delete the session cookie. Beyond these basics, PHP has a host of other functions for session handling .

Chức năng mà các phiên PHP cố gắng cung cấp - dữ liệu liên tục trong các lượt truy cập vào các trang của một trang web - là không thể thiếu đối với các trang web hiện đại. Tuy nhiên, việc thực hiện Phiên PHP là một điểm tranh chấp.

Do dữ liệu phiên trong PHP được ghi vào một tệp trên máy chủ theo mặc định và tệp bị khóa trong quá trình thực thi tập lệnh, điều này có thể đưa ra các thách thức về hiệu suất và tỷ lệ.

Các phiên PHP cũng đưa ra những thách thức đối với cơ chế bộ nhớ đệm thông thường - các trang lưu trữ với bộ cookie phpsessid có thể làm tổn hại nghiêm trọng trang web trong khi bỏ qua bộ đệm cho các trang có phpsessid có nghĩa là bỏ qua bộ đệm trên toàn bộ trang web.PHPSESSID would mean bypassing cache on the entire website.

Và sau đó, có những vấn đề bảo mật.

Các vấn đề bảo mật phiên PHP

Phiên PHP là một bước tiến liên quan đến bảo mật so với một hệ thống nơi tất cả dữ liệu phiên được lưu trữ trong cookie. Phpsessid cookie chỉ lưu trữ ID tham chiếu cho một tệp phiên sống trên máy chủ.

Cài đặt mặc định PHP cho một đường dẫn để lưu các tệp phiên mà chúng ta có thể tìm thấy trong các tệp cấu hình php.ini là session.save_path = Hồi/tmp. Điều này có nghĩa là các tệp phiên có thể bị ảnh hưởng một cách hiệu quả bởi những người dùng khác.session.save_path = “/tmp” . This means that session files could effectively get compromised by other users.

Vấn đề này đặc biệt đáng báo động khi chúng tôi nhớ lại rằng phần lớn các trang web do PHP cung cấp trực tiếp trên các máy chủ được chia sẻ với nhiều người thuê.

Phổ biến nhất trong tất cả các khai thác phiên là vụ cướp phiên.

Một cuộc tấn công tấn công vụ tấn công là gì?

Trụ tội xảy ra khi một bên độc hại có quyền truy cập bất hợp pháp vào phiên khác của người dùng. Kẻ tấn công trước tiên sẽ có được ID phiên thuộc về người dùng khác. Sau đó, anh ta sẽ sử dụng ID này để có quyền truy cập đầy đủ vào phiên khác của người dùng. ID phiên là đủ để máy chủ cung cấp quyền truy cập vào tài khoản tương ứng.

Về mặt lý thuyết, ID phiên có thể thu được bằng cách dự đoán hoặc đoán (lực lượng vũ phu), nhưng cách có khả năng nhất là ID phiên bị đánh cắp. Cả hai cuộc tấn công vũ lực, hoặc dự đoán ID sẽ ít xảy ra hơn nhiều.

Có một số vectơ mà kẻ tấn công có thể truy cập vào ID phiên của người dùng.

Các loại tấn công tấn công vụ tấn công

Tiết kiệm phiên có thể xảy ra theo nhiều cách khác nhau - ở đây chúng tôi chỉ đề cập đến những người khét tiếng hơn:

  • XSS hoặc kịch bản chéo trang-Đây là một cuộc tấn công xảy ra khi một bên thứ ba thành công để đưa JavaScript vào cơ thể của một trang web được nạn nhân truy cập. Hãy nói rằng, một trang web XY sử dụng các biến GET và không vệ sinh đúng cách chúng. Kẻ tấn công có thể sử dụng JavaScript trong một yêu cầu GET và đưa nó vào phần thân của trang web, đạt được mức độ truy cập tương tự như trang web của chính JavaScript. Ví dụ, nó có thể nhận được nội dung của cookie phpsessid, và sau đó gửi nó cho kẻ tấn công. – this is an attack that happens when a third party succeeds to inject javascript into the body of a website visited by the victim. Let’s say that a website XY uses GET variables, and does not properly sanitize them.An attacker can use javascript in a GET request and get it injected into the body of a web page, gaining the same level of access as the website’s own javascript. For example, it can get the content of the PHPSESSID cookie, and then send it to the attacker.
  • Phiên Sidejacking - Loại tấn công này xảy ra với người đàn ông trong vector tấn công giữa - trong các tình huống khi kẻ tấn công được định vị giữa nguồn và đích đến của giao thông. Kẻ tấn công sẽ lắng nghe các yêu cầu và phản hồi, và, trừ khi lưu lượng truy cập được mã hóa, anh ta có thể nắm bắt ID phiên. – this type of attack happens with Man In The Middle attack vector – in situations when the attacker is positioned between the source and the destination of the traffic. The attacker will listen to requests and responses, and, unless the traffic is encrypted, he can capture the Session ID.
  • Việc cố định phiên xảy ra với các ứng dụng web dễ bị tổn thương, mà không cần phải đặt ID phiên mới khi xác thực người dùng, nhưng thay vào đó chấp nhận ID phiên hiện có khi nó tồn tại. Trong loại tấn công này, kẻ tấn công sẽ tạo ra một ID phiên hợp lệ nhưng không sử dụng, và sau đó, thông qua các sơ đồ khác nhau, làm cho người dùng hợp lệ xác thực bằng ID đó. Sau đó, việc sở hữu ID người dùng được xác thực, kẻ tấn công có quyền truy cập vào phiên của người dùng. happens with vulnerable web applications, which don’t insist on always setting a new Session ID upon user authentication, but instead accept an existing Session ID when it exists. In this type of attack, the attacker will forge a valid, but unused Session ID, and then, through various schemes, make a valid user authenticate using that ID. After that, having possession of the authenticated user’s ID, the attacker gains access to the user’s session.
  • Dự đoán phiên-Trong loại tấn công này, kẻ tấn công thường sẽ có một số kiến ​​thức về cách ứng dụng tạo ID phiên và sau đó sẽ cố gắng đoán các ID người dùng khác sử dụng cùng một phương thức. Đây là nơi mà sự ngẫu nhiên của thế hệ ID-S đóng vai trò lớn. – in this type of attack, the attacker will usually have some knowledge of how the application generates Session ID-s, and will then try to guess other user’s IDs using the same method. This is where the randomness of Session ID-s generation plays a big role.

Kẻ tấn công có thể làm gì với một phiên đã bị tấn công thành công?

Khi kẻ tấn công có được quyền truy cập vào phiên thuộc về người dùng hợp pháp, máy chủ sẽ cấp cho anh ta tất cả quyền lực mà người dùng ban đầu có. Như vậy, ID phiên có thể được ví như một chìa khóa cấp cho chủ sở hữu của nó truy cập vào nhà, bất kể anh ta có phải là chủ sở hữu nhà hay không.

Cuộc tấn công này thường sẽ tập trung vào người dùng & phiên có quyền truy cập hành chính, vì vậy trong những trường hợp đó, kẻ tấn công sẽ có được quyền hành chính trên trang web bị xâm phạm.

Trước khi tiếp tục các biện pháp khác nhau, chúng tôi có thể thực hiện để ngăn chặn các phiên của chúng tôi bị khai thác bởi những kẻ tấn công, điều quan trọng là phải nói rằng các lỗ hổng liên quan đến các phiên PHP không phải là một thứ cụ thể cho chính ngôn ngữ. Chúng không phải là một lỗ hổng vốn có của PHP - các công nghệ khác đòi hỏi các biện pháp tương tự để giảm thiểu các vectơ tấn công tương tự này.

Vì vậy, các biện pháp thông thường mà chúng ta có thể thực hiện để giảm thiểu các cuộc tấn công tấn công phiên?

  • Tấn công XSS (kịch bản chéo trang)-Giảm thiểu đối với loại tấn công này không phải là phiên cụ thể. Trang web cần ngăn chặn bất kỳ loại đầu vào người dùng nào được thực thi trong trình duyệt của khách truy cập. Điều này đơn giản có nghĩa là bất kỳ đầu vào người dùng, thông qua các biểu mẫu hoặc nhận các tham số hoặc các nhu cầu khác phải được vệ sinh trước khi sử dụng. Đây là một biện pháp bảo mật chung cho các ứng dụng web, cho các loại tấn công này và các loại tấn công khác (ví dụ: SQL Injection). Hai hàm chính trong PHP được sử dụng để vệ sinh các chuỗi là htmlspecialchars () và dải_tags (). htmlspecialchars () chuyển đổi các ký tự đặc biệt thành các thực thể HTML và Strip_tags () sẽ chỉ cần xóa tất cả các thẻ HTML, bao gồm cả thẻ. lần đầu tiên được triển khai trong Internet Explorer 6 hiện tại, sau này được các trình duyệt khác áp dụng. session.cookie_httponly cờ thêm một hướng dẫn cho trình duyệt không cho phép JavaScript phía máy khách truy cập cookie: nó sẽ thêm một hướng dẫn httponly tùy chọn để đặt tiêu đề phản hồi-cookie. – mitigation against this type of attack is not sessions-specific. The website needs to prevent any kind of user input from being executed in the visitor’s browser. This simply means that any user input, through forms or GET parameters, or other needs to be sanitized before it is used. This is a general security measure for web applications, for this and other types of attacks (e.g., SQL injection). The main two functions in PHP used to sanitize strings are htmlspecialchars() and strip_tags(). htmlspecialchars() converts special characters into html entities, and strip_tags() will simply remove all the HTML tags, including