21 sai lầm chết người trong lập trình với PHP
Sử d ụng printf() kh ông th ích hợp
Hàm printf () dùng để in d ữ li ệu có định dạng
Nó có thể được dùng, th í dụ, khi bạn m ột in m ột số kiểu double v ớ i 2 số l ẻ, hoặc trong
bất kì t ì nh hu ống n ào bạn mu ố n thay đổi định d ạng trước khi in.
Thí dụ dưới đây minh ho ạ cách dùng đú ng củ a printf (): định d ạng số Pi với độ chí nh xác
theo ý mu ốn
Mã l ệnh (PHP)
<?
/* The three faces of Π */
printf ("Pi is: %.2f\n<br>\n", M_PI);
printf ("Pi is also: %.3f\n<br>\n", M_PI);
printf ("Pi is also: %.4f\n<br>\n", M_PI);
?>
ạn đã viết chương trình có nhiều lỗi hay thiếu những bước kiểm tra cần thiết dẫn đến hỏng dữ liệu. Thí dụ, tôi đã thấy nhiều chương trình không dùng hàm đã có của PHP mail() vốn an toàn mà lại đi dùng sendmail thông qua popen(). Nó có thể dẫn đến nhiều lỗ hổng bảo mật (thí dụ như /etc/passwd được gửi đến người dùng cuối). Có vài nơi thường xảy ra các sự cố về bảo mật, hoặc tiềm năng gây ra hỏng dữ liệu rất lớn: Thực hiện lời gọi hệ thống. Tôi không có cách nào diễn tả được mức độ nguy hiểm của vấn đề này. Luôn đảm bảo rằng mọi dữ liệu người dùng đưa vào là an toàn trước khi chuyển nó cho một lời gọi hệ thống. ĐỪ ĐỪ NG NG BAO BAO GI GI Ờ Ờ TIN TIN NG NG ƯỜ ƯỜ I I D D Ù Ù NG NG M M Ộ Ộ T T C C Á Á CH CH M M Ù Ù QU QU Á Á NG NG KHI KHI ĐƯ ĐƯ A A D D Ữ Ữ LI LI Ệ Ệ U U C C Ủ Ủ A A H H Ọ Ọ V V À À O O L L Ờ Ờ I I G G Ọ Ọ I I H H Ệ Ệ TH TH Ố Ố NG NG M M À À KH KH Ô Ô NG NG KI KI Ể Ể M M TRA TRA TR TR ƯỚ ƯỚ C C . Khi đăng kí người dùng. Nếu bạn trông mong có kết quả chính xác, luôn kiểm tra và đảm bảo bản đăng kí được kiểm tra những chỗ cần thiết. Trước tiên, có nhiều cách để kiểm tra một địa chỉ e-mail hợp lệ. Hơn nữa, bạn nên kiểm tra tuổi của người dùng có nằm trong phạm vi thích hợp không. Với một sự suy rộng, bạn có PHP programming dynamic web for ewreybody 21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes NGUYENANHKHOA– Class27K0A – DepartmentOf Information Technology 24 24 Dormitory 204.B5 18:20 PM April 7, 2006 thể khẳng định khá chắc chắn rằng không có một người 200 tuổi nào có khả năng dùng máy vi tính. Khi chấp nhận thẻ tín dụng. Một số lập trình viên chỉ dùng những thuật toán đơn giản mà có thể dễ dàng bị đánh lừa khi thực hiện kiếm tra thẻ tín dụng. Chỉ chấp nhận thẻ của các công ty lớn để kiểm tra tính hợp lệ của số thẻ trước khi chấp nhận thẻ của người dùng. ĐỪ ĐỪ NG NG BAO BAO GI GI Ờ Ờ TIN TIN T T ƯỞ ƯỞ NG NG M M Ộ Ộ T T THU THU Ậ Ậ T T TO TO Á Á N N 1. 1. B B ả ả o o m m ậ ậ t t c c ủ ủ a a l l ờ ờ i i g g ọ ọ i i h h ệ ệ th th ố ố ng ng Mỗi khi bạn đưa dữ liệu của người dùng vào lời gọi hệ thống, bạn cần tỉnh táo kiểm tra dữ liệu đó. Đảm bảo rằng không có gì nguy hiểm nằm trong dữ liệu đó có thể lừa phỉnh hệ thống thực hiện những lệnh không mong muốn. PHP cung cấp một hàm làm điều đó: EscapeShellCmd() Bất cứ khi nào bạn chuyển một lệnh có chứa dữ liệu nhạy cảm, trốn thoát dữ liệu đó bằng hàm EscapeShellCmd EscapeShellCmd (): Trốn thoát (escaping) dữ liệu có nghĩa là thêm dấu sổ ngược (backslash \) trước kí tự có thể lừa phình hệ thống (chính xác là các kí tự #&;?'\"|*?~^()[]{}$\\\x0A\xFF). M M ã ã HTML HTML Name Lookup Name Lookup <?php if ($name) { system (EscapeShellCmd ("lookup $name")); print " nn"; } ?> [/color] " method="GET"> Enter a name to lookup: Dù EscapeShellCmd() là một hàm tốt để kiểm tra lệnh, bạn vẫn nên thử và thực hiện các kiểm tra đặc thù phụ thuộc vào loại dữ liệu. Hàm EscapeShellCmd() sẽ không kiểm tra tính đúng đắn của dữ liệu được đệ trình, nó sẽ chỉ ngăn cản người dùng làm các việc không được phép. 1.1. 1.1. Đ Đ i i xa xa h h ơ ơ n n m m ộ ộ t t b b ướ ướ c c Như một quy luật, nên kiểm tra các kí tự được phép hơn là kiểm các kí tự không được phép. Thí dụ, đảm bảo rằng $name chỉ chứa các kí tự chữ và số (alphanumeric characters). Bằng cách này, rất khó để khai thác lỗ hổng trong hệ thống của bạn. 2. 2. Ki Ki ể ể m m tra tra đị đị a a ch ch ỉ ỉ e-mail e-mail Một trong những hình thức kiểm tra phổ biến nhất là xem một địa chỉ e-mail có hợp lệ không. Mấy tay mới vào nghề sẽ chỉ dùng các biểu thức chính quy (mà họ lượm được trong PHP programming dynamic web for ewreybody 21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes NGUYENANHKHOA– Class27K0A – DepartmentOf Information Technology 25 25 Dormitory 204.B5 18:20 PM April 7, 2006 một nhóm thư tín, hay trong một kho mã nguồn nào đó). Tuy nhiên, một biểu thức chính quy không đủ nếu bạn mu ốn có kết quả chính xác. Có vài cách an toàn hơn mà bạn có thể dùng: 2.1. 2.1. Ki Ki ể ể m m tra tra k k ế ế t t n n ố ố i i (socket (socket validation) validation) Một cách để kiểm định địa chỉ e-mail mà không quấy rầy trực tiếp đến người dùng là tạo một kết nối đến server nhận được trong địa chỉ e-mail, sau đó tìm tên đăng kí của họ. 2.1.1. 2.1.1. Ư Ư u u đ đ i i ể ể m m Không gây bất tiện cho người dùng vì nó được tiến hành trong suốt. Phát hiện nhiều địa chỉ ma mà biểu thức chính quy không biết (như là joe@fgsdh.com). 2.1.2. 2.1.2. Khuy Khuy ế ế t t đ đ i i ể ể m m Không phát hiện được địa chỉ bị đánh cắp. Thí dụ, nếu John Doe đưa địa chỉ e- mail của tôi (phanthanhkieu@php.net), mọi thứ vẫn tiến hành bình thường, dù nó là địa chỉ của tôi chứ không phải của hắn ta. Kiểm tra chậm hơn biểu thức chính quy. Mail server của người dùng có thể tạm ngưng hoạt động trong thời gian ngắn, làm cho một địa chỉ e-mail hợp lệ bị từ chối 2.2. 2.2. Ki Ki ể ể m m tra tra t t ươ ươ ng ng t t á á c c Một cách khác để kiểm định địa chỉ e-mail là gửi một khoá đặc biệt đến hộp thư người dùng, và bắt họ nhập khoá đó để tiếp tục. Điều này đảm bảo rằng không những địa chỉ e-mail là hợp lệ, mà người dùng có quyền truy xuất vào địa chỉ đó. 2.2.1. 2.2.1. Ư Ư u u đ đ i i ể ể m m Là cách tốt nhất để kiểm tra người dùng có một địa chỉ e-mail hợp lệ 2.2.2. 2.2.2. Khuy Khuy ế ế t t đ đ i i ể ể m m Đòi hỏi người dùng phải tiến hành thêm bước phụ. Điều này quấy rầy mấy người có ý định làm phiền bạn. Giống như mọi cách khác, nó không đảm bảo được chống-đánh-lừa. Người dùng có thể tạo một địa chỉ tạm ở Hotmail hay Netaddress và sau PHP programming dynamic web for ewreybody 21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes NGUYENANHKHOA– Class27K0A – DepartmentOf Information Technology 26 26 Dormitory 204.B5 18:20 PM April 7, 2006 PHẦN 3: 7 LỖI CHẾT NGƯỜI 7. 7. Ch Ch é é p p v v à à d d á á n: n: kh kh ô ô ng ng ph ph ả ả i i h h ướ ướ ng ng đ đ i i t t ố ố t t Tôi đã gặp nhiều tay lập trình mới vào nghề đi chép những đoạn mã (thí dụ như là kiểm tra địa chỉ e-mail, gửi e-mail, lấy giá trị từ form để soạn e-mail). Họ thường dán chúng vào chương trình của mình và rồi kết quả là một đống những câu lệnh gửi form không an toàn. Dù rằng một đoạn mã chạy được trong những điều kiện tối ưu, nó thường gặp lỗi trong bất kì sự kiểm tra "mã tốt" nào Công việc chắp vá sẽ kh kh ô ô ng ng có các ưu điểm sau: M M ở ở r r ộ ộ ng ng đượ đượ c: c: đoạn mã trông như các mảnh riêng rẽ ráp vá vào nhau. Nếu nhờ một lập trình viên có kinh nghiệm sửa chương trình của bạn, họ thường thích viết lại toàn bộ Đoạn mã không đọc được sẽ không mở rộng được. An An to to à à n: n: bạn có thể đang chép mã của người khác vào chương trình của mình mà lại không hiểu rõ ràng đoạn mã đó. Hãy tưởng tưởng xem. Nếu đoạn mã đó có một lỗi làm xoá toàn bộ đĩa của bạn Hơn nữa, cùng một đoạn mã thì tính an toàn không giống nhau trên các hệ thống khác nhau. Cuối cùng, chương trình của bạn sẽ kế thừa lỗi của người khác. Nhanh: Nhanh: khi cắt dán các đoạn mã, kết quả thường sẽ chạy không nhanh, vì chúng không có một tiến trình chung hợp lí (đây là điều quan trọng nhất khi viết các chương trình nhanh) 1. 1. L L à à m m đú đú ng ng ph ph ươ ươ ng ng ph ph á á p: p: t t ì ì m m hi hi ể ể u u tr tr ướ ướ c, c, sao sao ch ch é é p p sau sau Nghiên cứu mã của người khác kĩ lưỡng trước khi sao chép. Phân tích xem nó làm gì. Chỉ khi nào đoạn mã ấy đọc được, nhất quán với logic chương trình của bạn, và không có lỗi, thì mới nên sao chép nó. Tiến hành lúc này sẽ giúp bạn chỉnh sửa nó phù hợp với các phần còn lại của chương trình một cách thoải mái hơn. 2. 2. C C á á c c th th ư ư vi vi ệ ệ n n r r ấ ấ t t t t ố ố t t Chỉ dùng các thư viện PHP từ các nguồn tin cậy như PEAR hoặc kho các lớp của PHP (PHP Classes Repository). Với các gói API có sẵn, việc dùng các hàm của nó cũng không thành vấn đề. Thực ra, nếu bạn tìm được một thư viện viết sẵn bởi một nguồn tin cậy, thì thường nó sẽ là một lựa chọn tốt để dùng cho chương trình (thay vì tự viết lấy). 6. 6. Kh Kh ô ô ng ng c c ó ó đườ đườ ng ng l l ố ố i i ( ( guidelines ) ) cho cho đồ đồ á á n n Một lần khi tôi mới bắt đầu lập trình, tôi làm việc trên một đồ án khá cơ bản (với Perl) cùng 3 lập tình viên khác. Vì tôi còn trẻ (và không phải trưởng nhóm), chúng tôi không có đường lối viết mã cho đồ án. Mỗi người được giao một phần công việc, và làm riêng rẽ. Khi chúng tôi nhập chung lại để chạy chương trình cuối cùng, mỗi phần của đồ án nhìn khác hẳn nhau PHP programming dynamic web for ewreybody 21 Fatal errors in programming with PHP – Collect from writting of Sterling Hughes NGUYENANHKHOA– Class27K0A – DepartmentOf Information Technology 27 27 Dormitory 204.B5 18:20 PM April 7, 2006 1. 1. M M ộ ộ t t th th í í d d ụ ụ m m ẫ ẫ u u v v ề ề đườ đườ ng ng l l ố ố i i 5. 5. Kh Kh ô ô ng ng xem xem x x é é t t l l ạ ạ i i m m ã ã 4. 4. V V á á l l ỗ ỗ i i khi khi thi thi ế ế t t k k ế ế 3. 3. Kh Kh ô ô ng ng quan quan t t â â m m đế đế n n ng ng ườ ườ i i d d ù ù ng ng khi khi thi thi ế ế t t k k ế ế 2. 2. Kh Kh ô ô ng ng theo theo s s á á t t k k ế ế ho ho ạ ạ ch ch c c ủ ủ a a đồ đồ á á n n 1. 1. Ph Ph í í th th ờ ờ i i gian gian
File đính kèm:
- 21 sai lầm chết người trong lập trình với PHP.pdf