Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Kỹ thuật tấn công sql injection và cách phòng chống trong php

1 651 vues

Publié le

tài liệu

Publié dans : Logiciels
  • Identifiez-vous pour voir les commentaires

  • Soyez le premier à aimer ceci

Kỹ thuật tấn công sql injection và cách phòng chống trong php

  1. 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. 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. 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.đượ

×