Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,028

HOME > PHP > PHP Forum > สิ่งที่ทุกคนต้องรู้ (ทั้งมือใหม่และเก่า) ในการเขียนโปรแกรมติดต่อกับฐานข้อมูลด้วย PHP หากไม่อยากให้ระบบที่เขียนนั้นถูก HACK ได้ !!!



 

สิ่งที่ทุกคนต้องรู้ (ทั้งมือใหม่และเก่า) ในการเขียนโปรแกรมติดต่อกับฐานข้อมูลด้วย PHP หากไม่อยากให้ระบบที่เขียนนั้นถูก HACK ได้ !!!

 



Topic : 091059



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook



โค้ด PHP ที่เกี่ยวกับ mysql ที่เขียนโดยมือสมัครเล่น (หรือแม้แต่มืออาชีพ)
ที่สามารถพบเห็นได้ทั่วไปในเว็บบอร์ดและในบทความของเว็บต่างๆ
หากพิจารณาดูแล้ว ส่วนใหญ่เป็นโค้ดที่มีความปลอดภัยต่ำ บทความนี้จะอธิบายว่าทำไม และจะแก้ไขปรับปรุงให้ดีขึ้นได้อย่างไร




การเขียนโปรแกรมติดต่อกับฐานข้อมูลนั้น จะต้องมีการสั่งให้ PHP อ่านหรือเพิ่มเติมแก้ไขข้อมูลในฐานข้อมูล
ซึ่งมักจะต้องเกี่ยวพันกับข้อมูลที่รับมาจากผู้ใช้ เพื่อที่จะทำการค้นหา หรือเปลี่ยนแปลงข้อมูล
ซึ่งตัวอย่างที่พบเห็นได้ทั่วไป จะคล้ายๆ แบบนี้

$sql = "SELECT * FROM `member` WHERE `username` = '$_POST[username]' AND `password` = '$_POST[password]'";
$result = mysql_query($sql);
if (!$result) {
    die(mysql_error());
}
$user = mysql_fetch_array($result);


โค้ดดังกล่าวเป็นระบบ login เพื่อค้นหาบัญชีผู้ใช้ในระบบ และตรวจว่ารหัสผ่านตรงหรือไม่
หากเจอบัญชีผู้ใช้ และรหัสผ่านตรงกับที่ส่งมา ก็จะดำเนินการต่อไป

จะเห็นได้ว่า มีการรับข้อมูลจากผู้ใช้ ($_POST['username'] และ $_POST['password'])
และนำไปประกอบกับ query โดยตรง
ซึ่งโค้ดลักษณะนี้เสี่ยงต่อการกระทำที่เรียกว่า SQL Injection ครับ




มาดูกันว่า SQL Injection เป็นอย่างไร

สมมติว่าเรา login ด้วย
username: cookiephp
password: 0123456789


ก็จะได้ตัวแปร $sql ที่มีค่า

SELECT * FROM `member` WHERE `username` = 'cookiephp' AND `password` = '0123456789'


ซึ่งจะไม่มีปัญหาอะไร

แต่ถ้าสมมติว่าเรา login ด้วย

username: cookiephp
password: -_-'


ก็จะได้ตัวแปร $sql ที่มีค่า

SELECT * FROM `member` WHERE `username` = 'cookiephp' AND `password` = '-_-''


ซึ่งจะทำให้เกิด error แบบนี้
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''-_-''

สังเกตตรง `password` = '-_-''
กลายเป็นว่ารหัสผ่านของเราซึ่งก็คือ -_-' จะไปปิด string เสียก่อน
และทำให้ค่าของรหัสผ่านที่จะใช้เปรียบเทียบนั้นเปลี่ยนเป็น -_-
และทำให้มี ' เกินมา 1 ตัว

กรณีแบบนี้เรียกว่า SQL Injection แปลแบบบ้านๆ ได้ว่า การเสียบเข้าไปใน SQL ซึ่งในที่นี้ เราเสียบเครื่องหมาย ' เข้าไปนั่นเอง
ซึ่งในตัวอย่างนี้มีผลเสียเพียงแค่เกิด error

แต่หากเรา login ด้วย

username: cookiephp
password: ' OR username = 'cookiephp' AND TRUE <> '

ก็จะได้ตัวแปร $sql ที่มีค่า

