Khai thác phiên php
Phiên là một thành phần quan trọng trong việc tạo các trang web hoặc ứng dụng web động. Nếu bạn đang xây dựng các loại trang web này, chắc chắn bạn sẽ được yêu cầu xử lý Phiên tại một số điểm Show Trong bài đăng này, tôi sẽ xem xét Phiên PHP, tại sao bạn cần chúng, cách lưu trữ chúng và tôi sẽ cung cấp cho bạn một lớp hoàn chỉnh để xử lý Phiên trong cơ sở dữ liệu Phiên là gì?Trước khi chúng tôi triển khai giải pháp Phiên, điều quan trọng là phải hiểu chính xác chúng là gì Theo mặc định, Internet là một môi trường “không trạng thái”. Điều này có nghĩa là mọi yêu cầu bạn thực hiện trong trình duyệt đều ẩn danh theo nghĩa là nó không bị ràng buộc với yêu cầu trước đó theo bất kỳ cách nào. Khi bạn đăng nhập vào một trang web, ứng dụng phải “ghi nhớ” rằng bạn đã đăng nhập và bạn phải được liên kết với một tài khoản. Tuy nhiên, để duy trì “trạng thái” này, chúng ta cần sử dụng Sessions Phiên là một mã định danh duy nhất được ghi lại trên máy chủ và trong trình duyệt của bạn. Bằng cách ghi lại thông tin này, máy chủ có thể duy trì trạng thái trên nhiều yêu cầu trang Vì vậy, về cơ bản, internet không thể nhớ bạn mỗi khi bạn làm mới trang. Phiên chỉ đơn giản là một ghi chú nhỏ cho phép máy chủ và trình duyệt của bạn duy trì một số dữ liệu nhất định Phiên hoạt động như thế nào?Phiên hoạt động bằng cách gán cho mỗi người dùng một mã định danh duy nhất. Khi bạn lưu dữ liệu vào Session (chẳng hạn như đăng nhập) thì Session sẽ lưu dữ liệu đó thành một file trên máy chủ. Mã định danh duy nhất cũng được lưu trữ dưới dạng cookie trên máy tính của người dùng Khi người dùng truy cập một trang mới, id phiên từ cookie được sử dụng để tìm dữ liệu phiên từ bộ lưu trữ tệp. Nếu dữ liệu được tìm thấy, nó sẽ tải nó vào biến toàn cục Phiên sẵn sàng cho ứng dụng sử dụng Phiên có an toàn không?Giống như bất kỳ thứ gì trên Internet, Phiên sẽ an toàn cho đến một thời điểm nhất định. Mặc dù có thể “chiếm đoạt” một Phiên, nhưng tôi sẽ không lo lắng quá nhiều về điều đó trừ khi bạn đang lưu trữ dữ liệu thực sự nhạy cảm về mọi người Nếu tin tặc có thể chiếm đoạt Phiên của người dùng khác, họ sẽ có thể đăng nhập vào tài khoản của người dùng như thể họ là người đó Có nhiều cách để làm cho Sessions an toàn hơn. Ví dụ: bạn có thể lưu trữ mã thông báo trong Phiên được tạo tự động theo từng yêu cầu. Sau đó, bạn có thể so sánh các mã thông báo này để xem chúng có khớp không. Một phương pháp khác có thể là duy trì bản ghi địa chỉ IP của người dùng và dữ liệu trình duyệt. Cả hai phương pháp này đều không thể đánh lừa được vì cả hai đều dễ bị tấn công. Cả hai phương pháp cũng sẽ tăng thêm độ phức tạp đáng kể cho ứng dụng của bạn và có thể sẽ làm phiền người dùng nhiều hơn là giữ an toàn cho họ Một trong những vấn đề với việc lưu trữ Phiên trong hệ thống tệp trên máy chủ là khi bạn đang sử dụng gói lưu trữ được chia sẻ. Nếu máy chủ không được định cấu hình chính xác, ai đó có thể truy cập vào phiên của bạn Một cách để ngăn chặn sự cố này là lưu trữ Phiên trong cơ sở dữ liệu, thay vì lưu trữ tệp. May mắn thay, việc lập phiên bản trong cơ sở dữ liệu thực sự dễ dàng và nó sẽ không ảnh hưởng tiêu cực đến người dùng của bạn Lưu trữ Phiên trong cơ sở dữ liệu cũng là một lợi thế nếu bạn cần mở rộng ứng dụng của mình ra nhiều máy chủ. Bằng cách lưu trữ dữ liệu Phiên trong một máy chủ trung tâm mà bất kỳ Máy chủ nào khác có thể truy cập, bạn sẽ loại bỏ được sự cố có thể phát sinh Thiết lập lưu trữ Phiên trong cơ sở dữ liệuLần đầu tiên tôi được giới thiệu về việc lưu trữ Phiên trong cơ sở dữ liệu bởi bài đăng tuyệt vời này của Chris Shiflett. Chris cung cấp phần giới thiệu hoàn hảo về khái niệm này và một số mã mẫu để bắt đầu. Mã trong hướng dẫn này là phần mở rộng của công việc của Chris, vì vậy nếu bạn muốn đọc phần giới thiệu của anh ấy, bạn có thể thực hiện điều đó trước Vì vậy, để lưu trữ dữ liệu Phiên của chúng tôi trong cơ sở dữ liệu, chúng tôi sẽ cần một bảng Chạy SQL sau trong cơ sở dữ liệu của bạn để tạo bảng. Tôi đang sử dụng MySQL, nhưng hy vọng những điều sau đây sẽ đủ để giúp bạn bắt đầu
lớp phiênChúng tôi sẽ sử dụng một Lớp để xử lý các Phiên của chúng tôi. Điều này có nghĩa là chúng ta có thể chỉ cần khởi tạo một Đối tượng mới của lớp trên mỗi yêu cầu trang. Nó cũng giữ tất cả các phương thức Phiên của chúng tôi ở cùng một nơi Để lưu trữ dữ liệu Phiên trong cơ sở dữ liệu, chúng ta sẽ cần có cách tương tác với cơ sở dữ liệu. Đối với hướng dẫn này, tôi sẽ chuyển qua lớp Phiên và phiên bản của lớp Cơ sở dữ liệu mà tôi đã viết trong Roll your own PDO PHP Class Nếu bạn muốn sử dụng lớp trừu tượng Cơ sở dữ liệu của riêng mình, bạn có thể dễ dàng tắt nó đi. Nếu bạn chưa thiết lập lớp trừu tượng hóa cơ sở dữ liệu, hãy xem hướng dẫn đó Vì vậy, điều đầu tiên chúng ta cần làm là tạo Class
Tiếp theo, chúng tôi khai báo một thuộc tính cho đối tượng cơ sở dữ liệu mà chúng tôi sẽ sử dụng
người xây dựngKhi khởi tạo lớp Session, chúng ta cần thiết lập một số thứ để nó hoạt động. Phương thức khởi tạo sẽ tự động chạy khi lớp được khởi tạo và vì vậy đây là một nơi tốt để thực hiện điều đó Đầu tiên, chúng tôi khởi tạo một bản sao của lớp cơ sở dữ liệu và lưu trữ nó trong thuộc tính db
Tiếp theo, chúng ta cần ghi đè trình xử lý Phiên để nói với PHP rằng chúng ta muốn sử dụng các phương thức của riêng mình để xử lý Phiên
Điều này có vẻ phức tạp, nhưng tất cả những gì nó muốn nói là chúng ta muốn sử dụng các phương thức của riêng mình để lưu trữ và truy xuất dữ liệu được liên kết với Phiên. Hãy xem Hướng dẫn sử dụng PHP để đọc thêm về điều này Và cuối cùng chúng ta cần bắt đầu Session
Vì vậy, phương thức xây dựng của bạn sẽ trông như thế này
Tiếp theo, chúng ta cần tạo từng phương thức để xử lý dữ liệu Phiên của mình. Mỗi phương pháp này đều thực sự đơn giản. Nếu bạn không quen với phần tóm tắt cơ sở dữ liệu từ hướng dẫn PDO, hãy đọc qua bài đăng đó để được giải thích chi tiết hơn về các phương thức sẽ tương tác với cơ sở dữ liệu MởPhương thức đầu tiên chúng ta cần tạo chỉ đơn giản là kiểm tra xem có kết nối cơ sở dữ liệu nào để sử dụng không
Ở đây chúng tôi chỉ đơn giản là kiểm tra xem có kết nối cơ sở dữ liệu hay không. Nếu có, chúng ta có thể trả về true, nếu không, chúng ta sẽ trả về false ĐóngRất giống với phương thức Open, phương thức Close chỉ kiểm tra xem kết nối đã được đóng chưa ________số 8 ĐọcPhương thức Read lấy Id phiên và truy vấn cơ sở dữ liệu. Phương pháp này là ví dụ đầu tiên về nơi chúng tôi liên kết dữ liệu với truy vấn. Bằng cách ràng buộc id với. id và không sử dụng biến trực tiếp, chúng tôi sử dụng phương pháp PDO để ngăn chặn SQL injection
Nếu truy vấn trả về dữ liệu, chúng tôi có thể trả lại dữ liệu. Nếu truy vấn không trả về bất kỳ dữ liệu nào, chúng tôi sẽ trả về một chuỗi trống. Dữ liệu từ phương thức này được chuyển đến mảng Phiên toàn cầu có thể được truy cập như thế này 0ViếtBất cứ khi nào Phiên được cập nhật, nó sẽ yêu cầu phương thức Viết. Phương thức Viết lấy Id phiên và dữ liệu Phiên từ mảng Phiên toàn cầu. Mã thông báo truy cập là dấu thời gian hiện tại Một lần nữa, để ngăn chặn SQL injection, chúng tôi liên kết dữ liệu với truy vấn trước khi nó được thực thi. Nếu truy vấn được thực hiện đúng, chúng tôi trả về true, ngược lại, chúng tôi trả về false 1Hủy hoạiPhương thức Phá hủy chỉ cần xóa một Phiên dựa trên Id của nó 2Phương thức này được gọi khi bạn sử dụng hàm toàn cục hủy phiên, như thế này 3Thu gom rác thảiVà cuối cùng, chúng ta cần một chức năng Gom rác. Chức năng Thu gom rác sẽ được chạy bởi máy chủ để dọn sạch mọi Phiên đã hết hạn còn sót lại trong cơ sở dữ liệu. Chức năng Thu gom rác được chạy tùy thuộc vào một vài cài đặt mà bạn có trên máy chủ của mình 4Bộ sưu tập rác được chạy dựa trên phiên. gc_probability và phiên. cài đặt gc_divisor trên máy chủ của bạn. Ví dụ, xác suất được đặt thành 1000 và ước số là 1. Điều này có nghĩa là đối với mọi yêu cầu trang, sẽ có 0. 01% cơ hội phương thức thu gom rác sẽ được chạy Phương thức được truyền một biến tối đa. Điều này liên quan đến số giây tối đa trước khi PHP nhận ra Phiên đã hết hạn. Một lần nữa, đây là cài đặt trên máy chủ của bạn được mở để bạn chỉnh sửa Cả hai cài đặt này có thể được tìm thấy trong php của bạn. tập tin ini Sự kết luậnVà bạn đã có một cách hay và đơn giản để thiết lập và chạy bằng cách lưu trữ Phiên PHP trong cơ sở dữ liệu. Hy vọng rằng đây là một phần giới thiệu tốt về khái niệm này và một ví dụ thực tế để bạn có thể thấy nó hoạt động |