ต่อเนื่อง และเพิ่มเติมจากเนื้อหาบทความก่อนหน้า
ป้องกัน SQL Injection ด้วย php ฟังก์ชั่นอย่างง่าย ตอนที่ 1
https://www.ninenik.com/content.php?arti_id=602 via @ninenik
php ฟังก์ชั่น
ให้สร้างไฟล์ชื่อ sql_injection.php ไว้สำหรับ include ไฟล์ที่ต้องการใช้งาน
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]; } } } }
การใช้งาน
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
<!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
<?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
ตัวอย่างด้านล่าง กำหนดการจัดเก็บรหัสผ่านแบบง่าย การตรวจสอบจริงไม่มีการเข้ารหัส
เพิ่มความปลอดภัย สามารถปรับแต่งและประยุกต์เข้ารหัส ก่อนบันทึกข้อมูลตามต้องการ
<?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>