SELECT * FROM `member` WHERE `username` = 'cookiephp' AND `password` = '' OR username = 'cookiephp' AND TRUE <> ''


ซึ่งจะตรงกันข้ามกับตัวอย่างก่อนหน้านี้
คือไม่ทำให้ SQL มันผิดพลาด แต่ทำให้เป็น SQL ที่มีความหมายเปลี่ยนไป
หากมีชื่อผู้ใช้ดังกล่าวอยู่ในฐานข้อมูล แม้รหัสผ่านจะไม่ตรงก็ไม่มีผล
เพราะเงือนไขที่สองหลัง OR จะเป็นจริงเสมอ

ทำให้เราสามารถ login ในนามของใครก็ได้ เพียงแค่รู้จักชื่อผู้ใช้




วิธีป้องกัน SQL Injection

ในการเอาค่าที่รับมาจากผู้ใช้ไปรวมเป็น query นั้น
เราต้อง "escape" ค่าที่รับมาจากผู้ใช้ด้วยฟังก์ชั่นที่เหมาะสม (ซึ่งแล้วแต่ชนิดของฐานข้อมูล) ก่อนที่จะนำไปใช้

ซึ่งสำหรับ MySQL นั้นมีสองฟังก์ชั่นคือ

mysql_escape_string() และ mysql_real_escape_string()

ซึ่งแนะนำให้ใช้ตัวหลัง

ตัวอย่าง
$_POST['username'] = mysql_real_escape_string($_POST['username']);
$_POST['password'] = mysql_real_escape_string($_POST['password']);
$sql = "SELECT * FROM `member` WHERE `username` = '$_POST[username]' AND `password` = '$_POST[password]'";


หากเรา "escape" ค่าที่รับมาจากผู้ใช้แล้ว ต่อให้มีเครื่องหมาย ' อยู่ในค่านั้นๆ ก็จะไม่มีปัญหาอีกต่อไป

สมมติว่าเราส่งพาสเวิร์ดที่มีค่า -_-' ตามตัวอย่างก่อนหน้านี้

ก็จะได้ตัวแปร $sql ที่มีค่า

SELECT * FROM `member` WHERE `username` = 'cookiephp' AND `password` = '-_-\''


ซึ่ง \' จะไม่ทำให้ SQL ผิดเพี้ยน เพราะ MySQL จะตีความเป็นเครื่องหมาย ' ให้เป็น "ข้อมูล" ไม่ใช่ "ไวยากรณ์ ของ SQL"




มาเปลี่ยนวิธีการสร้าง query กันเถอะ

จากตัวอย่างข้างบน สามารถทำให้โค้ดกระชับขึ้นได้ด้วยการหลีกเลี่ยงการกำหนดค่าลงตัวแปรด้วยการเชื่อมต่อสตริง

ใช้การเชื่อมต่อสตริงเพื่อสร้าง SELECT query
// ไม่ต้องมีการกำหนดค่าลงตัวแปรก่อนนำไปใช้
// ลดขั้นตอนการทำงานของ PHP ลง
// ประหยัดหน่วยความจำ
$sql = "SELECT * FROM `member` WHERE `username` = '"
    . mysql_real_escape_string($_POST['username'])
    . "' AND `password` = '"
    . mysql_real_escape_string($_POST['password'])
    . "'";


แต่ไม่แนะนำ เพราะเขียนผิดพลาดได้ง่ายและแก้ไขยาก (แต่ยกตัวอย่างให้ดูเพราะนักพัฒนาของไทยส่วนใหญ่นิยมใช้วิธีนี้กัน)

แนะนำให้ใช้ฟังก์ชั่น sprintf() เพื่อการแก้ไขที่สะดวกขึ้นในภายหลัง และทำให้อ่านง่ายมากขึ้นด้วย

sprintf() นั้นเป็นฟังก์ชั่นที่ใช้ "แทนที่ค่าต่างๆ ลงใน string ตามรูปแบบที่ต้องการ"

