ต่อเนื่อง และเพิ่มเติมจากเนื้อหาบทความก่อนหน้า
ป้องกัน SQL Injection ด้วย php ฟังก์ชั่นอย่างง่าย ตอนที่ 1
https://www.ninenik.com/content.php?arti_id=602 via @ninenik
php ฟังก์ชั่น
ให้สร้างไฟล์ชื่อ sql_injection.php ไว้สำหรับ include ไฟล์ที่ต้องการใช้งาน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | function real_esc( $array , $int =0){ if ( count ( $array )>0){ if ( is_array ( $array )){ foreach ( $array as $key => $value ){ if (@ is_array ( $array [ $key ])){ foreach ( $array [ $key ] as $key_2 => $value_2 ){ if ( $_SERVER [ 'REQUEST_METHOD' ]== 'GET' ){ if (get_magic_quotes_gpc()){ $_GET [ $key ][ $key_2 ]=trim( "$value_2" ); } else { $_GET [ $key ][ $key_2 ]=@mysql_real_escape_string(trim( "$value_2" )); } $_GET [ $key ][ $key_2 ]=( $int ==1)?(int) $_GET [ $key ][ $key_2 ]: $_GET [ $key ][ $key_2 ]; } else { if (get_magic_quotes_gpc()){ $_POST [ $key ][ $key_2 ]=trim( "$value_2" ); } else { $_POST [ $key ][ $key_2 ]=@mysql_real_escape_string(trim( "$value_2" )); } $_POST [ $key ][ $key_2 ]=( $int ==1)?(int) $_POST [ $key ][ $key_2 ]: $_POST [ $key ][ $key_2 ]; } } } else { if ( $_SERVER [ 'REQUEST_METHOD' ]== 'GET' ){ if (get_magic_quotes_gpc()){ $_GET [ $key ]=trim( "$value" ); } else { $_GET [ $key ]=@mysql_real_escape_string(trim( "$value" )); } $_GET [ $key ]=( $int ==1)?(int) $_GET [ $key ]: $_GET [ $key ]; } else { if (get_magic_quotes_gpc()){ $_POST [ $key ]=trim( "$value" ); } else { $_POST [ $key ]=@mysql_real_escape_string(trim( "$value" )); } $_POST [ $key ]=( $int ==1)?(int) $_POST [ $key ]: $_POST [ $key ]; } } } } else { $value = $array ; if ( $_SERVER [ 'REQUEST_METHOD' ]== 'GET' ){ $getVars = array_keys ( $_GET ); $key = $getVars [0]; if (get_magic_quotes_gpc()){ $_GET [ $key ]=trim( "$value" ); } else { $_GET [ $key ]=@mysql_real_escape_string(trim( "$value" )); } $_GET [ $key ]=( $int ==1)?(int) $_GET [ $key ]: $_GET [ $key ]; } else { $getVars = array_keys ( $_POST ); $key = $getVars [0]; if (get_magic_quotes_gpc()){ $_POST [ $key ]=trim( "$value" ); } else { $_POST [ $key ]=@mysql_real_escape_string(trim( "$value" )); } $_POST [ $key ]=( $int ==1)?(int) $_POST [ $key ]: $_POST [ $key ]; } } } } |
การใช้งาน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | real_esc( $_POST ); // จัดการรายการที่ส่งแบบ POST ทั้งหมด ก่อนนำไปใช้งานในคำสั่ง sql real_esc( $_POST ,1); // จัดการรายการที่ส่งแบบ POST ทั้งหมด ก่อนนำไปใช้งานในคำสั่ง sql // และแปลงให้เป็นตัวเลขเท่านั้น ใช้สำหรับกรณีเราส่งค่า id ที่เป็นตัวเลขทั้งหมด real_esc( $_POST [ 'member_id' ]); // จัดการรายการที่ส่งแบบ POST รายตัวแปร ก่อนนำไปใช้งานในคำสั่ง sql real_esc( $_POST [ 'member_id' ],1); // จัดการรายการที่ส่งแบบ POST รายตัวแปร ก่อนนำไปใช้งานในคำสั่ง sql // และแปลงให้เป็นตัวเลขเท่านั้น ใช้สำหรับกรณีเราส่งค่า id ที่เป็นตัวเลข real_esc( $_GET ); // จัดการรายการที่ส่งแบบ GET ทั้งหมด ก่อนนำไปใช้งานในคำสั่ง sql real_esc( $_GET ,1); // จัดการรายการที่ส่งแบบ GET ทั้งหมด ก่อนนำไปใช้งานในคำสั่ง sql // และแปลงให้เป็นตัวเลขเท่านั้น ใช้สำหรับกรณีเราส่งค่า id ที่เป็นตัวเลขทั้งหมด real_esc( $_GET [ 'member_id' ]); // จัดการรายการที่ส่งแบบ GET รายตัวแปร ก่อนนำไปใช้งานในคำสั่ง sql real_esc( $_GET [ 'member_id' ],1); // จัดการรายการที่ส่งแบบ GET รายตัวแปร ก่อนนำไปใช้งานในคำสั่ง sql // และแปลงให้เป็นตัวเลขเท่านั้น ใช้สำหรับกรณีเราส่งค่า id ที่เป็นตัวเลข |
ตัวอย่างการใช้งาน
กรณีสมมติเราไฟล์สำหรับเป็นฟอร์มล็อกอิน อย่างง่าย ชื่อ login.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <title>Test Login</title> </head> <body> <br> <form id= "myform1" name= "myform1" method= "post" action= "check_login.php" > Username:<br> <input type= "text" name= "username" id= "username" ><br> Password<br> <input type= "password" name= "password" id= "password" ><br> <br> <input type= "submit" value= "Login" name= "login" value= "Log In" > </form> </body> </html> |
ส่งค่าไปตรวจสอบที่ไฟล์ check_login.php
สมมติไฟล์เชื่อมต่อฐานข้อมูลเราชื่อ connect.php
1 2 3 4 5 6 7 8 9 10 | <?php session_start(); // สำหรับใช้งานตัวแปร SESSION header( "Content-type:text/html; charset=UTF-8" ); header( "Cache-Control: no-store, no-cache, must-revalidate" ); header( "Cache-Control: post-check=0, pre-check=0" , false); // เชื่อมต่อกับฐานข้อมูล $link =mysql_connect( "localhost" , "root" , "test" ); // เชื่อมต่อ Server mysql_select_db( "test" ); // ติดต่อฐานข้อมูล mysql_query( "set character set utf8" ); // กำหนดค่า character set ที่จะใช้แสดงผล ?> |
ไฟล์ check_login.php
ตัวอย่างด้านล่าง กำหนดการจัดเก็บรหัสผ่านแบบง่าย การตรวจสอบจริงไม่มีการเข้ารหัส
เพิ่มความปลอดภัย สามารถปรับแต่งและประยุกต์เข้ารหัส ก่อนบันทึกข้อมูลตามต้องการ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?php // เชื่อมต่อกับฐานข้อมูล include ( "connect.php" ); // เรียกไฟล์ ฟังก์ชั่น sql injection ที่เราสร้างมาใช้งาน include ( "sql_injection.php" ); ?> <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <title>Document</title> </head> <body> <?php if (isset( $_POST [ 'login' ]) && $_POST [ 'login' ]!= "" ){ real_esc( $_POST ); $q =" SELECT * FROM tbl_member WHERE member_name= '".$_POST[' username ']."' AND member_password= '".$_POST[' password ']."' AND member_type= '1' LIMIT 1 "; $qr =mysql_query( $q ); if ( $qr && mysql_num_rows( $qr )>0){ $rs =mysql_fetch_array( $qr ); echo $rs [ 'member_name' ]. "<br>" ; $_SESSION [ 'ses_member_id' ]= $rs [ 'member_id' ]; echo "Ok" ; } else { echo "No" ; } } ?> </body> </html> |