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

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

Lầ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

CREATE TABLE IF NOT EXISTS `sessions` [
    `id` varchar[32] NOT NULL,
    `access` int[10] unsigned DEFAULT NULL,
    `data` text,
    PRIMARY KEY [`id`]
] ENGINE=InnoDB DEFAULT CHARSET=latin1;

lớp phiên

Chú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

class Session
{
}

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

/**
 * Session
 */
class Session
{
    /**
     * Db Object
     */
    private $db;
}

người xây dựng

Khi 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

public function __construct[] {
    // Instantiate new Database object
    $this->db = new Database;
}

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

// Set handler to overide SESSION
session_set_save_handler[
    [$this, "_open"],
    [$this, "_close"],
    [$this, "_read"],
    [$this, "_write"],
    [$this, "_destroy"],
    [$this, "_gc"]
];

Đ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

// Start the session
session_start[];

Vì vậy, phương thức xây dựng của bạn sẽ trông như thế này

public function __construct[] {
    // Instantiate new Database object
    $this->db = new Database;

    // Set handler to overide SESSION
    session_set_save_handler[
        array[$this, "_open"],
        array[$this, "_close"],
        array[$this, "_read"],
        array[$this, "_write"],
        array[$this, "_destroy"],
        array[$this, "_gc"]
    ];

    // Start the session
    session_start[];
}

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

/**
 * Open
 */
public function _open[] {
    // If successful
    if [$this->db] {
        // Return True
        return true;
    }
    // Return False
    return false;
}

Ở đâ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

Đóng

Rấ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

Đọc

Phươ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

/**
 * Read
 */
public function _read[$id] {
    // Set query
    $this->db->query["SELECT data FROM sessions WHERE id = :id"];

    // Bind the Id
    $this->db->bind[":id", $id];

    // Attempt execution
    // If successful
    if [$this->db->execute[]] {
        // Save returned row
        $row = $this->db->single[];
        // Return the data
        return $row['data'];
    }else{
        // Return an empty string
        return "";
    }
}

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

class Session
{
}
0

Viết

Bấ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

class Session
{
}
1

Hủy hoại

Phương thức Phá hủy chỉ cần xóa một Phiên dựa trên Id của nó

class Session
{
}
2

Phươ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

class Session
{
}
3

Thu gom rác thải

Và 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

class Session
{
}
4

Bộ 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ận

Và 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

Chủ Đề