Tìm kiếm
 

 Nội dung bản tin

 
Anti PHP-SQL Injection
Cập nhật: 21-06-2012 02:05
1.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ó . Ví dụ như chúng ta có một Script kiểm tra đăng nhập như sau : Mã lệnh (php) <? //Các lệnh Connect vào SQL Database .v.v. $username = ...

1.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ó . Ví dụ như chúng ta có một Script kiểm tra đăng nhập như sau :
Mã lệnh (php) <?
//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:
Mã lệnh (php) <?
//...
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 : http://somehost.com/somescript.php?file=somescript.php
- 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.

In nội dung
Các tin đã đăng ngày:
Select a date from the calendar.
 

 Liên Kết Website

 

Lượt truy cập:

HỘI TIN HỌC ĐỒNG NAI
DONGNAI ASSOCIATION FOR INFORMATION PROCESSING
Địa chỉ: Số 1597 (260 cũ), đường Phạm Văn Thuận, P.Thống Nhất, Tp.Biên Hòa, tỉnh Đồng Nai.
Điện thọai:  061.3822297 - Email: hoitinhocdn@gmail.com