โดยมีรูปแบบการใช้ดังนี้ sprintf(รูปแบบ, ค่าแทนที่)
รูปแบบ คือ string ที่เครื่องหมาย % แล้วตามด้วยอักษรภาษาอังกฤษบางตัว เช่น %s, %d (แต่สำหรับการสร้าง query เราใช้แบบเดียวคือ %s) จะทำให้กลายเป็นจุดที่ค่าอื่นจะมาแทนที่ หากจะแสดงเครื่องหมาย % ต้องใช้ %%
ค่าแทนที่ สามารถมีได้หลายค่า

ตัวอย่างการใช้ sprintf()
echo sprintf('I am %s years old.', 10); // %s คือจุดที่จะแทนที่ด้วยค่าอื่น ในที่นี้คือ 10 จะได้ผลเป็น
// I am 10 years old.
echo sprintf('I have %s brothers and %s sisters.', 2, 4); // ค่าแทนที่มากกว่า 1 ค่า
// I have 2 brothers and 4 sisters.
echo sprintf('<div style="width: %s%%">Hello World</div>', 50); // %% จะกลายเป็น %
// <div style="width: 50%">Hello World</div>


ใช้ sprintf() เพื่อสร้าง SELECT query
// อาจจะทำงานช้ากว่าการเชื่อมต่อสตริง
// แต่ประหยัดหน่วยความจำเหมือนกัน
// และอ่านง่าย แก้ไขง่าย กว่ากันเยอะ
$sql = sprintf(
    "SELECT * FROM `member` WHERE `username` = '%s' AND `password` = '%s'",
    mysql_real_escape_string($_POST['username']), // %s ตัวที่ 1
    mysql_real_escape_string($_POST['password'])  // %s ตัวที่ 2
);


ใช้ sprintf() เพื่อสร้าง INSERT query
$sql = sprintf(
    "
    INSERT INTO `members`
    (`id`, `username`, `password`, `first_name`, `last_name`)
    VALUES
    ('', '%s', '%s', '%s', '%s')
    ",
    mysql_real_escape_string($_POST['username']),   // %s ตัวที่ 1
    mysql_real_escape_string($_POST['password']),   // %s ตัวที่ 2
    mysql_real_escape_string($_POST['first_name']), // %s ตัวที่ 3
    mysql_real_escape_string($_POST['last_name'])   // %s ตัวที่ 4
);


ใช้ sprintf() เพื่อสร้าง UPDATE query
$sql = sprintf(
    "
    UPDATE `members`
    SET
        `username`   = '%s',
        `password`   = '%s',
        `first_name` = '%s',
        `last_name`  = '%s'
    WHERE `id` = '%s'
    LIMIT 1
    ",
    mysql_real_escape_string($_POST['username']),   // %s ตัวที่ 1
    mysql_real_escape_string($_POST['password']),   // %s ตัวที่ 2
    mysql_real_escape_string($_POST['first_name']), // %s ตัวที่ 3
    mysql_real_escape_string($_POST['last_name']),  // %s ตัวที่ 4
    mysql_real_escape_string($_POST['id'])          // %s ตัวที่ 5
);





แหล่งข้อมูลอ้างอิง

mysql_escape_string() - http://www.php.net/manual/en/function.mysql-escape-string.php
mysql_real_escape_string() - http://www.php.net/manual/en/function.mysql-real-escape-string.php
sprintf() - http://www.php.net/manual/en/function.sprintf.php
PHP - Basic MySQL Injection - http://www.youtube.com/watch?v=SDHlfqd4CjM
How to prevent SQL injection in PHP? - http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php



Tag : PHP









ประวัติการแก้ไข
2013-02-18 13:13:25
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2013-02-18 12:56:33 By : cookiephp View : 2474 Reply : 37
 

 

No. 1



โพสกระทู้ ( 752 )
บทความ ( 3 )



สถานะออฟไลน์
Blogger

น่าจะเขียเป็นบทความไปเลยนะครับ ดีครับๆ ความรู้ใหม่

ขอบคุณครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 13:11:34 By : ALTELMA
 


 

No. 2



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

เขียนไปแล้วตั้งแต่เมื่อวานครับ แต่ยังไม่ได้รับการรับรองครับ เลยโพสต์ไว้ในนี้ด้วย
อาจจะเห็นกันได้มากกว่า และเผื่อจะได้มาถกเถียงกันด้วย
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 13:14:55 By : cookiephp
 

 

No. 3



