Hướng dẫn advantages and disadvantages of session in php - ưu nhược điểm của session trong php

Sau đây là những ưu điểm cơ bản và nhược điểm của việc sử dụng phiên. Tôi đã mô tả chi tiết với từng loại phiên vào thời điểm sau. & Nbsp;

Ưu điểm: & nbsp; & nbsp;  

  • Nó giúp duy trì trạng thái người dùng và dữ liệu cho tất cả các ứng dụng.
  • Nó có thể dễ dàng được thực hiện và chúng tôi có thể lưu trữ bất kỳ loại đối tượng nào. & NBSP;
  • Lưu trữ mỗi dữ liệu khách hàng riêng biệt. & Nbsp;
  • Phiên là an toàn và minh bạch từ người dùng.

Nhược điểm: & nbsp; & nbsp;  

  • Chi phí hiệu suất trong trường hợp khối lượng lớn người dùng, do dữ liệu phiên được lưu trữ trong bộ nhớ máy chủ.
  • Chi phí liên quan đến việc tuần tự hóa và khử dữ liệu phiên. Bởi vì trong trường hợp của & nbsp; stateserver & nbsp; andsqlserver & nbsp; chế độ phiên, chúng tôi cần tuần tự hóa đối tượng trước cửa hàng. & nbsp; StateServer andSQLServer session mode we need to serialize the object before store. 

Bên cạnh đó, có nhiều ưu điểm và nhược điểm của phiên dựa trên các loại phiên. Tôi đã thảo luận về tất cả chúng. & Nbsp; & nbsp;

Một điều tôi đã bắt đầu làm thường xuyên hơn gần đây là lấy một số dữ liệu khi bắt đầu một nhiệm vụ và lưu trữ nó trong một $ _Session ['MyDataForthetask'].retrieving some data at the beginning of a task and storing it in a $_SESSION['myDataForTheTask'].

Bây giờ có vẻ rất thuận tiện khi làm như vậy nhưng tôi không biết gì về hiệu suất, rủi ro bảo mật hoặc tương tự, sử dụng phương pháp này. Đó có phải là một cái gì đó thường xuyên được thực hiện bởi các lập trình viên có nhiều chuyên môn hơn hay nó là một điều nghiệp dư để làm?

Ví dụ:

if (!isset($_SESSION['dataentry']))
{
    $query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=" . mysql_real_escape_string($_GET['wave_id']);
    $result_taskinfo = $db->query($query_taskinfo);
    $row_taskinfo = $result_taskinfo->fetch_row();

        $dataentry = array("pcode" => $row_taskinfo[0], "modules" => $row_taskinfo[1], "data_id" => 0, "wavenum" => $row_taskinfo[2], "prequest" => FALSE, "highlight" => array());

        $_SESSION['dataentry'] = $dataentry;
}

1

Các biến phiên tốt thực sự là một trong những cách duy nhất (và có lẽ là hiệu quả nhất) khi có các biến này có sẵn trong toàn bộ thời gian khách truy cập trên trang web, không có cách nào thực sự để người dùng chỉnh sửa chúng (trừ khai thác trong Mã, hoặc trong trình thông dịch PHP) để chúng khá an toàn.

Đó là một cách tốt để lưu trữ các cài đặt có thể được thay đổi bởi người dùng, vì bạn có thể đọc các cài đặt từ cơ sở dữ liệu một lần khi bắt đầu một phiên và nó có sẵn cho toàn bộ phiên đó, bạn chỉ cần thực hiện các cuộc gọi cơ sở dữ liệu nữa nếu cài đặt được thay đổi và tất nhiên, như bạn hiển thị trong mã của mình, thật tầm thường để tìm hiểu xem các cài đặt đã tồn tại hay liệu chúng có cần được trích xuất từ ​​cơ sở dữ liệu hay không.

Tôi không thể nghĩ ra bất kỳ cách nào khác để lưu trữ các biến tạm thời một cách an toàn (vì cookie có thể dễ dàng sửa đổi và điều này sẽ không mong muốn trong hầu hết các trường hợp) vì vậy $ _Session sẽ là cách để & nbsp; đi

2

Cơ chế $ _Session đang sử dụng cookie.

