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);

?>

pdf28 trang | Chuyên mục: PHP | Chia sẻ: dkS00TYs | Lượt xem: 1875 | Lượt tải: 2download
Tóm tắt nội dung 21 sai lầm chết người trong lập trình với PHP, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
ạ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:

  • pdf21 sai lầm chết người trong lập trình với PHP.pdf
Tài liệu liên quan