A- Trên ngôn ngữ asp, aspx
1. Lọc dấu nháy “’”
2. Black list
3. whitelist
B- Trên ngôn 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
Fix:
2. Dùng hàm str_ireplace
tại link lỗi được thể hiện code như sau:
Fix:
Lưu ý :
a. Từ khóa union trên là đơn cử, bạn có thể dùng mãng. Mãng này chứa các giá trị blacklist
b. hàm str_replace cũng tương tự như hàm str_ireplacc, nhưng ở đây tôi dung hàm str_ireplace vì có ưu điểm là không phân biệt ký tự hoa, thường.
vd:
Câu truy vấn union select all 1,2,3,4,5,6,7-- : sẽ không vượt qua
Nhưng Câu truy vấn uNioN select all 1,2,3,4,5,6,7-- : sẽ vượt qua
với
c. Nên dùng ký tự thay thế trong hàm str_ireplace
vd:
Câu truy vấn union select all 1,2,3,4,5,6,7-- : sẽ không vượt qua
Nhưng Câu truy vấn uniUNIONon select all 1,2,3,4,5,6,7-- : sẽ vượt qua
Vì thế, nên dùng
3. Ép kiểu
Một cách khác khá an toàn là ép kiểu. Cách này không xuất thông báo lỗi, giữ cho website an toàn mà vẫn “đẹp”
1. Lọc dấu nháy “’”
function filter1( input )
input = replace(input, "'", "''")
filter1 = input
end function
2. 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. whitelist
function whitelist( input )
good_password_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW XYZ0123456789"
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
B- Trên ngôn 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
if(isset($_POST['username']) && isset($_POST['passwd']) ){
$username = $_POST['username'];
$passwd = $_POST['passwd'];
Fix:
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 được thể hiện code như sau:
$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";
Lưu ý :
a. Từ khóa union trên là đơn cử, bạn có thể dùng mãng. Mãng này chứa các giá trị blacklist
b. hàm str_replace cũng tương tự như hàm str_ireplacc, nhưng ở đây tôi dung hàm str_ireplace vì có ưu điểm là không phân biệt ký tự hoa, thường.
vd:
$id = str_replace('union','*',$_GET['id']);
Câu truy vấn union select all 1,2,3,4,5,6,7-- : sẽ không vượt qua
Nhưng Câu truy vấn uNioN select all 1,2,3,4,5,6,7-- : sẽ vượt qua
với
bạn an toàn$id = str_ireplace('union','*',$_GET['id']);
c. Nên dùng ký tự thay thế trong hàm str_ireplace
vd:
$id = str_replace('union','',$_GET['id']);
Câu truy vấn union select all 1,2,3,4,5,6,7-- : sẽ không vượt qua
Nhưng Câu truy vấn uniUNIONon select all 1,2,3,4,5,6,7-- : sẽ vượt qua
Vì thế, nên dùng
$id = str_replace('union','*',$_GET['id']);
3. Ép kiểu
Một cách khác khá an toàn là ép kiểu. Cách này không xuất thông báo lỗi, giữ cho website an toàn mà vẫn “đẹp”
$id = (int)$_GET['id'];
//$id = $_GET['id'];
if(!isset($id))
$id=1;
$sql = "SELECT * FROM products WHERE id=$id limit 0,1";