Triển khai các chính sách và tiêu chuẩn trong thực tiễn
Kỹ thuật tấn công sql injection và cách phòng chống trong php
1. k thu t t n công SQL Injection và cáchỹ ậ ấ
phòng ch ng trong phpố
AUTHOR: THEHALFHEART PUBLIC DATE: 14/08/2014 CATEGORY: PHP VIEWS: 511
bài tr c chúng ta ã c tìm hi u cáchƠ ướ đ đượ ể phòng ch ng CSRFố , v y thì trong bài này ta s tìmậ ẽ
hi u thêm m t k thu t khác c ng r t hay s d ng t n công vào nh ngể ộ ỹ ậ ũ ấ ử ụ để ấ ữ website c a nh ng tayủ ữ
ngh thi u kinh nghi m l p trình, ó làề ế ệ ậ đ k thu t t n công SQL Injectionỹ ậ ấ .
1. SQL Injection là gì?
SQL Injection là m t k thu t l i d ng nh ng l h ng v câu truy v n l y d li u c a nh ngộ ỹ ậ ợ ụ ữ ỗ ổ ề ấ ấ ữ ệ ủ ữ
website không an toàn trên web, âylà m t k thu t t n công r t ph bi n và s thành công c ađ ộ ỹ ậ ấ ấ ổ ế ự ủ
nó c ng t ng i cao. Tuy nhiên vào nh ng n m tr l i âythì xu t hi n nhi u Framwork nênnóũ ươ đố ữ ă ở ạ đ ấ ệ ề
gi m h n, vì cácFW ãh tr r t t t vi c ch ng l iả ẳ đ ỗ ợ ấ ố ệ ố ạ hack SQL Injection này.
Ch c h n các b n ã bi t mô hình ho t ng c a website r i nh ? Khi m t request c g i tắ ẳ ạ đ ế ạ độ ủ ồ ỉ ộ đượ ử ừ
client thì ngôn ng SERVER nh PHP s l y các thông tin t request ó. Nh ng b n thân nóữ ư ẽ ấ ừ đ ư ả
không h phát hi n ra nh ng thông tin ó có ch a nh ng câuSQL c, vì th công vi c này taề ệ ữ đ ứ ữ độ ế ệ
ph i trách nhi mả đổ ệ t i kinh nghi m c a l p trình viên.ớ ệ ủ ậ
Ví d :ụ Gi s tôi có m t trang ng nh p v i hai thông tin làả ử ộ đă ậ ớ tên ng nh pđă ậ và m t kh uậ ẩ .
Và o n code x lý t n công sql injectionđ ạ ử ấ c a tôi có d ng nh sau:ủ ạ ư
1
2
3
4
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "select count(*) from user where username = '$username' AND password = '$pa
Tr ng h p 1:ườ ợ Bâygi tôi nh pờ ậ username = thehalfheart và password = matkhau thì câutruy
v n s là:ấ ẽ
select count(*) from user where username = 'thehalfheart AND password = 'matkhau'
2. Tr ng h p 2: Bây gi tôi nh pườ ợ ờ ậ username = somename và password = something' OR '1. Như
v y câusql s là:ậ ẽ
SELECT * FROM cms_user WHERE user_username = 'thehalfheart' AND user_password =
'something' OR '1'
Ch y câutruy v n này lênthì k t qu nó tr v là danh sách user nênn u code cùicùi thì login cạ ấ ế ả ả ề ế đượ
luôn.
Trên âylà m t ví d i n hình thôi, ch th c t thì hacker còn r t nhi u m u m o khác. Tuy nhiênđ ộ ụ đ ể ứ ự ế ấ ề ư ẹ
chung quy l i v i k thu t t n công SQL Injection ta v n có th không ch c nó.ạ ớ ỹ ậ ấ ẫ ể ế đượ
2. Phòng ch ng SQL Injectionố
V i kinh nghi m c a mình thì th t s ch a phântích sâuvào k thu t này, tuy nhiênmình c ng bi tớ ệ ủ ậ ự ư ỹ ậ ũ ế
chút ít kinh nghi m có th ch ng l i k thu t này.ệ để ể ố ạ ỹ ậ
2.1. Nh n d li u ki u INTậ ữ ệ ể
Khi b n nh n d li u ID trênURL thì cách t t nh t b n nênạ ậ ữ ệ ố ấ ạ ép ki uể , chuy n nó v ki u s INT, sauể ề ể ố
ó chuy n v ki u STRING (n u c n thi t).đ ể ề ể ế ầ ế
Ví d : tôi có url nh sau: domain.com/detail.php?id=12ụ ư
1 $id = isset($_GET['id']) ? (string)(int)$_GET['id'] : false;
Nh v y thì cho dù ta nh p vào k t gì i n a u s b clear ra kh i h t. Ho c ta có th dùngư ậ ậ ỳ ự đ ữ đề ẽ ị ỏ ế ặ ể
cách d c b ng cách dùngướ ằ hàm preg_replace trong PHP xóa i nh ng ký t không ph i là chđể đ ữ ự ả ữ
s .ố
1
2
$id = isset($_GET['id']) ? $_GET['id'] : false;
$id = str_replace('/[^0-9]/', '', $id);
R t n gi n, tuy nhiênmình khuy n khích nêndùng ép ki u trong PHP, vì nó n gi n.ấ đơ ả ế ể đơ ả
2.2 Vi t l i ng d n có thế ạ đườ ẫ ể ch ng SQL Injectionố
V n này có v h i l nh ng b n thânmình th y r t úng. Khi b n vi t l i ng d n dùtrên hấ đề ẻ ơ ạ ư ả ấ ấ đ ạ ế ạ đườ ẫ ệ
th ng route c aố ủ FW hay dù trên file .htaccess thì hãy fix chính xác o n mã Regular Expressionđ ạ
(Tham kh oả Regular Expression c n b nă ả ).
Ví d :ụ Tôi có ng d n sau khi rewirte là nh sau: domain.com/hoc-lap-trinh-mien-phi-tai-đườ ẫ ư
freetuts.html thì o n Regex tôi s vi t là:đ ạ ẽ ế
/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+).html/ . Thay vì nh v y thì tôi s vi t chính xácư ậ ẽ ế /([a-
zA-Z0-9-]+)/([0-9]).html/ thì s t t h n. Và ng quên là c ng n i ng link g c c a nóẽ ố ơ đừ ũ ẩ đ đườ ố ủ
nhé.
2.3 S d ng hàm sprintf vàử ụ
mysql_real_escape_string xác nh ki u d li u chođể đị ể ữ ệ
câutruy v n.ấ
3. Nh b n bi t hàmư ạ ế sprintf g m có hai tham s tr lên, tham s th nh t là chu i và trong ó cóồ ố ở ố ứ ấ ỗ đ
ch a m t o n Regex thay th , tham s th 2 tr i là các giátr s c thay th t ng ng.ứ ộ đ ạ để ế ố ứ ở đ ị ẽ đượ ế ươ ứ
Giátr rápvào s c convert phùh p r i m i rap vàoị ẽ đượ ợ ồ ớ
Ví d :ụ
1
2
3
$webname = 'freetuts.net';
$title = 'học lập trình miễn phí';
echo sprintf('Website %s laf website %s', $webname, $title);
K t qu in ra là:ế ả Website freetuts.net là website h c l p trình mi n phíọ ậ ễ .
N u b n ch a bi t v hàm sprintf thì vàoế ạ ư ế ề link này c nhé.đọ
Nh b n bi t hàmư ạ ế mysql_real_escape_string có nhi m v s chuy n m t chu i thành chu iệ ụ ẽ ể ộ ỗ ỗ
query an toàn, nênta s k t h p nó gánvào câutruy v n. Ví d :ẽ ế ợ để ấ ụ
1
2
$sql = "SELECT * FROM member WHERE username = '%s' AND password = '%s'";
echo sprintf($sql, mysql_real_escape_string("thehalfheart"), mysql_real_escape_str
K t qu là:ế ả SELECT * FROM member WHERE username = 'thehalfheart' AND password =
'matkhau'.
ang C p Nh t Thêm...Đ ậ ậ
3. L i k tờ ế
Th t s thì k thu t này r t nhi u và dài, ki n th c c a mình ch mang t m c n b n nên mình chậ ự ỹ ậ ấ ề ế ứ ủ ỉ ầ ă ả ỉ
share c c n b n. N u b n mu n nâng cao thì có th c thêm tài li u trên m ng, ch y u làđượ ă ả ế ạ ố ể đọ ệ ạ ủ ế
ti ng anh. Tuy nhiên th t s khi i làm b n nên s d ng Framwork, vì FW a h tr r t t t nh ngế ậ ự đ ạ ử ụ đ ỗ ợ ấ ố ữ
ki u t n công website thông d ng hi n nay r i, b n thân chúng ta không th nào tìm hi u sâuể ấ ụ ệ ồ ả ể ể
c.đượ