- Lập trình PHP đã tăng lên nhanh chóng kể từ khi bắt đầu khiêm tốn của nó từ năm 1995. Kể từ đó, PHP đã trở thành ngôn ngữ lập trình phổ biến nhất cho các ứng dụng Web. Nhiều trang web phổ biến được xây dựng bằng PHP và phần lớn các mã nguồn và dự án Web được xây dựng với ngôn ngữ phổ biến.
- Hướng dẫn này nhằm vào những người vừa mới bắt đầu học PHP và sẵn sàng xắn tay áo lên và code.
- Dưới đây là một số kỹ thuật tuyệt vời mà các nhà phát triển PHP nên học và sử dụng mỗi khi họ lập trình.
- Những mẹo này sẽ tăng tốc độ thành thạo và làm cho mã nguồn sạch hơn và tối ưu hóa hơn cho hiệu suất.
1. Tránh SQL Injection
- VD: Khi người dùng nhập thông tin đăng nhập và bấm login, thông tin của người dùng sẽ được gửi một tới server thông qua một POST request sau đó sẽ được gán vào một câu lệnh SQL. Đoạn code đó sẽ trông như này:
- Giả sử dữ liệu gửi lên email="linhdn1198@gmail.com"và password="12345678" thì câu query sẽ như sau:
- Đấy là trường hợp người dùng nhập đúng vậy nếu người dùng cố tình nhập sai thì sao?
- Kết quả câu query sẽ như dưới, người dùng chỉ cần nhập email là có thể truy cập được.
Vậy làm thế nào để tránh tấn công SQL Injection
- Đừng bao giờ tin vào thông tin người dùng nhập vào.
- Validate dữ liệu trên server side: Sử dụng hàm mysql_real_escape_string()để loại bỏ những kí tự có thể gây ảnh hưởng đến câu lệnh SQL.
2. Sự khác biệt giữa các toán tử so sánh
- Đây là một mẹo hay, nhưng cần một ví dụ thực tế chứng minh khi một so sánh không nghiêm ngặt có thể gây ra vấn đề.
- Nếu bạn sử dụng strpose() để xác định xem một chuỗi con có tồn tại trong một chuỗi hay không (nó trả về FALSE nếu không tìm thấy chuỗi con và trả về vị trí đầu tiên xuất hiện của chuỗi con), kết quả có thể gây hiểu nhầm:
- Vì chuỗi con Chris xuất hiện ở đầu ‘Chris & Sean’, strpose() trả về đúng 0, cho biết vị trí đầu tiên trong chuỗi.
- Bởi vì câu lệnh có điều kiện coi đây là Boolean, nó trả về FALSE. và kết quả sẽ là Chris is not an author. -> Sai logic
- Điều này có thể được sửa chữa bằng một so sánh nghiêm ngặt:
3. Shortcut The Else
- Kiểm tra người dùng có phải admin không? dựa vào username.
- Đoạn code trên có vẻ ổn, nhưng nếu nhà phát triển sau đó thêm một role khác.
- Đoạn code trên, nếu người dùng cung cấp tên ngừoi chạy vào điều kiện auth($username) == 'mod' thì $admin chưa được khởi tạo. Điều này có thể dẫn đến kết quả không mong muốn hoặc lỗ hổng bảo mật.
- Ngoài ra, một case tương tự $moderatorkhông được khởi tạo khi chạy điều kiện auth($username) == 'admin'.
- Bằng cách khởi tạo $adminvà $moderator đầu tiên để tránh được tình huống này.
- Nên tạo một function để xử lý user có được phép xem một trang cụ thể.
- Nếu bạn muốn giảm số lượng dòng, có thể ghép điều kiện như sau.
- Bạn có thể giảm toàn bộ hàm thành một điều kiện ghép duy nhất
- Cuối cùng, functioncó thể được giảm xuống thành một lần return
- Nếu mục tiêu của bạn là giảm số lượng dòng, bạn đã hoàn thành. Tuy nhiên, nhìn code rất dối, khó hiểu.
- Điều này đưa chúng ta đến mẹo sẽ trả về ngay lập tức nếu thỏa mãn điều kiện.
- Mặc dù sử dụng nhiều dòng mã hơn, nhưng nó rất đơn giản, dễ hiểu và hữu ích khi logic của bạn phức tạp hơn.
4. Luôn sử dụng {} sau biểu thức điều kiện
- Bạn đã có danh sách người sinh nhật vào 21 Mayvà sau đó gọi hàm party(TRUE);
- Nhưng không hàm party(TRUE); luôn chạy không cần điều kiện date('d M') == '21 May'.
- Do đó nên sử dụng {} sau biểu thức điều kiện dù chỉ có một dòng lệnh trong đó.
5. Hàm str_replace(), ereg_replace() và preg_replace()
- Nếu bạn sử dụng biểu thức chính quy, ereg_replace()và preg_replace() sẽ nhanh hơn str_replace. Vì str str_replace không hỗ trợ khớp mẫu.
- Sự lựa chọn giữa các string functions và regular expression functions phù hợp với mục đích, không phải là nhanh hơn.
- Nếu bạn cần khớp mẫu, sử dụng hàm biểu thức chính quy ereg_replace, preg_replace.
- Nếu bạn cần khớp chuỗi sử dụng str_replace.
6. Cẩn thận khi sử dụng toán tử 3 ngôi.
- Tác giả muốn $host = htmlentities($host)nếu độ dài chuỗi lớn hơn 0, nhưng thay vào đó lại vô tình làm ngược lại.
7. Sử dụng một Framework để phát triển ứng dụng web
8. Sử dụng isset() thay cho strlen()
Khi bạn coi các chuỗi là mảng, mỗi ký tự trong chuỗi là một phần tử trong mảng.
- Bằng cách xác định xem một phần tử cụ thể có tồn tại hay không, bạn có thể xác định xem chuỗi đó có dài ít nhất nhiều ký tự hay không. (Lưu ý rằng ký tự đầu tiên là phần tử 0, vì vậy $ username [5] là ký tự thứ sáu trong $ username).
- Lý do: hàm isset()sẽ nhanh hơn strlen() vì strlen() là một function còn isset() là một language construct
Via Topdev