โพสกระทู้ ( 130 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 2 เขียนโดย : cookiephp เมื่อวันที่ 2013-02-18 13:14:55
รายละเอียดของการตอบ ::
แต่หากเรา login ด้วย

username: cookiephp
password: ' OR username = 'cookiephp' AND TRUE <> '

ก็จะได้ตัวแปร $sql ที่มีค่า

SELECT * FROM `member` WHERE `username` = 'cookiephp' AND `password` = '' OR username = 'cookiephp' AND TRUE <> ''

ซึ่งจะตรงกันข้ามกับตัวอย่างก่อนหน้านี้
คือไม่ทำให้ SQL มันผิดพลาด แต่ทำให้เป็น SQL ที่มีความหมายเปลี่ยนไป
หากมีชื่อผู้ใช้ดังกล่าวอยู่ในฐานข้อมูล แม้รหัสผ่านจะไม่ตรงก็ไม่มีผล
เพราะเงือนไขที่สองหลัง OR จะเป็นจริงเสมอ

ทำให้เราสามารถ login ในนามของใครก็ได้ เพียงแค่รู้จักชื่อผู้ใช้


ผมลองแล้วก็เข้าไม่ได้อ่ะครับ โค้ด check login ก็เหมือนกัน
คุณแมวของคุกกี้ ลองให้ดูหน่อยได้ไหมครับ http://119.59.99.125/~nutsuanplu/
เข้าได้แล้ว ลอง print screen หน้า home ให้ดูหน่อยครับ

ไม่ได้ลองของหรืออะไรนะครับ แค่อยากทราบว่าวิธีด้านบนทำได้จริงเหรอ

username : admin ครับ ส่วน password ผมเปลี่ยน


ประวัติการแก้ไข
2013-02-18 13:55:31
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 13:54:39 By : nutsuanplu
 


 

No. 4



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ถ้า setting PHP ของคุณมีการตั้ง magic_quotes_gpc ให้ทำงานไว้ มันจะ escape พวกตัวแปร $_GET, $_POST ให้อัตโนมัติครับ

แต่นั่นหมายความว่าเมื่อไหร่ที่ย้ายโค้ดไปเครื่องที่ปิด magic_quotes_gpc ก็จะมีช่องโหว่ทันทีครับ

แต่จะทำแบบตัวอย่างได้ คุณต้องใช้วิธีเขียนแบบไม่ได้ escape และเช็คค่า password ใน SQL เหมือนในตัวอย่างนะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 14:01:01 By : cookiephp
 


 

No. 5



โพสกระทู้ ( 342 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์


หน้านี้รึเปล่า?


ประวัติการแก้ไข
2013-02-18 14:12:04
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 14:11:33 By : triplea
 


 

No. 6



โพสกระทู้ ( 310 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 5 เขียนโดย : triplea เมื่อวันที่ 2013-02-18 14:11:33
รายละเอียดของการตอบ ::
คุณ triplea ขี้โกงค่ะเอารูประบบของคุณ nut ที่เคยแจกฟรีมาลงค่ะ ..... ไม่ดีน่ะค่ะ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 14:16:10 By : survivor
 


 

No. 7



โพสกระทู้ ( 342 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 6 เขียนโดย : survivor เมื่อวันที่ 2013-02-18 14:16:10
รายละเอียดของการตอบ ::
คุณ triplea ขี้โกงค่ะเอารูประบบของคุณ nut ที่เคยแจกฟรีมาลงค่ะ ..... ไม่ดีน่ะค่ะ


ขอบคุณที่เตือนครับ
ผมจะไม่ทำ แบบที่ผมทำอีก


ประวัติการแก้ไข
2013-02-18 14:18:52
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 14:17:56 By : triplea
 


 

No. 8



โพสกระทู้ ( 310 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 7 เขียนโดย : triplea เมื่อวันที่ 2013-02-18 14:17:56
รายละเอียดของการตอบ ::
ไม่เป็นไรค่ะ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 14:22:27 By : survivor
 


 

No. 9



โพสกระทู้ ( 5,105 )
บทความ ( 4 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 4 เขียนโดย : cookiephp เมื่อวันที่ 2013-02-18 14:01:01
รายละเอียดของการตอบ ::
magic_quotes_gpc มัน off อยู่ แล้วต้องเปิดไหม คุณน้องเปรม เรียนชี้แจ้งหน่อยจ้ะ



ประวัติการแก้ไข
2013-02-18 14:26:31
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 14:23:19 By : apisitp
 


 

No. 10



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 9 เขียนโดย : apisitp เมื่อวันที่ 2013-02-18 14:23:19
รายละเอียดของการตอบ ::
ไม่ควรเปิดครับ อย่างยิ่งเลย
มันเป็น feature ที่ deprecated ไปนานแล้วครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 14:24:28 By : cookiephp
 


 

No. 11



โพสกระทู้ ( 5,105 )
บทความ ( 4 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์


Thank ๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 14:27:29 By : apisitp
 


 

No. 12



โพสกระทู้ ( 130 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 4 เขียนโดย : cookiephp เมื่อวันที่ 2013-02-18 14:01:01
รายละเอียดของการตอบ ::
ถ้า setting PHP ของคุณมีการตั้ง magic_quotes_gpc ให้ทำงานไว้ มันจะ escape พวกตัวแปร $_GET, $_POST ให้อัตโนมัติครับ

แต่นั่นหมายความว่าเมื่อไหร่ที่ย้ายโค้ดไปเครื่องที่ปิด magic_quotes_gpc ก็จะมีช่องโหว่ทันทีครับ

แต่จะทำแบบตัวอย่างได้ คุณต้องใช้วิธีเขียนแบบไม่ได้ escape และเช็คค่า password ใน SQL เหมือนในตัวอย่างนะครับ


โค้ดหน้า check login ของผมครับ
<?
	
	include("connectdb.php");
	$strSQL = "SELECT * FROM member WHERE username = '".trim($_POST['txtUsername'])."' 
	and password = '".trim($_POST['txtPassword'])."'";
	$objQuery = mysql_query($strSQL);
	$objResult = mysql_fetch_array($objQuery);
	if(!$objResult)
	{
			echo "Username หรือ Password ไม่ถูกต้อง!";

			
	}
	else
	{

			$_SESSION["member_id"] = $objResult["id"];
			$_SESSION["member_user"] = $objResult["username"];
			$_SESSION["member_pass"] = $objResult["password"];
			$_SESSION["member_name"] = $objResult["name"];
			$_SESSION["member_status"] = $objResult["status"];		
			$_SESSION["member_active"] = $objResult["active"];

			session_write_close();

			header("location:home.php");

	}
	mysql_close();
?>


magic_quotes_gpc มันคืออะไรครับ

ผมเอาไปฝากไว้ที่ host แห่งหนึ่ง ถ้าเป็นอย่างนั้นแสดงว่า ทุก host ก็เปิด magic_quotes_gpc ไว้ทุกที่

แต่ผมลองในเครื่องตัวเอง localhost มันก็ ไม่สามารถใช้ได้อยู่ดีอ่ะครับ

กำลังศึกษาเรื่องความปลอดภัยอยู่พอดี
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 14:30:04 By : nutsuanplu
 


 

No. 13



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

magic_quotes_gpc คือ setting อันนึงของ PHP

ที่จะทำการ escape ตัวแปร $_GET, $_POST ให้เอง

เช่น

เรามี input ชื่อ username

<input name="username" type="text" />

แล้วเราพิมพ์ '_' ส่งไปที่ PHP ที่ค่า magic_quotes_gpc เปิดอยู่

ค่าที่รับใน PHP จะเป็น \'_\' แทนที่จะเป็น '_' เฉย คือมี \ เพิ่มเข้ามาให้
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 14:55:25 By : cookiephp
 


 

No. 14



โพสกระทู้ ( 3,748 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์
Facebook

ยอดเยี่ยมมากๆครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 15:08:36 By : Dragons_first
 


 

No. 15



โพสกระทู้ ( 4,169 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์


เพิ่มเติม บางทีถ้าคุณเขียน script เช็ค value ไม่ดีพอคุณก็อาจจะโดนแบบนี้ได้ครับ

เหตุการเกิดจาก กรอกข้อมูล input แต่ไม่มีการเช็คค่าใดๆ Hacker ยัด script prompt() หรือทดสอบ alert เพื่อทีจะเขียนโค๊ดยัดใส่ในขั้นต่อไป อันนี้ก็อาจจะเกิดได้ครับ

sdfd
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 15:13:00 By : Ex-[S]i[L]e[N]t
 


 

No. 16



โพสกระทู้ ( 889 )
บทความ ( 11 )



สถานะออฟไลน์
Facebook Blogger

PHP - Basic MySQL Injection ===> นี้เป็นคลิปของ phpacademy หรือเปล่าครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 16:08:20 By : popnakub
 


 

No. 17

Guest


ตอบความคิดเห็นที่ : 15 เขียนโดย : Ex-[S]i[L]e[N]t เมื่อวันที่ 2013-02-18 15:13:00
รายละเอียดของการตอบ ::
เคยเจอยัดสคิปเหมือนกันครับ แต่หนักตรงที่ password admin ติดมาด้วย - -

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 16:31:50 By : เดลลี่
 


 

No. 18



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 16 เขียนโดย : popnakub เมื่อวันที่ 2013-02-18 16:08:20
รายละเอียดของการตอบ ::
ไม่ทราบเหมือนกันครับ ผม search google แล้วเอามาเป็น reference ให้ดูกัน เผื่อใครต้องการข้อมูลเพิ่มเติม

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 16:33:18 By : cookiephp
 


 

No. 19



โพสกระทู้ ( 4,169 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 18 เขียนโดย : cookiephp เมื่อวันที่ 2013-02-18 16:33:18
รายละเอียดของการตอบ ::
ถ้าบทความนี้มี code พร้อม รูปภาพแสดงผล SQL Injection เจ๋งไปเลยครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 16:38:57 By : Ex-[S]i[L]e[N]t
 


 

No. 20



โพสกระทู้ ( 342 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 19 เขียนโดย : Ex-[S]i[L]e[N]t เมื่อวันที่ 2013-02-18 16:38:57
รายละเอียดของการตอบ ::
ถ้าบทความนี้มี code พร้อม รูปภาพแสดงผล SQL Injection เจ๋งไปเลยครับ


ผมทำให้เอามั้ยครับ

แต่ว่าผมเสียงหล่อเกินไป คงไม่กล้าพูดเท่าไหร่

คงต้องเป็นแบบเงียบๆ เดาเอาเองว่าผมจะสื่อถึงอะไร อันนี้ พอได้

เดี๋ยวว่างๆ ถ้ากระแสยังไม่ตก ผมจะทำมาให้ครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 16:44:05 By : triplea
 


 

No. 21



โพสกระทู้ ( 1,127 )
บทความ ( 2 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 10 เขียนโดย : cookiephp เมื่อวันที่ 2013-02-18 14:24:28
รายละเอียดของการตอบ ::
ขอเพิ่มเติมนิดนึงครับ

อันนี้เป็นเซิร์ฟเวอร์ผมเอง ผมจะ on magic_quotes_gpc
แต่ code LOGIN ผมใช้ mysql_real_escape_string() ด้วย
เลยทำให้ login ไม่ผ่าน

พอจะมีวิธีไหนบ้างครับ ที่จะทำให้ ทั้ง set php.ini ใส่วนของ magic_quotes_gpc ON
และใช้ mysql_real_escape_string() ด้วย

- ขอบคุณครับ



ให้ทำงานไว้ มันจะ escape พวกตัวแปร $_GET, $_POST


ประวัติการแก้ไข
2013-02-18 18:06:09
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 18:04:33 By : iieszz
 


 

No. 22



โพสกระทู้ ( 889 )
บทความ ( 11 )



สถานะออฟไลน์
Facebook Blogger

ตอบความคิดเห็นที่ : 18 เขียนโดย : cookiephp เมื่อวันที่ 2013-02-18 16:33:18
รายละเอียดของการตอบ ::
ครับแต่น่าจะเป็นของ phpacademy นะครับ โดยส่วนตัว ชอบนะครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 18:04:34 By : popnakub
 


 

No. 23



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook

Go to : สิ่งที่ทุกคนต้องรู้ ในการเขียนโปรแกรมด้วย PHP กับ MySQL หากไม่อยากให้ระบบที่เขียนนั้นถูก HACK ได้ !!!

Approve ให้แล้วครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 18:10:34 By : mr.win
 


 

No. 24



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 21 เขียนโดย : iieszz เมื่อวันที่ 2013-02-18 18:04:33
รายละเอียดของการตอบ ::
ถ้าจะให้โปรแกรมทำงานถูกต้องได้แม้ magic_quotes_gpc จะเปิดไว้
มีสองแบบคือ


1. ใช้ .htaccess เพิ่มอันนี้เข้าไปครับ

php_value magic_quotes_gpc 0

2. ตรวจครับ ว่ามีการเปิด magic_quotes_gpc ไว้หรือเปล่า ด้วย get_magic_quotes_gpc()

ตัวอย่าง
<?php
if (!get_magic_quotes_gpc()) {
    $_POST['username'] = mysql_real_escape_string($_POST['username']);
}
?>


แต่วิธีนี้ไม่แนะนำอย่างยิ่งเลยครับ เพราะทำงานช้า จะต้องมีตรวจทุกครั้งที่จะเรียกใช้ฟังก์ชั่น escape

หรือถ้าอยากจะใช้แบบนี้จริงๆ ควรทำฟังก์ชั่นไว้ครับ

ตัวอย่าง
<?php
// ใช้การประกาศฟังก์ชั่นแบบมีเงื่อนไข
if (get_magic_quotes_gpc()) { // หากมีการเปิด magic_quotes_gpc
    function sql_escape_string($value) // ฟังก์ชั่นนี้จะไม่ทำงานอะไรเลย แค่คืนค่าเดิมกลับมา
    {
        return $value;
    }
} else {
    function sql_escape_string($value)
    {
        return mysql_escape_string($value);
    }
}

// แล้วเรียกใช้ฟังก์ชั่นนี้แทน mysql_escape_string()
// จะได้โค้ดที่สั้นลง ไม่ต้องตรวจบ่อยๆ
$_POST['username'] = sql_escape_string($_POST['username']);
?>

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 18:19:20 By : cookiephp
 


 

No. 25



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 23 เขียนโดย : mr.win เมื่อวันที่ 2013-02-18 18:10:34
รายละเอียดของการตอบ ::
ขอบคุณฮ้าฟ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-18 18:44:58 By : cookiephp
 


 

No. 26



โพสกระทู้ ( 33 )
บทความ ( 0 )



สถานะออฟไลน์


ใส่ user มั่วๆ
แล้ว ใส่ pass
' OR 1=1=1 AND TRUE <> '

ก็เข้าได้ ครับ ผมตกใจมาก
ไม่ต้องใส่ user ที่ถูกต้อง เลย เหอะๆ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-19 11:44:33 By : theteza02
 


 

No. 27



โพสกระทู้ ( 4,169 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 26 เขียนโดย : theteza02 เมื่อวันที่ 2013-02-19 11:44:33
รายละเอียดของการตอบ ::
var matchpass=/^([a-zA-Z0-9\-\_]+)$/;
หรือตัดค่าใช่ช่องว่าง ช่วยได้เยอะครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-19 12:54:58 By : Ex-[S]i[L]e[N]t
 


 

No. 28



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 27 เขียนโดย : Ex-[S]i[L]e[N]t เมื่อวันที่ 2013-02-19 12:54:58
รายละเอียดของการตอบ ::
ไม่ได้หรอกครับ


ถ้าทำอย่างนั้น ผู้ใช้งานจะไม่สามารถใช้รหัสผ่านที่เป็นตัวอักษรที่อยู่นอกเหนือจาก 0-9 A-Z a-z และ _ ได้สิครับ
ผมก็คนนึงที่ใช้รหัสผ่านที่มีเครื่องหมายปนอยู่ด้วยตลอด
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-19 13:58:35 By : cookiephp
 


 

No. 29



โพสกระทู้ ( 4,169 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์


งั้นก็คงเหลือแต่ PDO แล้วสิครับ -.- โค๊ดยาวเกิ้ล -.-"
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-19 14:05:47 By : Ex-[S]i[L]e[N]t
 


 

No. 30



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 29 เขียนโดย : Ex-[S]i[L]e[N]t เมื่อวันที่ 2013-02-19 14:05:47
รายละเอียดของการตอบ ::
ทำไมต้อง PDO ครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-19 14:12:53 By : cookiephp
 


 

No. 31



โพสกระทู้ ( 342 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์


ตอบความคิดเห็นที่ : 29 เขียนโดย : Ex-[S]i[L]e[N]t เมื่อวันที่ 2013-02-19 14:05:47
รายละเอียดของการตอบ ::
งั้นก็คงเหลือแต่ PDO แล้วสิครับ -.- โค๊ดยาวเกิ้ล -.-"


ทำไมจึงคิดว่ามันเหลือแต่ PDO ครับ?

------------------------------------------------------
อาจจะไม่เกี่ยวกับที่คุยๆกันอยู่นี้เท่่าไหร่
แต่ผมจะให้แนวคิดแบบนี้นะครับ

ครั้งหนึ่ง
องค์การบ้าบออะไรก็ไม่รู้ พยายามศึกษาค้นคว้าทุกวิถีทาง
เพื่อที่จะพัฒนา "ปากกา" ที่จะสามารถจดบันทึกได้บนดวงจันทร์
พวกเค้าทุ่มงบมหาศาลครับ กว่าจะได้ปากกามหัศจรรย์ที่เค้าอยากได้

ในขณะที่อีกฝ่ายหนึ่ง
เลือกใช้ "ดินสอ" เพื่อจะนำไปจดบันทึกบนดวงจันทร์
------------------------------------------------------

จุดเด่นของ PDO ไม่ได้เอามาไว้ป้องกัน sql injection
มันเป็นแค่ data-access layer ที่สามารถเขียนโค้ดในลักษณะ(แทบจะ)เหมือนเดิมกับทุก database driver ที่เลือก แค่นั้นครับ
อื่นๆที่ตามมา เช่น
prepared statement หรือ อะไรก็ตามแต่ ที่ท่านจะเอามาป้องกันสิ่งเหล่านี้ ไม่ได้พิเศษไปกว่า native function ของตัวภาษา หรือ DBMS เจ้านั้นๆ ครับ

ง่ายๆคือ หากใช้ PDO มันแค่สะดวกขึ้นเฉยๆ ครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-19 14:21:48 By : triplea
 


 

No. 32



โพสกระทู้ ( 4,169 )
บทความ ( 7 )

Hall of Fame 2012

สถานะออฟไลน์


แค่เคยได้ยินมาหนะครับ ถ้าผิดต้องขออภัย
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-19 14:50:42 By : Ex-[S]i[L]e[N]t
 


 

No. 33

Guest


ตอบความคิดเห็นที่ : 28 เขียนโดย : cookiephp เมื่อวันที่ 2013-02-19 15:17:57
รายละเอียดของการตอบ ::
ตามอ่าน cookiephp มาสองสัปดาห์ล่ะ ไม่เข้าใจ๋เลยยยยยย ทำาไมชอบ discredit ชาวบ้านนจริ๊งงง
อย่าคิดว่าตะเองเก่งดิ อย่าทำเป็นน่ารังเกียจจ เดี๋ยวไม่มีใครคบด้วยหรอก......

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-19 15:45:42 By : คนไม่น่าคบหา
 


 

No. 34



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook

ผมแชร์ให้แล้วน่ะครับ

http://www.facebook.com/WebThaiCreate


บทความแบบนี้สมาชิกกด Like เยอะดีครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-20 11:25:42 By : mr.win
 


 

No. 35



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ขอบคุณครับ T T
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-20 11:28:49 By : cookiephp
 


 

No. 36



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

แนะนำบทความใหม่ครับ

สิ่งที่ทุกคนต้องรู้ ในการเขียนโปรแกรมแสดงผลในรูปแบบ HTML (ทำเว็บไซต์) ด้วย PHP หากไม่อยากให้ระบบที่เขียนนั้นถูก HACK ได้ !!!

https://www.thaicreate.com/community/prevent-php-xss.html

หวังว่าจะมีประโยชน์ ._.
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-26 15:27:34 By : cookiephp
 


 

No. 37



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook

บทความดี ๆ เดียวจะแชร์ให้ทุกบทความครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-02-27 10:16:50 By : mr.win
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : สิ่งที่ทุกคนต้องรู้ (ทั้งมือใหม่และเก่า) ในการเขียนโปรแกรมติดต่อกับฐานข้อมูลด้วย PHP หากไม่อยากให้ระบบที่เขียนนั้นถูก HACK ได้ !!!
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 03
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่