คำสั่งนี้เอาไว้ทำอะไรครับ ตั้งไว้ก่อนเดียวลืมถามอีก อิอิอิอิ คำสั่ง mysql_real_escape_string เอาไว้ทำอะไรหรือครับ
ป้องกันผู้ใช้ใส่คำสั่ง sql มาน่ะ
$id = $_GET['id'];
$query = "UPDATE tb SET name='example' WHERE id='$id'";
แบบนี้ถ้า php config magic_quotes_gpc off ก็โดน sql injection ได้ง่าย
อย่างเช่น $id มีค่า ' OR ''=' ก็จะได้ query
UPDATE tb SET name='example' WHERE id='' OR ''='' ซึ่งเงื่อนไข where เป็นจริงเสมอทำให้ข้อมูลเสียหายหมด
วิธีป้องกันก็ใช้คำสั่ง
$id = mysql_real_escape_string($_GET['id']);
หรือ
$id = (int)$_GET['id'];
เพื่อแปลงค่า string ไม่ให้เป็นคำสั่ง sql
Date :
2009-10-31 06:24:12
By :
num
ถ้าเป็น method post ละครับพี่ หนุ่ม สามารถใช้ sql injection ได้หรือเปล่าครับ
ถ้าได้ ผมจะได้กัน ไว้ครับ
Date :
2009-10-31 07:38:23
By :
DownsTream
ได้หมดครับ ขอให้เป็นการรับข้อมูล
Date :
2009-10-31 10:20:17
By :
danya
มีข้อมูลเพิ่มเติม และรายละเอียดที่ครบถ้วนเกี่ยวกับ injection Injection Flaws หรือ SQL Injection หรือ วิธีการทำ SQL injection รวมไปถึงเรียนรู้วิธีการเจาะระบบ Web Application ของแฮกเกอร์และวิธีการป้องกันอย่างได้ผล ดีจิงๆ คับ เลยนำมาฝากกันคับ
http://gotoknow.org/blog/itsec/132033
Date :
2009-10-31 11:12:19
By :
gofgof
แสดงว่าเวลาเราไปฝากข้อมูลไว้ที่ webserver แล้วหรือเช่าพื้นที่ต่างๆเขาก็มีการป้องกันตรงนี้ไว้ให้เราส่วนหนึ่งหรือเปล่าครับแล้วเราก็มาเขียนสคริปดักอีกวิธีหนึ่งด้วยหรือเปล่าครับ
Date :
2009-10-31 11:21:53
By :
somparn
แหล่ม แค่เอาไปครอบตัวแปร จะเอาไปใช้เลยจันทร์นี้เห่อๆ ขอบคุณครับ
Date :
2009-10-31 11:25:11
By :
peterxp
อ่านแล้ว งงๆ ไม่ค่อยเข้าใจอ่ะครับ
ใช้กับเหตุการณ์ไหนบ้างครับ
Date :
2009-10-31 15:20:32
By :
oasiis
ใช้ทุกครั้งที่ใช้ mysql_query แล้วมีการส่งตัวแปรครับ
Date :
2009-10-31 15:52:34
By :
num
ขอถามเพิ่มนะครับ ที่ว่า ให้เป็นเพื่อแปลงค่า string ไม่ให้เป็นคำสั่ง sql
ปกติถ้าเราส่งค่าไปโดยเป็น คำสั่ง sql มันจะเปลี่ยนค่าไม่ให้เป็นคำสั่ง sql แล้วมันจะเปลี่ยนเป็นยังไง คือผม นัง งง อยู่ครับ ในเมื่อ ถ้ป็น คำสั่ง sql มันก็เป็น ลักษณะของ ตัวอักษร หรือ ว่า ถ้าใส่ตัวนี้เข้าไป ต่อให้เป็นคำสั่ง sql ยังไง ก็ถือว่าเป็นแค่ตัวอักษรธรรมดา แล้วจะไม่มีการนำไปประมาลผลต่างๆ ใช่หรือไม่ครับ
ถ้าผมถามอะไร งง ก็ รบกวนบอกครับ จะได้ถามไหม่
Date :
2009-10-31 18:14:20
By :
tingtongkub
ช่วยตอบให้ละกัน ง่ายๆ
select * from tbl_anme where user='$_GET[user]' and password='$_GET[password]'
และ สมมติในฐานข้อมูล user= test1 และ password=1111
select * from tbl_name where user='test1 ' and password='1111 '
เมื่อ$_GET[user] เท่ากับ test1 และ $_GET[password] เท่ากับ 1111 ก็จะเป็นจริงก็จะแสดงข้อมูลได้
แต่ว่าถ้าเขียนยังงี้ล่ะ
select * from tbl_name where user='test1 ' and password='x' or '1 '
เมื่อ $_GET[user] เท่ากับ test1 และ $_GET[password] เท่ากับ x' or '1
เห็นว่า password ไม่ถูกมันไม่ควรจะแสดงข้อมูลออกมาใช่ป่ะครับ แต่ว่ามันไม่ใช่ยังงั้นมันกลับแสดงข้อมูลออกมาเพราะ or 1 นี้แหล่ะครับทำให้มันแสดงข้อมูลออกมา
มันมีตัวอย่างอื่นๆอีกมากมายสงผลกระทบการฐานข้อมูลเยอะครับ ถ้ามีคนใช้ delete ละจะเกิดความเสียหายขนาดไหน
ปล.เรื่องพวกนี้ผมเองก็เพิ่งจะรู้จากที่บอร์ดนี้เหมือนกัน
Date :
2009-10-31 18:48:27
By :
xbeginner01
อ๋อ พอเข้าใจแล้วครับ ขอบคุณมากๆเลยครับ
ถามอีกข้อนะครับ กรณีที่เป็นการ search หาข้อมูลธรรมดา เช่น ถ้าเราทำฟอมร์ให้กรอกข้อมูลเพื่อค้นหาข้อมูล จาก ตาราง ถ้าเราไม่ได้ใช้ วิธีที่ แนะนำมา แต่ใช้ไห้ค้นหาข้อมูลธรรมดา เขาสามารถลบข้อมูลเราได้หรือไม่ครับ หรือว่า ได้เหมือนกัน
Date :
2009-10-31 19:39:42
By :
tingtongkub
พี่ num ครับ สงสัยครับ
mysql_real_escape_string() มันเหมือนกับ addslashes() เปล่าครับ
พอดีผมลองecho ก่อน query มันเหมือนกับใส่ \ ให้กับ ' " \ หลักการเดียวกับ addslashes() เลย
มันมีไรพิเศษกว่า addslashes() เปล่าครับ
Date :
2009-10-31 19:59:24
By :
xbeginner01
ขอบคุณพี่ num ครับ เข้าใจแหล่ะ
Date :
2009-10-31 20:18:10
By :
xbeginner01
ปรกติมัน escape ให้อยู่แล้ว จะเอาออก ใน php6 ดังนั้นตอนนี้ผมยังใช้ gpc แบบ on อยู่
แต่เฟรมเวอร์คที่กำลังศึกษาอยู่มัน เอา escape string ออกให้อัตโนมัติ ยังไม่ได้ศึกษาพวก ORM
Date :
2009-10-31 20:38:35
By :
pjgunner
Load balance : Server 00