รณรงค์ เลิกใช้ mysql_query เปลี่ยนมาใช้ function อื่นแทน
mysql_query มัน hack กันยังไงครับ เผื่อจะเป็นความรู้ใหม่ๆ ด้วยครับ
Date :
2010-10-02 08:59:00
By :
webmaster
mysql_query('DELETE FROM table01 WHERE table_id='.$_GET['id']);
ใส่ ปกติ index.php?id=1 แต่ถ้าใส่ index.php?id=1+or+1%3D1
(index.php?id=1 or 1=1)
จะทำให้ลบข้อมูลทั้งตาราง
มันก็มีวิธีกันอยู่แต่ส่วนใหญ่จะไม่ใช้กันเพราะไม่มี function ที่ดี หรือเขียนยาวขึ้น
เลยแนะนำให้เลิกใช้ mysql_query รวมทั้งการ bind data โดยการต่อ string อย่างข้างต้นด้วย
Date :
2010-10-02 09:10:09
By :
:)
ใช้
Code (PHP)
mysql_real_escape_string()
ป้องกันสิครับ
http://php.net/manual/en/function.mysql-real-escape-string.php
Date :
2010-10-02 09:19:08
By :
mr.v
จะมีกี่คนที่ใช้อย่างถูกวิธีครับ อย่าง query
mysql_query('DELETE FROM table01 WHERE table_id='.$_GET['id']);
ต่อให้ใช้ mysql_real_escap_string ก็กัน hack ไม่ได้ เพราะไม่ได้ใช้ '' คร่อม $_GET['id'] ไว้ก่อน
และใน query จำนวนมากถ้าเขียนต่อ string หมดโอกาสผิดพลาดสูงมาก
ถ้าจะใช้ mysql_query ต่อไปก็ต้องเขียน function มาซ้อน mysql_query อีกที
ซึ่งคนที่จะเขียน function มาซ้อนได้ดีจริงๆ คนที่เริ่มต้นใหม่จะมีสักกี่คน
ผิดกับ mysqli ถ้าเข้าใจการ bind data ก็พอไม่ต้องกลัวการถูก hack แบบง่ายๆ อีก
Date :
2010-10-02 10:18:40
By :
:)
ผมว่าแล้วแต่คนนะ ใช้แบบเดิม หรือแบบใหม่ มันอาจต่างกันบ้าง
แต่ตามที่คุณบอก ฟีล id มันเป็น integer
(int) $_GET['id']
งั้นลองยกตัวอย่างการ bind parameter โดย ส่งสตริง '1 or 1=1' ให้ดูหน่อยครับ
Date :
2010-10-02 11:06:35
By :
pjgunner.com
ถ้าผมใช้ mysql4.0 แล้วผมจะใช้ mysqli ได้เปล่าหละ
แก้ไขหน่อยเน่อ
ทุกวันนี้ผมก็เห็นคนเริ่มมาใช้ mysqli กันเยอะ แต่ โดยส่วนใหญ่ ที่เห็นเอามาใช้งานกันจริง ๆ
ก็ยังใช้กับ mysql กันปกตินี่หละครับ
จะถามว่ามัน แฮกได้ง่ายหรืรอยาก อันนี้มันก็แล้วแต่ครับ ว่าแจ้คพอตจะไปเจอะเอาที่ใหน ..
อย่างเว็บนี้ ผมก็ค่อนข้างมั่นใจว่า ตาวิน ก็คงใช้ mysql คงยังไม่ได้ใช้ mysqli
มันแฮกไม่ง่ายเท่าใหร่นักหรอกครับผม
ลองเขียนแบบนี้ดูก่อนก็ได้ครับ
https://www.thaicreate.com/community/mysqlinjections-protech.html
ประวัติการแก้ไข 2010-10-02 11:23:52 2010-10-02 11:35:25
Date :
2010-10-02 11:19:18
By :
deawx
<?php
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');
/* check connection */
if (!$link) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$stmt = mysqli_prepare($link, "DELETE FROM table01 WHERE table_id=?");
mysqli_stmt_bind_param($stmt, 'd', $code);
$code = ''1 or 1=1'';
/* execute prepared statement */
mysqli_stmt_execute($stmt);
?>
http://www.php.net/manual/en/mysqli-stmt.bind-param.php
การ convert เป็น int เป็นวิธีที่ดีครับแต่ข้อมูล ที่ไม่ใช่ int จะต่อ string เอาโค้ดอ่านยากครับ
Date :
2010-10-02 11:21:36
By :
:)
ถ้าผมใช้ php4.0 แล้วผมจะใช้ mysqli ได้เปล่าหละ
^
ไม่ได้ครับ แต่ผมแนะนำให้คนที่คิดจะเริ่มเขียนใหม่ใช้ mysqli แทนอยู่ดี โดยใช้ php5
เพราะการใช้ mysql_query แบบตรงๆ ไม่ปลอดภัย และเขียนยากกว่า
ส่วนโฮสที่ใช้ php4 ก็แจ้งให้เค้าปรับปรุงเป็น php5 ซะเพราะ php4 ถ้ามีช่องโหว่ใหม่สามารถถูก hack ได้ทันที
Date :
2010-10-02 11:28:00
By :
:)
สำหรับ mysqli ซึ่งเป็น function ที่ใหม่กว่า mysql คุณ deawx คิดว่าจะใช้กับ mysql รุ่นเก่าไม่ได้หรือครับ
ลองใช้ดูก่อนครับว่าใช้ได้หรือเปล่า น่าจะแค่ไม่ซัพพอร์ตบางอย่างเท่านั้น
Date :
2010-10-02 11:35:12
By :
:)
ช่วย ๆ กันดันครับ กระทู้มีประโยชน์
คนละไม้ คนละแรง
Date :
2010-10-02 11:37:23
By :
deawx
:)
Date :
2010-10-02 11:41:37
By :
:)
SQL Injection มันมีปัญหาเยอะจริง ๆ ครับ เป็นช่องทางแรก ๆ ที่คนจะ hack กัน หลาย ๆ คนเลยใช้การเขียนแบบโยน Parameter แทน กระทุ้เป็นประโยชน์จริง ๆ สำหรับสมาชิกหลาย ๆ ท่าน ครับ
+1 ครับ รบกวน Login เป็นสมาชิกก่อนน่ะครับ
Date :
2010-10-02 11:46:19
By :
webmaster
แล้วในกรณีที่ผมเข้า รหัสละครับ แล้วส่ง ค่า มาแทน ละครับ จะมีปัญหาหรือป่าวครับ คือผม ทำการเข้า รหัส ค่า ก่อนที่จะส่ง ค่า ทุกครั้งครับ โดยเข้าประมาณ 5-6 ชั้นอะครับ แบบนี้จะมีปัญหาหรือป่าว
Date :
2010-10-02 12:02:52
By :
SOUL
ก็ยังมีโอกาสเกิดปัญหาครับไม่ว่าจะเข้ารหัสยังไง
ถ้าใช้การ ต่อ string ธรรมดาโดนไม่ป้องกันข้อมูลด้วย mysql_real_escape_string หรือการ bind ก็ยังสามารถ hack ได้ครับ
Date :
2010-10-02 12:07:01
By :
:)
แก้ไขครับ กรณีที่เข้ารหัสโดย function บางอย่างอาจจะป้องกันได้ แต่ function บางอย่างอาจป้องกันไม่ได้
แต่ยังไงการเข้ารหัสการใช้ข้อมูลจะยากและอาจจะเกิดปัญหา เช่นเสียพื้นที่บันทึกข้อมูลเยอะขึ้น หรือเสียเวลาในการถอดรหัสมากขึ้น
Date :
2010-10-02 12:12:07
By :
:)
Code (PHP)
$id = $_GET['id'];
/* ในกรณี id มีค่าเป็น integer */
if ( !is_numeric($id) ) {
die('hack attempt');
}
mysql_query("delete from table where id = ".mysql_real_escape_string($id));
/*---------------------------------------------------------------------------------*/
/* ในกรณี id มีค่าเป็น string */
mysql_query("delete from table where id = '".mysql_real_escape_string($id)."'");
อย่างเงี้ย มันจะแฮคยังไงครับ
ประวัติการแก้ไข 2010-10-02 13:58:34 2010-10-02 13:59:56
Date :
2010-10-02 13:50:04
By :
mr.v
ในกรณีมีการเข้ารหัส (ไม่รู้ผมเข้าใจคุณ soul ถูกรึเปล่า) ยกตัวอย่างเช่นเก็บรหัสผ่านเป็นแบบเข้ารหัส md5()
ก็ต้องมี mysql_real_escape_string() ครอบในส่วนที่จำเป็น ตย.
Code (PHP)
$username = $_POST['username'];
$password = $_POST['password'];
$encpassword = md5(md5($password));
$sql = "select * from users where username = '" . mysql_real_escape_string($username) . "' and password = '" . $password . "'";
mysql_query($sql);
Date :
2010-10-02 13:56:58
By :
mr.v
$id = $_GET['id'];
/* ในกรณี id มีค่าเป็น integer */
if ( !is_numeric($id) ) {
die('hack attempt');
}
mysql_query("delete from table where id = ".mysql_real_escape_string($id));
ไม่ต้องเขียนเยอะขนาดนั้นครับ
mysql_query("delete from table where id = ".intval($_GET['id']));
การต่อสตริงเสียเวลาระวังตัวแปรเยอะกว่า bind ครับ
Date :
2010-10-02 14:23:15
By :
:)
ความรู้ใหม่จริงๆ
ตามไม่ทัน
สรุปง่ายๆ คือ ถ้าใช้ mysql_query
เว็บไหนใช้คำสั่งนี้ จะโดน hack เข้าไปลบข้อมูลได้แน่นอน แบบนี้หรือเปล่าครับ
Date :
2010-10-02 14:31:07
By :
iieszz
เป็นเรื่องที่ดีมากครับ จะบวกให้ก็ไม่ได้ซะด้วย เป็นกำลังใจให้ละกัน
Date :
2010-10-02 17:11:57
By :
PlaKriM
ตอนนี้ผมก็ยังใช้ mysql_query ครับ ส่วนเรื่อง SQL Injection ยังไม่เจอครับ เพราะ php มีฟังก์ชั่นรองรับการทำงานหลายตัว
Date :
2010-10-03 07:22:37
By :
webmaster
ตอนนี้ผมก็ยังใช้ mysql_query อยู่เหมือนกัน แต่ว่าเพิ่ม function การตรวจเช็ค ต่าง เพิ่มขึ้นและที่สำคัญ มีการเข้า รหัสด้วยครับ
และของคุณ vee ยังงง คือสิ่งที่คุณเข้าใจ ถูกแล้วครับ ผมใช้ md 5 แต่มีการ เข้ารหัสหลายชั้นครับ ดังนั้นการจะถอดรหัส หรือการสร้างรหัสมาเปรียบเทียบได้มากหรือน้อยเพียงใด แต่ว่ามานก็ช่วยได้เยอะสำหรับ การป้องกัน ครับ แต่อย่างไรก็แนะนำเพิ่มได้นะครับ ขอความรู้เพิื่มเติมด้วยครับ
Date :
2010-10-04 09:02:44
By :
SOUL
มันปลอดภัยกว่า ดูง่ายกว่า ตรวจสอบง่ายกว่า ถ้ามีโอกาสก็เปลี่ยนๆ กันไปเหอะ
ไม่เห็นมีอะไรเสียหาย จะได้ทันภาษาอื่นเขาสักที ข้างห้องเขากันตั้งแต่ framework 2.0 ก็ประมาณ 5 ปีแล้ว
จะมัวติดอยู่กับของโบราณอยู่ทำไมกันเล่า
Date :
2010-10-04 09:23:12
By :
tungman
ผมไม่เข้าใจว่ามันไม่ทันภาษาอื่นยังไง ช่วยยกตัวอย่างที่เป็นรูปธรรมเข้าใจง่ายให้หน่อย.
เพราะที่ทำๆใช้อยู่ทุกวันมันก็ตอบสนองงานได้ดีมาก ยังไม่พบว่ามีอะไรที่มันถึงลิมิตทำไม่ได้เลย
Date :
2010-10-04 09:31:58
By :
mr.v
เรื่อง oop ก็เรื่องนึง php เป็น oop ที่ประหลาด หวังไว้ลึกๆ ว่าสักวันมันคงจะยกเครื่องใหม่
เรื่อง type debug กันมันดี
เรื่อง query ต้องใช้ลูปในการไล่แสดงข้อมูลในแต่ละอินเดค
เรื่องโค้ดกับแสดงผลปนกัน
เรื่อง include framework ขนาดใหญ่แล้วทำงานได้ช้าลง
เรื่องการแสดงผลภาษาต่างๆ และฟังก์ชั่นที่ทำงานกับ unicode
เดี๋ยวนึกได้อีกแล้วจะเอามาเพิ่มแล้วกันนะ
Date :
2010-10-04 09:46:46
By :
tungman
ผมก็อยากเห็นการเปลี่ยนที่ดีขึ้นใน php6
เรื่อง oop ผมก็ยังไม่เข้าใจอยู่ดี เพราเคยเขียน asp 3 มันก็คล้ายๆแบบนี้
Date :
2010-10-04 10:01:20
By :
mr.v
ก็เป็นกำลังใจให้ open source อยู่ห่างๆ เหมือนกันครับ
Date :
2010-10-04 10:12:08
By :
tungman
คนที่เขียน .net มาตลอดอาจจะ anti php ครับ
แต่ไม่รู้นะ php มีตัวแปลภาษาเป็น interpreter แต่ .net มีตัวแปลภาษาและไลบารีเป็น compiler
มันจะทำ strong type ได้เหมือน .net หรอครับ
ไว้เมื่อไหร่พี่ไมโครซอฟต์แก้ให้ใช้ windows server + .net ฟรี เมื่อนั้นแหละทุกคนจะหันมาใช้ .net
เพราะ win server กะ tools มันแพง บริษัทที่ใช้จึงต้องมีกำลังซื้อพอสมควร
ปล. ด้วยทฤษฎีอันน้อยนิด อาจผิดพลาด ขออภัยไว้ ณ หม่องนี้ด้วย
Date :
2010-10-04 11:30:05
By :
PlaKriM
ไม่ใช่ยึดติดกับฝั่ง microsoft หรอกครับ แต่ยึดติดกับแนวคิด pure oop มากกว่า
เลยเห็น php oop แล้วเลยทนไม่ได้ ไม่รู้เป็นอะไรเหมือนกัน
ก็รอสักวันและหวังว่าทาง php คงจะยกเครื่องใหม่
Date :
2010-10-04 12:38:09
By :
tungman
คุณ tungman ก็อย่าเรียกมันว่า oop ครับ เรื่อกมันว่า half oop หรือ ลูกครึ่ง oop หรือ ครึ่งควบลูก ก็ได้ครับ
ถ้างั้นก็รณรงค์เขียน java กันไปเลยทีเดียวเชียว ว่าแต่มันฟรีทุกระเบียดนิ้วหรือเปล่าหว่า
Date :
2010-10-04 13:33:31
By :
PlaKriM
ผมว่าถ้ามานพัฒนาต่อไปได้มานก็น่าจะดีเหมือนกัน นะครับ
Date :
2010-10-04 15:21:14
By :
SOUL
ผมชอบใช้ mysql_db_query อะครับ
จะเป็นไรรึป่าวอะ
Date :
2010-10-04 18:00:34
By :
mrsllive
PHP ในตอนนี้ OOP ก็สามารถเขียนได้ ในระดับที่เยี่ยมแล้วครับ คือมันยังให้ใช้โค้ดเดิมรันใน PHP 5 ได้อยู่ และมันก็เป็น weak type ด้วยครับ
แต่สำหรับ OOP แล้ว มันทำให้ strong ขึ้นได้หน่อยหนึ่ง คือ กำหนด พวก instance type ในพารามิเตอร์ ที่เป็น object หรือ array ได้ครับ
เช่น
function abc(array $arr){}
function bcd(ClassA $inst){}
ส่วนเรื่อง ความช้าแล้ว มันก็อาจมีบ้างครับเพราะมันเป็น interpreter เต็มรูปแบบ interprete ทุกครั้ง
แต่เรื่องที่ต้องการจริงๆ คือซัพพอร์ท UTF-8 เต็มรูปแบบนั่นแหละครับ ฟังชั่นบางตัวไม่ทำงาน อย่าง เช่นหา index แล้ว ตำแหน่งไม่ถูก นับ byte ผิด
Date :
2010-10-04 18:38:43
By :
pjgunner.com
แล้วเรื่อง mysql injection ละครับ ระหว่างแบบ mysql กับ mysqli อันไหนน่าจะดีกว่ากัน ข้าน้อยได้ยินมาว่า mysqli มันออกแบบมาให้เหมาะกับการเขียนแบบ oop แต่ทว่าส่วนมากก็เขียนแบบฟังก์ชั่นกันซะส่วนใหญ่ เพราะเคยชินซะแล้ว อิอิ อีกอย่าง mysqli มันมีรูปแบบการเขียนที่เป็น oop ด้วย
example
Code (PHP)
<?php
@$db = new mysqli('localhost','root','pass','database'); //การติดต่อกับฐานข้อมูล
if(mysqli_connect_errno()){
echo "ไม่สามารถเชื่อมต่อ db ได้ : ".mysqli_connect_error();
exit;
}
$query="select * from employee";
$res=$db->query($query);
$num=$res->num_rows;
$row=$res->fetch_assoc();
echo $row['ฟิลด์ 1'];
echo $row['ฟิลด์ 2'];
echo $row['ฟิลด์ 3'];
echo $row['ฟิลด์ 4'];
//ซึ่งมันสามารถอ้างอิงออปเจ็กต์ได้
?>
Date :
2010-10-04 19:46:55
By :
Manussawin
มีความเข้าใจผิดกันมากว่า class หรือโครงสร้างภาษาที่สนับสนุนให้สร้าง class คือ oop
ถ้าคนเข้าใจจริงๆ แล้ว ไม่ใช่คนที่หลงในความทันสมัยจะรู้ว่า class เป็นแค่เครื่องมือ จะใช้ภาษาไหนๆ ก็สามารถเข้าถึง oop ได้ทั้งนั้น
พวกมือใหม่ ที่เขียน java c# คล่องๆ บางคนยังเขียน oop ได้ไม่เท่าคนที่เขียน assembly เก่งๆ ด้วยซ้ำไป
Date :
2010-10-04 22:02:20
By :
php
คึกคักจังกระทู้นี้ ใครพาออกนอกประเด็นเนี่ย
อย่าไปยึดติดสิครับ มันเป็นแค่ทูล มันไม่มีอะไรที่สมบูรณ์แบบ 100% หรอก
สักวันมันก็ต้องพัฒนาต่อไปเรื่อยๆ นั้นแหละ ถ้าคิดว่ามันดีเลิศประเลิศศรีแค่นี้
ก็จบกันพอดี ไม่ต้องพัฒนากันต่อแล้ว หรือที่ผมโพสไปหลบหลู่สิ่งศักดิ์สิทธิ์เข้าเหรอครับ
พูดเรื่องนี้ทีไร ได้มาม่าทุกที พอๆ กับคุยเรื่องศาสนากับการเมือง
หรือว่าห้ามแตะต้องจริงๆ php เนี่ย ของมันแรง
Date :
2010-10-04 22:33:53
By :
tungman
พี่ตึ๋งคะ วันนี้อากาศดีป่าว หนาวมากปะคะ
Date :
2010-10-04 22:36:24
By :
blurEyes
คนอื่นไม่รู้ แต่วันนี้ผมหนาว ขนลุกซู่
Date :
2010-10-04 22:40:54
By :
tungman
ประเด็นมันไม่ได้อยู่ที่คนเขียนคล่องไม่คล่อง เก่งไม่เก่งนะครับ อย่าพาดราม่า เอ้า ต่อๆ
Date :
2010-10-04 23:10:32
By :
PlaKriM
เห็นคนมาว่า php ทั้งๆ ที่รู้จักการเขียนโปรแกรม แบบงูๆ ปลาๆ แล้วรับไม่ได้ครับ
Date :
2010-10-04 23:49:51
By :
php
ซะงั้น จะต่อว่ากันรบกวน PM นะครับ
บางทีเรื่องบางเรื่อง ถ้าเราไม่เก็บมาเป็นปัญหามันก็ไม่ใช่ปัญหานะครับ
Date :
2010-10-04 23:54:01
By :
PlaKriM
เข๊อะๆ อย่าทำให้มันกลายเป็นเรื่องเครียดเลยครับ สงสารคนที่เขาคิดค้นขึ้นมา บางครั้งในทางทฤษฎีกับการปฏิบัติมันก็ต่างกันโดยชิ้นเชิง ผมว่าจะเขียนอะไร จะทำอะไรก็คงจะเป็นเรื่องความชอบหรือความถนัดส่วนบุคคลแหละครับ
Date :
2010-10-05 00:14:34
By :
Manussawin
อ้าว กรรม ผมว่านะครับ เรื่องของภาษา php มานต้องมีการพัฒนาต่อไปเลื่อยๆๆๆ ไม่ว่าจะยังไง บางทีการเขียน code ก็ต้องมีหลากหลายเหมือนกัน ขึ้นอยู่กับความถนัด และประสบการณ์ของการเขียนมากกว่านะครับ ส่วนเรื่องมานจะเป็น oop หรืออะไร ผมว่าอย่าไปเครียดไรกะมานมากครับ มานก็แค่ tool ตัวนึง ที่หากว่าเราถนัดเราก็แค่เลือกใช้ เท่านั้นเอง ครับ แต่ว่า นะครับ ผมว่าเราย้อนกลับมาคุยเรื่องการ hack โดยผ่าน เจ้า
mysql_query จะดีกว่านะคร ับ ผมยังอยากรู้อีกหลายๆๆๆ เรื่อง ทั้งเรื่อง ลักษณะการเข้าถึง ตัว code หรือวิธีการ ที่ทำให้เกิดการ เข้าถึงข้อมูลโดยผ่านตัว mysq_query นี้ครับ อิอิอิอิอิอิ
ประวัติการแก้ไข 2010-10-05 09:19:50
Date :
2010-10-05 09:18:25
By :
SOUL
จะใช้ mysql หรือ mysqli ก็ได้ แต่ผมแนะนำให้ใช้ PHPADOdb ไปเลย อิอิ
http://adodb.sourceforge.net/
ทั้งปลอดภัยทั้งง่าย และไวกว่าเดิม
Date :
2010-10-05 10:29:29
By :
mr.v
ดราม่าตรงไหน ???
ต่อๆ คุณ จขกท. หายไปไหนครับ ยังอยู่ป่าว
Date :
2010-10-05 19:06:59
By :
pjgunner.com
adodb + savent3 สุดยอด
Date :
2010-10-05 22:17:23
By :
siamspeeds
ผมคิดว่าควรจะสร้าง function สำหรับการ insert / update ให้สั้นมากๆ เข้าไว้
db_insert('tablename,field1,field2,field3',$_POST);
db_update('tablename,primaryKeyField,field1,field2,feild3',$_POST);
ตัว function prototype ปกติแล้วแค่นี้ก็พอสำหรับการ insert ครับ
ช่วยให้การ insert ทำได้ง่ายขึ้นเยอะครับ
Date :
2010-10-05 23:00:56
By :
:)
Load balance : Server 03