อยากรู้วิธีป้องกัน sql injection

เริ่มโดย sutiwat, 13 ธันวาคม 2009, 22:50:07

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

sutiwat

อยากรู้วิธีป้องกัน sql injection ผมพัฒนาแล้วมันมีบัก นี้อะครับอย่างรู้ว่าจะมีวิธีป้องกันยังไง :wanwan014:
[direct=http://board.yudeehome.com/]ฟรีประกาศ ซื้อ-ขาย-เช่า อสังหาริมทรัพย์[/direct]
[direct=http://hd108online.blogspot.com/]ดูหนังออนไลฯ์ฟรี[/direct]

iah(carus)

ทำความสะอาดตัวแปรที่่รับมาจากผู้ใช้ก่อนครับ
เ่ช่น เปลี่ยน ' (single quotes) ให้เป็น \'

เมื่อ code sql ที่จะ run สะอาดแล้วก็จะปลอดภัยครับ

mixture

ใช้ mysql_real_escape_string() กรองค่าที่รับจากฟอร์มก่อน แล้วค่อยนำไปใส่ในคิวรี่ครับ

http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php
[direct=http://moomak.wordpress.com]จิ[/direct]

fernsterno

ได้ความรู้ครับ กำลังอยู่ในสายนี้เลย
นายเฟิร์น นักเขียนอิสระ
[direct=https://benjapornchitathon.wixsite.com/owtb/blog]PET Cute[/direct]
[direct=https://www.precision-vet.com/2025/04/29/therole-stem-cells/]ชะลอวัย สุนัข[/direct]
[direct=https://btwo4.wordpress.com/]btwo pet cute[/direct]
[direct=https://petguriko.blogspot.com/]Stem cells สัตว์เลี้ยง[/direct]
[direct=https://medium.com/@duck_123]Uma[/direct]

ohmohm


EThaiZone

อ้างถึงจาก: ohmohm ใน 14 ธันวาคม 2009, 22:43:04
Be aware that "sanitizing the input" doesn't mean merely "remove the quotes"
http://unixwiz.net/techtips/sql-injection.html
ตามนั้นเลย ยกตัวอย่าง query เป็นแบบนี้

select * from student where name='bob'

ค่าที่จะถูกโยนแทนที่ bob ก็ควรต้องทำการกันเปลี่ยน ' ที่อาจมีให้กลายเป็น \'
สมมุติค่าจะโดนโยนไปเป็น parent's john ก็ต้องเปลี่ยนเป็น parent\'s john

ตรงนี้ต้องระวังกันด้วย สามารถใช้ str_replace ธรรมดา เพื่อจัดการตรงนี้ได้ครับ

pomchai


zoomman

เรื่องนี้สำคัญครับ
คุณต้องป้องกันเครื่องหมายพิเศษที่ส่งผลต่อ db โดยตรงครับ
เพราะแค่ ' หรือ " ก็สามารถเอา password admin คุณไปได้
ลายเซ็น

ball6847

#8
ใช้ mysql_real_escape_string ตามที่พี่ mixture  บอกจะช่วยได้มากกว่าเรื่อง sql injection นะคับ เรื่องของเรื่องคือการ escape character ให้เข้ากับ encoding ของ database connection คับ แต่ว่าจะทำงานช้ากว่า addslashes อยู่หน่อยนึง

ผมเสริมจากที่พี่ mixture บอกหน่อยนึงคือไม่ใช่แค่การรับค่าจากฟอร์ม เพราะ user input นั้นนอกจาก GET หรือ POST แล้ว ยังมี COOKIE ซึ่งไม่ได้มากับฟอร์มด้วยคับ

อีกเรื่องคือถ้าข้อมูลเป็นตัวเลขแน่นอน ไม่จำเป็นต้องทำการ escape ใดๆเลยก็ได้ สามารถใช้ type casting ให้เป็นตัวเลขแล้วนำไปใช้ได้เลย เช่น


if (empty($_GET['user_id']) OR ! $user_id = (int) $_GET['user_id'])
{
     die(
'ค่า User ID ต้องมีค่ามากกว่า 0 ขึ้นไป');
}

$sql 'SELECT * FROM users WHERE user_id=' $user_id;


ปล แต่เอาเข้าจริงๆแล้ว ตัวผมเองผมไม่แคร์ว่าข้อมูลจะมาจากไหน ก่อนสร้าง query ผมยังงัยก็ใช้ mysql_real_escape_string กับค่าที่เป็น string ตลอดแหละ แถมถ้าใช้ Codeigniter ผมแทบไม่แคร์เรื่อง escape เลย เหอๆ
We use Ubuntu.

[direct=http://ng-seo.sourcelab.xyz/]AngularJS SEO Experimental[/direct]