Trong trường hợp Firefox (và có thể là mới IE, tôi đã không kiểm tra bản thân mình) điều đó có nghĩa là phiên đó được chia sẻ giữa các tab đã mở. Đó không phải là điều bạn mong đợi theo mặc định. Và nó có nghĩa là phiên đó không còn là "một cái gì đó cụ thể cho một cửa sổ/người dùng".session is shared between opened tabs. That is not something you expect by default. And it means that session is no longer "something specific to a single window/user".

Ví dụ: nếu bạn đã mở hai tab để truy cập trang web của mình, hơn là đã đăng nhập dưới dạng gốc bằng tab đầu tiên, bạn sẽ có được các đặc quyền gốc trong từng người khác.

Điều đó thực sự bất tiện, đặc biệt nếu bạn mã hóa máy khách e-mail hoặc thứ gì đó khác (như cửa hàng điện tử). Trong trường hợp này, bạn sẽ phải quản lý các phiên theo cách thủ công hoặc giới thiệu khóa liên tục được tái tạo trong URL hoặc làm việc khác.

Tôi sử dụng biến phiên mọi lúc để lưu trữ thông tin cho người dùng. Tôi chưa thấy bất kỳ vấn đề nào với hiệu suất. Dữ liệu phiên được kéo dựa trên cookie (hoặc PHPSessID nếu bạn tắt cookie). Tôi không thấy đó là rủi ro bảo mật hơn bất kỳ xác thực dựa trên cookie nào khác và có thể an toàn hơn việc lưu trữ dữ liệu thực tế trong cookie người dùng.

Chỉ để cho bạn biết, bạn có vấn đề bảo mật với câu lệnh SQL của mình:

SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=".$_GET['wave_id'];

Bạn không bao giờ nên, tôi nhắc lại không bao giờ, lấy dữ liệu do người dùng cung cấp và sử dụng nó để chạy câu lệnh SQL mà không cần vệ sinh trước. Tôi sẽ bọc nó trong báo giá và thêm hàm mysql_real_escape_string(). Điều đó sẽ bảo vệ bạn khỏi hầu hết các cuộc tấn công. Vì vậy, dòng của bạn sẽ trông giống như:NEVER, I REPEAT NEVER, take user provided data and use it to run a SQL statement without first sanitizing it. I would wrap it in quotes and add the function mysql_real_escape_string(). That will protect you from most attacks. So your line would look like:

$query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id='".mysql_real_escape_string($_GET['wave_id'])."'";

0

Có một vài yếu tố bạn sẽ muốn xem xét khi quyết định lưu trữ dữ liệu tạm thời. Lưu trữ phiên là tuyệt vời cho dữ liệu dành riêng cho một người dùng. Nếu bạn tìm thấy trình xử lý lưu trữ phiên dựa trên tệp mặc định là không hiệu quả, bạn có thể thực hiện một cái gì đó khác, có thể sử dụng cơ sở dữ liệu hoặc loại phụ trợ Memcache. Xem session_set_save_handler để biết thêm thông tin.

Tôi thấy đó là một thông lệ xấu để lưu trữ dữ liệu chung trong phiên của người dùng. Có những nơi tốt hơn để lưu trữ dữ liệu sẽ được một số người dùng truy cập thường xuyên và bằng cách lưu trữ dữ liệu này trong phiên, bạn sẽ sao chép dữ liệu cho mỗi người dùng cần dữ liệu này. Trong ví dụ của bạn, bạn có thể thiết lập một loại công cụ lưu trữ khác cho dữ liệu sóng này (dựa trên WAVE_ID) không được gắn riêng với phiên của người dùng. Bằng cách đó, bạn sẽ kéo dữ liệu xuống một lần và họ lưu trữ nó ở đâu đó mà một số người dùng có thể truy cập dữ liệu mà không cần phải kéo khác.

Nếu bạn đang chạy trên máy chủ của riêng bạn hoặc trong một môi trường mà không ai có thể rình mò trên các tệp/bộ nhớ của bạn trên máy chủ, dữ liệu phiên sẽ được bảo mật. Chúng được lưu trữ trên máy chủ và chỉ là một cookie nhận dạng được gửi đến máy khách. Vấn đề là nếu người khác có thể giật cookie và mạo danh người khác, tất nhiên. Sử dụng HTTPS và đảm bảo không đặt ID phiên vào URL sẽ giữ cho người dùng của bạn an toàn khỏi hầu hết các vấn đề đó. (XSS vẫn có thể được sử dụng để giật cookie nếu bạn không cẩn thận, hãy xem bài đăng của Jeef Atwoods về điều này.)

