การส่งข้อมูลแบบ GET สามารถเป็นช่องโหว่ของ sql injection ได้หรือเปล่าครับ
ก่อนอ่านค่าใช้พวก mysql_real_escape_string() ทำการครอบค่าตัวแปรก่อนครับ
Date :
2013-06-10 11:41:20
By :
mr.win
แบบนี้โดนแน่นอนครับ ลองดูตัวอย่างนี้ครับ
Code (PHP)
<?php
// Connect
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($_GET["user"]),
mysql_real_escape_string($_GET["password"]));
?>
Date :
2013-06-10 12:17:03
By :
mr.win
ถ้าจากโค๊ดนี้
http://mysite.com/money_tran.php?total=10000&tran_id=23dDFGD23SDg
คือคุณรู้ว่า total=10000 แต่ไม่รู้ว่า tran_id=23dDFGD23SDg
แล้วคุณจะมีวิธี hack เว็บนี้ได้มั้ยครับ
เพราะจาก sql ผม กำหนดไว้แล้วว่า select * From money Where total_column= GET[total] & tran_id_column = GET[tran_id]
ซึ่งถ้ารู้แต่ total=10000 ก็จะไม่ผ่าน condition where ขอท่านผู้รู้ตอบที
Date :
2013-06-10 14:41:28
By :
peap
ถ้าคุณไม่ escape ค่า มัน hack ได้หมดล่ะครับ
อ่านบทความหรือยังล่ะครับ ผมอธิบายไว้หมดแล้ว
select * From money Where total_column= '$_GET[total]' AND tran_id_column = '$_GET[tran_id]'
สมมติพิมพ์ค่าของ total เป็นอะไรก็ได้
และพิมพ์ค่าของ tran_id เป็น ' OR TRUE <> '
จะได้ query
select * From money Where total_column= '123' AND tran_id_column = '' OR TRUE <> ''
ซึ่งทำให้สีแดงไม่มีความหมายเลยครับ พอมาเจอ OR เงื่อนไขจะเป็นจริงหมดครับ
ประวัติการแก้ไข 2013-06-10 15:15:12
Date :
2013-06-10 15:14:39
By :
cookiephp
ฟอร์มที่รับค่าลงฐานข้อมูล หรือ ค่าที่ส่งไปเปรียบเทียบในฐานข้อมูล ไม่ว่า GET หรือ POST ควรที่จะมีการกรอง อย่างน้อยที่สุดก็ mysql_real_escape_string() ก็จะช่วยในเรื่อง sql injection ได้ แต่แค่นั้นใช่ว่าจะปลอดภัยสักที่เดียว จะให้ปลอดภัยจริงๆ ควรมีการตัด tag html (strip_tags())ให้หมด หรือไม่ก็ htmlspecialchars() แปลง tag html ก่อน ไม่งั้นจะโดนใช้ javascript (Cross Site Scripting)แฮกเอา session ที่ผ่านการล๊อกอินแล้ว มาสวมรอยเข้าระบบได้
วิธีง่ายๆลองแฮกเว็บตัวเอง แค่ใส่ "<!--" ในฟอร์ม หรือ "<script>alert(5555)</script>" แล้วบันทึก ดึงข้อมูลออกมาดูผลเป็นไง
เว็บที่เขียนเองส่วนใหญ่กันแต่ sql injection แต่ไม่ได้กัน Cross Site Scripting คนส่วนใหญ่ที่ถามๆกันมาในนี้(thaicreate) ไม่ได้กันอะไรเลย
Date :
2013-06-10 16:26:27
By :
randOmizE
ผมก็โดนเล่นบ่อย ๆ อยู่ครับ ตอนนี้ก้ยังตามแก้ไม่หมด แฮะ ๆ
Date :
2013-06-10 16:40:36
By :
mr.win
แต่ถ้ามองอีกมุม ในเว็บพวกขายสินค้่าที่ต้องมีสัญลักษณ์ อย่างเช่น หน้าจอกว้าง 12 " ( ตรงเครื่องหมายแสดงหน่วยนิ้ว ) ก็ไม่สามารถ insert เข้าไปได้น่ะสิครับ เพราะว่าเราทำการตัด tag html ไปแล้ว
Date :
2013-06-11 09:24:03
By :
peap
ตัด tag มันจะตัด tag้ html เช่น <p> <div> พูดง่ายๆคือมันจะตัดอะไรที่อยู่ในรูปแบบ '<xxx>' หมด ส่วน single quote (') double quote(") ใช้ htmlspecialchars($str,ENT_QUOTES) แปลง เวลา view source (") จะเป็น " แต่เวลาแสดงผลมันก็ยังเป็น " เหมือนเดิม หรือ ไม่งั้น single quote (') double quote(") ก็จัดการด้วย mysql_real_ecape_string($str)
ทุกอย่างใช้ได้เหมือนเดิม เพียงแต่ tag จะถูกตัดไปเท่านั้นเอง
Date :
2013-06-11 12:55:06
By :
randOmizE
ตอบความคิดเห็นที่ : 12 เขียนโดย : randOmizE เมื่อวันที่ 2013-06-11 12:55:06
รายละเอียดของการตอบ ::
คือตั้งแต่อ่าน comment นะครับ ผมมีคำถาม 2 ข้อครับ
ข้อ 1. ผมทำการกรอกข้อความ "<script>alert(5555)</script>" ลงไปใน text area ซึ่งทำมาจาก ckeditor แล้วก็ทำการ insert แบบธรรมดา
แล้วผมก็เข้าไปดูหน้าที่แสดงข้อความที่ insert ไปเมื่อกี้ ปรากฏว่าเกิดการ alert ครับ ผมจะแก้ไขไงดี
( ผม echo ข้อความจาก ckeditor เป็น
Code
<?=database::add_special_chars($description);?>
)
ข้อ 2.
จาก url : www.mysite.com/data.php?user=xxxx&id=yyyy
ปกติผมจะ select ข้อมูลใน mysql ด้วยโค๊ดนี้ครับ
Code
$sql = "SELECT * FROM mydata WHERE name = '".$_GET["user"]."' AND account = '".$_GET["id"]."' ";
ซึ่งท่านๆบอกว่าอาจเกิดการ sql injection ได้ ดังนั้นผมจึงเปลี่ยนโค๊ดของผมใหม่ให้เป็นดังนี้
Code
$user = htmlspecialchars($_GET["user"]);
$id = htmlspecialchars($_GET["id"]);
$sql = "SELECT * FROM mydata WHERE name = '$user' AND account = '$id' ";
จะสามารถป้องกันการ sql injection ได้หรือยังครับ
Date :
2013-06-11 16:44:30
By :
peap
htmlspecialchars($str) แบบนี้ มันจะแปลงแค่ double quote(") แต่ single quote(') ยังอยู่
htmlspecialchars($str,ENT_QUOTES) แบบนี้จะแปลงทั้ง double quote(") และ single quote(') รวมไปถึงพวก tag html
แบบนี้ป้องกัน sql injection ได้ แต่ว่า ถ้าตอนแสดงผล ใช้ htmlspecialchars_decode($str,ENT_QUOTES) แปลงกลับมาใหม่ก็ยังเสี่ยง XSS อยู่ดี แต่ถ้าไม่แปลงกลับมาก็ปลอดภัยครับ
Date :
2013-06-11 17:10:36
By :
randOmizE
ใน php 5+ ตัว magic_quotes_gpc เปิดใช้อยู่แล้ว ซึ่งจะใส่ \ ให้ ถ้ามี single quote มันช่วยป้องกัน injection เบื้องต้นได้อยู่แล้ว
ส่วน htmlspecialchars($str,ENT_QUOTES) จะช่วยให้อุ่นใจมากขึ้น
ลองทดสอบดูครับ ไม่ต้องใช้ htmlspecialchars($str,ENT_QUOTES) กับใช้ htmlspecialchars($str,ENT_QUOTES)
มาทดลองใส่แบบนี้เข้าไป
Code (PHP)
<script>
alert(55555);
alert('5555555');
</script>
ถ้าใช้ htmlspecialchars($str,ENT_QUOTES) เราใส่ไปยังไรมันจะออกมาอย่างนั้น แต่ไม่ใช้ htmlspecialchars($str,ENT_QUOTES)
มันแสดงผลออกมาจะ alert(55555) แต่ alert('5555555') จะไม่ได้ เพราะถูก magic_quotes_gpc ใส่ \' กลายเป็น alert(\'5555555\')ไป
แต่ถ้า magic_quotes_gpc ปิด มันจะได้ทั้ง 2
Date :
2013-06-11 17:25:57
By :
randOmizE
ได้ครับ
Date :
2013-06-11 18:14:26
By :
randOmizE
สุดยอดครับท่าน แล้วอย่างนี้จะมีใครมาทำร้ายเว็บผมได้อีกมั้ยครัุบท่าน
Date :
2013-06-11 18:45:09
By :
peap
มันจะทำร้ายตัวมันเองแหละ
Date :
2013-06-11 19:09:01
By :
randOmizE
มันก็จริงอย่างนั้นนะครับ
Date :
2013-06-11 20:45:20
By :
randOmizE
ถูกต้องครับ
Date :
2013-06-11 21:16:16
By :
randOmizE
เข้ามาเก็บเกี่ยวความรู้ครับ ชอบกระทู้แนวนี้มากๆ
Date :
2013-06-11 23:43:38
By :
{Cyberman}
Date :
2013-06-12 05:57:17
By :
mr.win
ปลอดภัยสุดหรือเปล่าผมไม่รู้ อาจจะมีอะไรที่ปลอดภัยกว่า
แต่ที่แน่ๆ htmlspecialchars() นี่ไม่ใช่แน่นอน ผิดจุดประสงค์อย่างแรง ไม่เคยเห็นที่ไหนบอกให้ใช้เพื่อการนี้ครับ
Date :
2013-06-12 10:44:53
By :
cookiephp
พอสรุปคร่าวๆคือ ใช้ mysql_real_escape_string() ตอน insert ป้องกัน sql injection แล้วใช้ htmlspecialchars() ตอนแสดงผล ป้องกัน xss
Date :
2013-06-12 12:22:52
By :
randOmizE
พอสรุปคร่าวๆคือ ใช้ mysql_real_escape_string() ตอน insert ป้องกัน sql injection แล้วใช้ htmlspecialchars() ตอนแสดงผล ป้องกัน xss อ่านมาตั้งแต่ต้นมาเข้าใจตอนสรุปนี้แระครับ
Date :
2015-08-24 18:16:14
By :
arm
ขอบคุณสำหรับความรู้ php ดีๆ
ติดตาม thaicreate.com ตลอดครับผม
echo "ขอบคุณ". thaicreate.com ."และทุกท่านครับ";
Date :
2019-07-19 09:33:02
By :
คุณ เด่น มือใหม่
Load balance : Server 02