Tải bản đầy đủ (.pdf) (4 trang)

Anti PHP-SQL Injection doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (74.93 KB, 4 trang )

Anti PHP-SQL Injection
Hầu hết các lỗi SQL Injection đều là do câu lệnh SQL sai hoặc do User làm
cho câu lệnh SQL sai , không thực hiện đúng chức năng của nó
í dụ như chúng ta có một Script kiểm tra đăng nhập như sau :
<?
//Các lệnh Connect vào SQL Database .v.v.
$username = $_POST['username']; //Lấy User và Pass từ Form
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM users WHERE user =
\"$username\" AND password = \"$password\"");
if (mysql_num_rows($result) > 0) {
//Đăng nhập thành công
}
else {
//Đăng nhập không đúng Username hay Password
}
//
?>

- Đoạn Script trên là một đoạn Script rất đơn giản thực hiện Login thông qua
câu SQL kiểm tra username và password . Câu lệnh SQL nguyên thủy là :
SELECT * FROM users WHERE user = "$username" AND password =
"$password"
- Tuy nhiên, đây lại là một SQL Injection vô cùng lớn, nếu như User nhập biến
User là " OR 1 OR user="
- Khi đó lệnh SQL sẽ trở thành :
SELECT * FROM users WHERE user = "" OR 1 OR user="" AND password
= "$password"
- Kết quả trả về sẽ là toàn bộ user trong Database và dĩ nhiên đây là một trường
hợp Login không hợp lệ (biến password cũng có thể sữ dụng để tạo SQL
Injection) . Thực ra, lỗi trên là do biến $username, có thể fix bằng cách kiểm


tra biến user, rồi sau đó mới kiểm tra biến pass, hoặc một cách nhanh hơn, fix
được hầu hết tất cả các lỗi SQL Injection mà chỉ cần sữ dụng một hàm có sẵn
của PHP, đó là hàm addslashes .
- Xin nói một chút về hàm addslashes: hàm này sẽ trả về một chuỗi với dấu \
trước các ký tự cần trích dẫn trong Database, các ký tự đó là " \ và NUL (\0) .
- Cấu trúc hàm addslashes : string addslashes ( string str)
- Nhờ có hàm addslashes mà câu lệnh SQL của ta sẽ trở thành :
SELECT * FROM users WHERE user = "\" OR 1 OR user=\"" AND password
= "$password"
- Như vậy thì câu lệnh SQL sẽ hoạt động đúng như chức năng của nó . Một số
lỗi SQL Injection khác cũng có thể khắc phục bằng phương pháp này. Tôi cũng
xin nhắc lại là phương pháp này chỉ fix được hầu hết tất cả các lỗi SQL
Injection, tức là các lỗi do biến PHP gây ra, còn các lỗi do bản thân câu lệnh
SQL thì cách này không có hiệu quả gì. Tuy nhiên nếu dùng phương pháp này
và câu lệnh SQL chắc chắn thì tôi tin rằng bạn sẽ không còn lo lắng về SQL
Injection.
2.PHP Injection
- Lỗi PHP Injection thường xảy ra với các script đọc File, tương tác hệ thống
v.v. . Đây là một điển hình của PHP Injection:
<? // readfile($file); // ?>
- Thoạt nhìn thì không có lỗi gì, nhưng nếu như vì một lý do gì đó mà biến
$file không được khai báo thì đây là một lỗi PHP Injection rất nặng. Nếu như
Link đưa đến trang có lỗi như thế này :

- Lúc này thì biến $file lại được khai báo bởi chính PHP, chức năng Regiser-
Global và kết quả là sẽ đưa ra nội dung của file somescript.php hay bất cứ File
nào trên hệ thống (kể cả File chức Password nếu hacker chịu khó mò và xem
như host của chúng ta tiêu luôn).
- Nếu phân tích thì ta sẽ thấy rằng biến $file đã được khai báo do chức năng
Register-Global (chức năng tự động đăng ký các biến trong GET, POST ,

COOKIE v.v ), và được fix một cách đơn giản là tắt chức năng này đi. Việc
tắt chức năng này đi cũng không ảnh hưởng gì nhiều đến PHP.
Nguyễn Quốc Bảo
theo vncoder.net

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×