Static trong C++

Một phần của tài liệu Quan điểm lập trình (Trang 28 - 29)

I. QUÁ TRÌNH THIẾT KẾ HỆ THỐNG SỐ.

static trong C++

Việt Thanh

Cách dùng của từ khóa static bên trong một hàm là đơn giản nhất. Nó có nghĩa là một khi biến đã được khởi tạo, nó sẽ tồn tại trong bộ nhớ cho đến cuối chương trình. Bạn có thể tưởng tượng là biến đó đã bị “đóng” cứng lại. Và duy trì giá trị của nó cho đến khi chương trình kết thúc. Ví dụ, bạn có thể dùng một biến static để ghi lại số lần hàm được gọi bằng cách thêm vào hàm một dòng static int count = 0; count++. Bởi vì biến count là một biến static, dòng lệnh static int count = 0 sẽ chỉ thực hiện một lần duy nhất. Những lần tiếp theo hàm được gọi, count sẽ tiếp tục tăng. Và bạn có thể kiểm tra xem hàm đã được thực thi bao nhiêu lần bất cứ lúc nào trong chương trình bằng cách kiểm tra giá trị của nó.

Bạn cũng có thể dùng static theo cách tương tự để ngăn chặn việc một biến bị khởi tạo lại bên trong một vòng lặp. Ví dụ, trong đoạn mã sau, nếu không có dòng static thì giá trị của biến number_ of_time sẽ chỉ là 1 sau khi thực hiện xong vòng lặp. Tuy nhiên, do chúng ta đã khai báo là static, biến number_of_time chỉ được khởi tạo một lần ở lần lặp đầu tiên và tiếp tục tăng cho đến khi kết thúc các vòng lặp. Và bạn có thể tính được là nó có giá trị là 100.

for(int x=0; x<10; x++) {

for(int y=0; y<10; y++) {

static int number_of_times = 0; number_of_times++;

count<<number_of_times; }

}

Bạn có thể dùng một biến static để chứa thông tin về giá trị cuối cùng mà một hàm trả về, chẳng hạn như bạn muốn chứa giá trị lớn nhất mà một hàm tính được. Nếu bạn đang hiện thực một hàm phân tích chuỗi, bạn cũng có thể chứa token cuối cùng được trả về bởi hàm trong một biến static. Như vậy bạn có thể lấy giá trị đó đơn giản bằng cách gọi hàm kèm theo một tham số xác định là hàm phải trả về token cuối cùng.

Cách dùng thứ hai của static là bên trong một định nghĩa class. Hầu hết các biến khai báo bên trong một class xuất hiện trên theo từng đối tượng được tạo ra. Nghĩa là đối với những đối tượng khác nhau thuộc cùng một lớp thì những biến tương ứng hoàn toàn có thể mang những giá trị khác nhau. Trong khi đó, một biến thành viên kiểu static sẽ mang cùng một giá trị trong bất kỳ thể hiện nào của lớp, ngay cả khi chẳng có thể hiện nào được tạo ra. Ví dụ, nếu bạn muốn đếm số đối tượng của một lớp, bạn có thể dùng một biến thành viên kiểu static để theo dõi. Chú ý, bạn nên tham chiếu đến các thành phần static của class thông qua tên class thay vì tên của một đối tượng thuộc lớp đó. Làm như thế sẽ giúp bạn luôn nhớ rằng biến static đó không thuộc về một đối tượng riêng lẻ nào của class. Và bạn cũng không cần phải tạo ra một đối tượng của lớp đó để có thể dùng các biến thành viên kiểu static.

Bạn cũng có thể tạo một hàm thành viên kiểu static cho class. Hàm thành viên kiểu static là những hàm không đòi hỏi phải có một thể hiện nào của class để tồn

tại. Và bạn có thể truy xuất hàm thành viên kiểu static giống như truy xuất các biến thành viên kiểu static. Nên nhớ rằng hàm static chỉ có thể thao tác trên những biến static của class. Hàm thành viên kiểu static thường được dùng để xử lý các biến static, chẳng hạn như tăng trị số biến static khi bạn dùng biến đó làm số định danh duy nhất cho một thể hiện của class.

Ví dụ, bạn có thể dùng mã lệnh như sau: class user { private: int id;

static int next _id = 0; public:

static int next_user_id() { next_id++; return next_id; } /*****************/ user() { id = user.next_id; //hoặc, id = user.next_user_id(); } }; Dòng mã: user a_user; sẽ thiết lập id thành một số id tiếp theo chưa được gán cho bất cứ user nào trong tiến trình này. Chú ý rằng chúng ta nên khai báo id là const.

Cuối cùng, chúng ta có thể dùng static để khai báo những biến toàn cục bên trong một tập tin mã lệnh. Trong trường hợp này, việc dùng static xác định rằng mã nguồn của những tập tin khác trong project sẽ không thể truy xuất biến static này. Chỉ có mã lệnh bên trong tập tin chứa khai báo biến static mới có thể truy xuất đến nó. Hay nói cách khác, tầm vực của biến static chỉ giới hạn trong tập tin chứa nó.

Mô tả vấn đề

Can thiệp tham số SQL hay SQL INJECTION là một kỹ thuật thay thế các tham số SQL trên địa chỉ URL của trang web bằng các tham số có chủ ý của người tấn công. Xem xét địa chỉ của các trang web động lập trình bằng PHP, ta có thấy các bộ phận sau: Giao thức vd: HTPP:// Địa chỉ máy chủ vd: www.yoursite.com Tê ứa mã kịch bản vd: index.php Tham số vd: id

Giá trị truyền vào tham số vd: 12345

HTTP://www.yoursite.com/index. php?id=12345

SQL Injection tận dụng những chỗ hổng của cơ chế xử lý các giá trị này. Ví dụ, một script có thể chỉ sử dụng các giá trị số. Nếu truyền vào đó một chữ cái thì script đó sẽ từ chối thực hiện và kèm theo sau đó là một hay một loạt các thông báo lỗi xuất hiện, để lộ ra các thông tin nhạy cảm. Ví dụ, bạn có thể kiểm tra script có cơ chế truyền giá trị tham số kiểu như trên bằng cách gửi đi một URL với giá trị không hợp lệ được truyền cho tham số HTTP://www.yoursite.com/index. php?thisid=’

Điều này sẽ tạo ra một lỗi SQL. Nó có thể bộc lộ ra các chi tiết như là tên bảng hay tên trường trong cơ sở dữ liệu. Vậy là người muốn xâm nhập đã có thông tin để thao túng cơ sở dữ liệu của bạn.

Khng chế SQL INJECTION

Một phần của tài liệu Quan điểm lập trình (Trang 28 - 29)