Người ta thường ví, cơ sở dữ liệu (database là “linh hồn” của các trang web động lập trình bằng ngôn ngữ ASP hay PHP. Chính vì vậy, trong thời gian qua tội phạm mạng liên tục khai thác các lỗ hổng trong cơ sở dữ liệu của trang web để tấn công, phá hoại, thay đổi thông tin, thậm chí điều khiển được cả website. Các lỗ hổng này thường xuất hiện trong khâu lập trình, không lường trước các tình huống có thể xảy ra khi vận hành website. Một số trường hợp dưới đây có thể giúp người làm trang web động, lập trình viên hạn chế và chặn các xâm nhập bất hợp pháp vào cơ sở dữ liệu SQL với thuật ngữ quen thuộc là “cách phòng chống tấn công SQL Injection cho website”.
Đối với trang web viết bằng ASP, ASPX
1. Lọc dấu nháy “’”
function filter1(input)
input = replace(input, "'", "''")
filter1 = input
end function.
2. Đưa vào “danh sách đen - black list”
function blacklist(input)
known_bad = array("select", "insert", "update", "delete", "drop", "--", "'")
blacklist = true
for i = lbound(known_bad) to ubound(known_bad)
if ( instr(1, input, known_bad(i), vbtextcompare ) <> 0) then
blacklist = false
exit function
end if
next
end function
3. Tạo “danh sách trắng – white list”
function whitelist(input)
good_password_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
whitelist = true
for i = 1 to len(input)
c = mid(input, i, 1)
if ( InStr(good_password_chars, c) = 0) then
whitelist = false
exit function
end if
next
end function
Đối với trang web viết bằng PHP
1. Chống bypass
Thay vì lập trình như thông thường để nhận giá trị từ form đăng nhập, dạng: if(isset($_POST['username']) && isset($_POST['passwd']) ){
$username = $_POST['username'];
$passwd = $_POST['passwd'];
Người lập trình có thể cải tiến theo cách:
if(isset($_POST['username']) && isset($_POST['passwd']) ){
$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);
2. Dùng hàm str_ireplace
Tại link lỗi thường được thể hiện bằng đoạn mã lệnh (code):
$id = $_GET['id'];
if(!isset($id))
$id=1;
$sql = "SELECT * FROM products WHERE id=$id limit 0,1";
Fix:
$id = str_ireplace('union','*',$_GET['id']);
//$id = $_GET['id'];
if(!isset($id))
$id=1;
$sql = "SELECT * FROM products WHERE id=$id limit 0,1";
Trong đó, từ khóa union trên là đơn cử, bạn có thể dùng mảng để chứa các giá trị black list. Hàm str_replace cũng tương tự như hàm str_ireplacc nhưng nó có ưu điểm là không phân biệt ký tự hoa, thường.
Chẳng hạn, với câu lệnh:
$id = str_replace('union','*',$_GET['id']);
Thì câu lệnh truy vấn union select all 1,2,3,4,5,6,7-- sẽ không vượt qua được; nhưng câu lệnh truy vấn uNioN select all 1,2,3,4,5,6,7-- thì sẽ vượt qua một cách dễ dàng.
Trong khi đó, với câu lệnh:
$id = str_ireplace('union','*',$_GET['id'])
là an toàn.
Về nội dung ký tự thay thế trong hàm str_ireplace, nếu bạn dùng câu lệnh:
$id = str_replace('union','',$_GET['id']);
thì câu lệnh truy vấn union select all 1,2,3,4,5,6,7-- sẽ không vượt qua được “cửa này”. Tuy nhiên, nếu xài câu lệnh truy vấn uniUNIONon select all 1,2,3,4,5,6,7-- thì sẽ rất dễ “chui vào”.
Ngoài ra, việc “ép kiểu” cũng gia thêm độ an toàn cho website, nó không hiện ra thông báo lỗi, giữ cho website an toàn mà vẫn “đẹp”. Ví dụ:
$id = (int)$_GET['id'];
//$id = $_GET['id'];
if(!isset($id))
$id=1;
$sql = "SELECT * FROM products WHERE id=$id limit 0,1";
Comments[ 0 ]
Đăng nhận xét