Đối với những gì cần lưu trữ trong một biến phiên, hãy đặt dữ liệu của bạn ở đó nếu bạn muốn tham khảo lại nó trên một trang khác, như một giỏ mua sắm, nhưng đừng đặt nó ở đó nếu đó chỉ là dữ liệu tạm thời được sử dụng để tạo ra kết quả của việc này Trang, giống như một danh sách các thẻ cho bài đăng hiện đang được xem. Các phiên là cho dữ liệu liên tục của mỗi người dùng.

Một cách khác để cải thiện xác thực đầu vào là sử dụng biến _get ['wave_id']:

$query_taskinfo = "SELECT participationcode, modulearray, wavenum FROM mng_wave WHERE wave_id=".(int)$_GET['wave_id']." LIMIT 1";

Tôi đang cho rằng WAVE_ID là một số nguyên và chỉ có một câu trả lời.

Sẽ

0

Một vài nhược điểm khác của việc sử dụng các phiên:

  1. $_SESSION Dữ liệu sẽ hết hạn sau phiên.gc_maxlifetime giây không hoạt động.
  2. Bạn sẽ phải nhớ gọi session_start() cho mỗi tập lệnh sẽ sử dụng dữ liệu phiên.
  3. Việc mở rộng trang web bằng cách cân bằng tải trên nhiều máy chủ có thể là một vấn đề vì người dùng sẽ cần được chuyển đến cùng một máy chủ mỗi lần. Giải quyết vấn đề này bằng "phiên dính".

Các mục $ _Session được lưu trữ trong phiên, theo mặc định, được giữ trên đĩa. Không cần phải tạo ra mảng của riêng bạn và nhét nó vào một mục 'DataEntry' như bạn đã làm. Bạn chỉ có thể sử dụng $ _Session ['PCODE'], $ _Session ['Mô -đun'], v.v.

Như tôi đã nói, phiên được lưu trữ trên đĩa và một con trỏ đến phiên được lưu trữ trong cookie. Do đó, người dùng không thể dễ dàng nhận được dữ liệu phiên.

2

IMO, hoàn toàn chấp nhận được để lưu trữ mọi thứ trong phiên. Đó là một cách tuyệt vời để làm cho dữ liệu kiên trì. Trong nhiều trường hợp, nó cũng an toàn hơn là lưu trữ mọi thứ trong cookie. Dưới đây là một vài mối quan tâm:

  • Có thể ai đó có thể chiếm đoạt một phiên, vì vậy nếu bạn sẽ sử dụng nó để theo dõi ủy quyền của người dùng, hãy cẩn thận. Đọc để biết thêm thông tin.
  • Nó có thể là một cách rất lười biếng để giữ dữ liệu. Đừng chỉ ném mọi thứ vào phiên để bạn không phải truy vấn cho nó sau này.
  • Nếu bạn sẽ lưu trữ các đối tượng trong phiên, các tệp lớp của họ sẽ cần được bao gồm trước khi phiên được bắt đầu theo yêu cầu tiếp theo hoặc bạn sẽ cần phải cấu hình trình tải tự động.

Tôi đã tìm thấy các phiên rất hữu ích, nhưng một vài điều cần lưu ý:

1) PHP có thể lưu trữ các phiên của bạn trong thư mục TMP hoặc thư mục khác có thể truy cập được cho người dùng khác trên máy chủ của bạn. Bạn có thể thay đổi thư mục là các phiên được lưu trữ bằng cách truy cập tệp php.ini.

2) Nếu bạn đang thiết lập một hệ thống giá trị cao cần bảo mật rất chặt chẽ, bạn có thể muốn mã hóa dữ liệu trước khi bạn gửi nó đến phiên và giải mã nó để sử dụng nó. Lưu ý: Điều này có thể tạo quá nhiều chi phí tùy thuộc vào dung lượng lưu lượng / máy chủ của bạn.

3) Tôi đã tìm thấy rằng session_destroy (); Không xóa phiên ngay lập tức, bạn vẫn phải đợi người thu gom rác PHP để làm sạch các phiên. Bạn có thể thay đổi tần số mà bộ thu gom rác được chạy trong tệp php.ini. Nhưng vẫn không có vẻ rất đáng tin cậy, thêm thông tin http://www.captain.at/howto-php-sessions.php

Bạn có thể muốn xem xét làm thế nào để thực hiện điều này?

tức là xem "Giao tiếp" đoạn văn trong "Giới thiệu ngắn gọn về phần còn lại" ...

"Nghỉ ngơi bắt buộc trạng thái đó được biến thành trạng thái tài nguyên hoặc giữ cho khách hàng. Nói cách khác, một máy chủ không phải giữ lại một số trạng thái giao tiếp cho bất kỳ máy khách nào mà nó giao tiếp với một yêu cầu duy nhất."

(hoặc bất kỳ liên kết nào khác trên Wikipedia để nghỉ ngơi)

Vì vậy, trong trường hợp của bạn, 'wave_id' là một tài nguyên hợp lý để có được, nhưng bạn có thực sự muốn lưu trữ nó trong phiên không? Chắc chắn là giải pháp của bạn để lưu trữ tài nguyên đối tượng?

Tôi sử dụng phương pháp này một chút công bằng, tôi không thấy bất kỳ vấn đề nào với nó. Không giống như cookie, dữ liệu không được lưu trữ ở phía máy khách, thường là một sai lầm lớn.

Giống như bất cứ điều gì, chỉ cần cẩn thận rằng bạn luôn luôn vệ sinh đầu vào của người dùng, đặc biệt nếu bạn đặt đầu vào của người dùng vào biến $ _Session, sau đó sử dụng biến đó trong truy vấn SQL.

Đây là một điều khá phổ biến để làm, và phiên thường sẽ nhanh hơn so với các lượt truy cập cơ sở dữ liệu liên tục. Chúng cũng an toàn một cách hợp lý, vì các nhà phát triển PHP đã làm việc chăm chỉ để ngăn chặn vụ cướp phiên.

Vấn đề duy nhất là bạn cần nhớ xây dựng lại mục nhập phiên khi một cái gì đó thay đổi. Và, nếu bất cứ điều gì được thay đổi bởi người dùng không phải là người sở hữu phiên sẽ dẫn đến cần phải làm mới khóa này, không có cách nào dễ dàng để thông báo cho hệ thống để làm mới khóa phiên này. Có thể không phải là một vấn đề lớn, nhưng một cái gì đó bạn nên biết.

$ _Session rất hữu ích trong bảo mật, vì đây là cách bên máy chủ lưu trữ thông tin trong khi người dùng đang tích cực trên các trang của bạn, do đó khó hack trừ khi tệp hoặc máy chủ PHP thực tế của bạn có điểm yếu được khai thác. Một triển khai rất tốt là lưu trữ một biến để xác nhận rằng người dùng được đăng nhập và chỉ cho phép các hành động được thực hiện nếu chúng được xác nhận đã đăng nhập.

Những lợi thế của phiên trong PHP là gì?

Lợi ích PHP của việc lưu trữ dữ liệu phiên trong cơ sở dữ liệu..
Giới hạn số lượng đăng nhập.Ví dụ, nếu ứng dụng của bạn chỉ cho phép 10 lần đăng nhập cùng một lúc, thì bảng phiên có thể được kiểm tra để tìm số lượng người dùng đã đăng nhập. ....
Chặn nhiều thông tin đăng nhập cho cùng tên người dùng.....
Giám sát hoạt động của người dùng.....
Đăng xuất một người dùng ..

Những lợi thế của việc sử dụng các phiên là gì?

Ưu điểm của việc sử dụng trạng thái phiên như sau: - Thật dễ dàng để thực hiện.- Nó đảm bảo độ bền của dữ liệu, vì trạng thái phiên giữ lại dữ liệu ngay cả khi quá trình làm việc ASP.NET khởi động lại dưới dạng dữ liệu ở trạng thái phiên được lưu trữ trong không gian quy trình khác.It is easy to implement. - It ensures data durability, since session state retains data even if ASP.NET work process restarts as data in Session State is stored in other process space.

Mục đích của một phiên là gì?

Mục đích phiên là gì?Mục đích phiên là một mô tả chung về các kết quả, mục tiêu hoặc thành tích mong muốn liên quan đến các cuộc họp hoặc tụ tập nhóm.Mục đích mô tả các kết quả dự kiến được mong đợi của những người tham gia.a general description of the desired outcomes, goals, or accomplishments associated with group meetings or gatherings. The purpose describes the anticipated results that are expected of the participants.