ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

หน้า: [1] 2   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: addslash กับ sql injection  (อ่าน 6533 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
nokia201
Newbie
*

พลังน้ำใจ: 2
ออฟไลน์ ออฟไลน์

กระทู้: 60



ดูรายละเอียด
« เมื่อ: 12 กันยายน 2013, 01:47:46 »

อยากจะถามว่า function addslashes นี้สามารถป้องกัน sql injection ได้ไหมครับ
ขอบคุณครัับ  wanwan017
บันทึกการเข้า

ขายสคริปปั้มไลค์ตามเว็บดูหนังใช้กันสนใจ PM ครับ
Misaka
Newbie
*

พลังน้ำใจ: 5
ออฟไลน์ ออฟไลน์

กระทู้: 91



ดูรายละเอียด เว็บไซต์
« ตอบ #1 เมื่อ: 12 กันยายน 2013, 01:58:16 »

กันได้ครับแต่ปรกติผมใช้ htmlspecialchars($query,ENT_QUOTES)
รอท่าอื่นมาตอบครับ  wanwan017
บันทึกการเข้า
dekmv
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 222
ออฟไลน์ ออฟไลน์

กระทู้: 3,264



ดูรายละเอียด เว็บไซต์
« ตอบ #2 เมื่อ: 12 กันยายน 2013, 01:59:57 »

mysql_real_escape_string($category)
บันทึกการเข้า
dekmv
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 222
ออฟไลน์ ออฟไลน์

กระทู้: 3,264



ดูรายละเอียด เว็บไซต์
« ตอบ #3 เมื่อ: 12 กันยายน 2013, 02:00:30 »

กันได้ครับแต่ปรกติผมใช้ htmlspecialchars($query,ENT_QUOTES)
รอท่าอื่นมาตอบครับ  wanwan017
htmlspecialchars($query,ENT_QUOTES)

ได้เล่นกันครับ
บันทึกการเข้า
MapTwoZa
ก๊วนเสียว
*

พลังน้ำใจ: 75
ออฟไลน์ ออฟไลน์

กระทู้: 366



ดูรายละเอียด
« ตอบ #4 เมื่อ: 12 กันยายน 2013, 08:44:17 »

1. การป้องกัน sql injection แบบเก่าๆ เลิกใช้ได้แล้วพวก mysql_real_escape_string
php เค้าเอาออกแล้วครับ (current stable version ปัจจุบันอยู่ที่ 5.5)

2. ไปใช้ MYSQL PDO/ MYSQLi prepare statement แล้ว bind parameter เอา
(ไม่ต้องนั่งกังวลอีกต่อไป รับมายังไงก็ bind ไปอย่างนั้น จบ)

โค๊ด:
<?php
$stmt 
$dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name'$name);
$stmt->bindParam(':value'$value);

// insert one row
$name 'one';
$value 1;
$stmt->execute();

// insert another row with different values
$name 'two';
$value 2;
$stmt->execute();
?>



เพิ่มเติม 3.
พวก html filter ต่างๆ ไม่เกี่ยวกับ sql injection
แต่เกี่ยวกับการป้องกัน post html tag / script tag ขึ้นมาบนเว็บ
« แก้ไขครั้งสุดท้าย: 12 กันยายน 2013, 08:47:36 โดย MapTwoZa » บันทึกการเข้า

Good code quality Developer Cheesy
nokia201
Newbie
*

พลังน้ำใจ: 2
ออฟไลน์ ออฟไลน์

กระทู้: 60



ดูรายละเอียด
« ตอบ #5 เมื่อ: 12 กันยายน 2013, 13:26:06 »

ขอบคุณทุกท่านมากๆครับ
บันทึกการเข้า

ขายสคริปปั้มไลค์ตามเว็บดูหนังใช้กันสนใจ PM ครับ
igensite
คนรักเสียว
*

พลังน้ำใจ: 12
ออฟไลน์ ออฟไลน์

กระทู้: 118



ดูรายละเอียด เว็บไซต์
« ตอบ #6 เมื่อ: 12 กันยายน 2013, 14:06:09 »

1. การป้องกัน sql injection แบบเก่าๆ เลิกใช้ได้แล้วพวก mysql_real_escape_string
php เค้าเอาออกแล้วครับ (current stable version ปัจจุบันอยู่ที่ 5.5)

2. ไปใช้ MYSQL PDO/ MYSQLi prepare statement แล้ว bind parameter เอา
(ไม่ต้องนั่งกังวลอีกต่อไป รับมายังไงก็ bind ไปอย่างนั้น จบ)

โค๊ด:
<?php
$stmt 
$dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name'$name);
$stmt->bindParam(':value'$value);

// insert one row
$name 'one';
$value 1;
$stmt->execute();

// insert another row with different values
$name 'two';
$value 2;
$stmt->execute();
?>



เพิ่มเติม 3.
พวก html filter ต่างๆ ไม่เกี่ยวกับ sql injection
แต่เกี่ยวกับการป้องกัน post html tag / script tag ขึ้นมาบนเว็บ

ขอบคุณครับผม
บันทึกการเข้า
igensite
คนรักเสียว
*

พลังน้ำใจ: 12
ออฟไลน์ ออฟไลน์

กระทู้: 118



ดูรายละเอียด เว็บไซต์
« ตอบ #7 เมื่อ: 12 กันยายน 2013, 14:12:57 »

$stmt->bindParam(':name', $name);

หมายความว่าอะไรครับ ?
บันทึกการเข้า
adidog
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 238
ออฟไลน์ ออฟไลน์

กระทู้: 1,859



ดูรายละเอียด เว็บไซต์
« ตอบ #8 เมื่อ: 12 กันยายน 2013, 14:41:16 »

1. การป้องกัน sql injection แบบเก่าๆ เลิกใช้ได้แล้วพวก mysql_real_escape_string
php เค้าเอาออกแล้วครับ (current stable version ปัจจุบันอยู่ที่ 5.5)

2. ไปใช้ MYSQL PDO/ MYSQLi prepare statement แล้ว bind parameter เอา
(ไม่ต้องนั่งกังวลอีกต่อไป รับมายังไงก็ bind ไปอย่างนั้น จบ)

โค๊ด:
<?php
$stmt 
$dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name'$name);
$stmt->bindParam(':value'$value);

// insert one row
$name 'one';
$value 1;
$stmt->execute();

// insert another row with different values
$name 'two';
$value 2;
$stmt->execute();
?>



เพิ่มเติม 3.
พวก html filter ต่างๆ ไม่เกี่ยวกับ sql injection
แต่เกี่ยวกับการป้องกัน post html tag / script tag ขึ้นมาบนเว็บ

เห็นแล้วคิดถึง .net แจ่มๆ น่าจะทำแบบนี้มาตั้งนานแล้ว
บันทึกการเข้า

Certain Dri Certain Dri
คุณแม่มือใหม่ คุณแม่มือใหม่
dekmv
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 222
ออฟไลน์ ออฟไลน์

กระทู้: 3,264



ดูรายละเอียด เว็บไซต์
« ตอบ #9 เมื่อ: 12 กันยายน 2013, 16:46:45 »

กำลังศึกษา PDO อยู่พอดีครับ ... อันนี้แบบเก่าแล้วครับ  wanwan012
บันทึกการเข้า
xvlnw.com
Verified Seller
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 493
ออฟไลน์ ออฟไลน์

กระทู้: 5,905



ดูรายละเอียด เว็บไซต์
« ตอบ #10 เมื่อ: 12 กันยายน 2013, 16:52:05 »

ใช้พวก Framework เขียนเลยก็ได้ครับ
มี SE มาให้แล้ว
บันทึกการเข้า

dekmv
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 222
ออฟไลน์ ออฟไลน์

กระทู้: 3,264



ดูรายละเอียด เว็บไซต์
« ตอบ #11 เมื่อ: 12 กันยายน 2013, 16:53:51 »

ใช้พวก Framework เขียนเลยก็ได้ครับ
มี SE มาให้แล้ว

ยังไงอ่ะครับ ...  Tongue
บันทึกการเข้า
xvlnw.com
Verified Seller
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 493
ออฟไลน์ ออฟไลน์

กระทู้: 5,905



ดูรายละเอียด เว็บไซต์
« ตอบ #12 เมื่อ: 12 กันยายน 2013, 17:18:10 »

ใช้พวก Framework เขียนเลยก็ได้ครับ
มี SE มาให้แล้ว


ยังไงอ่ะครับ ...  Tongue


ตัวอย่างของ CI ครับ
http://codeigniter.in.th/user_...de/database/active_record.html
บันทึกการเข้า

ฉันไม่มีตัวตน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 65
ออฟไลน์ ออฟไลน์

กระทู้: 4,817



ดูรายละเอียด
« ตอบ #13 เมื่อ: 12 กันยายน 2013, 17:56:38 »

งานเข้าล่ะผม ใช้ mysql_real_escape_string ทุกเว็บเลย wanwan004
บันทึกการเข้า
xvlnw.com
Verified Seller
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 493
ออฟไลน์ ออฟไลน์

กระทู้: 5,905



ดูรายละเอียด เว็บไซต์
« ตอบ #14 เมื่อ: 12 กันยายน 2013, 18:44:54 »

งานเข้าล่ะผม ใช้ mysql_real_escape_string ทุกเว็บเลย wanwan004

ยังดีกว่าไม่ทำครับผม Smiley
บันทึกการเข้า

ฉันไม่มีตัวตน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 65
ออฟไลน์ ออฟไลน์

กระทู้: 4,817



ดูรายละเอียด
« ตอบ #15 เมื่อ: 12 กันยายน 2013, 20:36:37 »

ผมนั่งอ่านบทความนี้มามะกี้ http://www.thaicreate.com/comm...ty/basic-mysqli-reference.html

ตกลงใช้แบบไหนหรอครับ ไม่รู้จริงๆนะ อยากเขียน OOP มานาน

แบบของคุณ MapTwoZa ที่ใช้ prepare เรียกว่าอะไรหรอครับ ใช่ OOP หรือเปล่า
บันทึกการเข้า
MapTwoZa
ก๊วนเสียว
*

พลังน้ำใจ: 75
ออฟไลน์ ออฟไลน์

กระทู้: 366



ดูรายละเอียด
« ตอบ #16 เมื่อ: 12 กันยายน 2013, 22:50:30 »

mysqli กับ mysql pdo
ในเชิงลึกๆ ผมไม่แน่ใจนะว่ามันต่างกันยังไง
ซึ่งปรกติผมก็ไม่ได้ใช้ pdo ตรงๆครับ
ผมจะใช้ doctrine2 เป็นตัวจัดการ database อีกที ( ที่เลือกใช้ตัวนี้เพราะมันเป็น framework ที่แทบจะเหมือนกับ JPA ใน java ทำให้ผมไม่ต้องเรียนรู้อะไรมากมาย แล้วเท่าที่อ่าน review ก็ถือเป็นตัวที่ดีที่สุดตัวนึงบน php )
http://www.doctrine-project.org/

ก่อนเริ่ม pdo vs mysqli มาดูก่อนครับว่าทำไมเค้าเอา mysql ธรรมดาออก

เหตุผลก็คือ เพราะมันไม่มี prepare statement ครับ
ซึ่ง prepare statement จำเป็นมากในด้านการป้องการ sql injection ในภาษาอื่นๆ ก็สามารถใช้ prepare statement ได้เกือบทั้งหมด
แล้ว prepare statement ก็กัน sql injection ได้ 100%


ประเด็นต่อไป mysqli vs pdo
pdo มีความเป็น oop มากกว่า แล้วเหมาะนำไปใช้ใน ORM มากกว่า เอาข้อดีของ pdo ที่เหนือกว่า mysqli ก่อนละกัน

1. auto injection คือมันสามารถ query มาแล้ว auto set parameter ลง object ได้เลยครับ ตัวอย่างข้างล่าง (ตรงนี้ mysqli ก็มี แต่ดูแล้วยุ่งยากกว่านิดๆ ไม่เป็นไปในเชิง OO เท่าไรด้วย)
โค๊ด:
     $dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password)

    $stmt = $dbh->query("SELECT * FROM students");

    /* MAGIC HAPPENS HERE */

    $stmt->setFetchMode(PDO::FETCH_INTO, new Student);


    foreach($stmt as $student)
    {
        echo $student->getFullName().'<br />';
    }

2. database support
mysqli ใช้ได้กับ mysql อย่างเดียว
กลับกัน pdo รองรับ database ได้ถึง 12 แบบ
โปรเจคเปลี่ยนจาก mysql เป็น sql server
โครงสร้างเดิม เปลี่ยน driver ก็ใช้งานได้ปรกติครับ

3. binding parameter
pdo สามารถ bind ใส่ name ที่ต้องการได้ครับ แต่ mysqli ต้อง bind ตามลำดับเท่านั้น !!

#PDO
โค๊ด:
$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);    
$pdo->prepare('
   SELECT * FROM users
   WHERE username = :username
   AND email = :email
   AND last_login > :last_login');   
$pdo->execute($params);

#MySQLi
โค๊ด:
$query = $mysqli->prepare('
   SELECT * FROM users
   WHERE username = ?
   AND email = ?
   AND last_login > ?');   
$query->bind_param('sss', 'test', $mail, time() - 3600);
$query->execute();
บันทึกการเข้า

Good code quality Developer Cheesy
xvlnw.com
Verified Seller
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 493
ออฟไลน์ ออฟไลน์

กระทู้: 5,905



ดูรายละเอียด เว็บไซต์
« ตอบ #17 เมื่อ: 12 กันยายน 2013, 23:11:14 »

^
^
^

+1
บันทึกการเข้า

9wong
ก๊วนเสียว
*

พลังน้ำใจ: 35
ออฟไลน์ ออฟไลน์

กระทู้: 234



ดูรายละเอียด
« ตอบ #18 เมื่อ: 12 กันยายน 2013, 23:43:31 »

เหมือนจะมีในเล่มนี้  สำหรับการเขียนแบบ คุณ MapTwoZa

ถ้าผมจำไม่ผิด เพราะยังไม่ได้สอยมาอ่าน แฮะๆ แค่ไปแอบส่องๆ

บันทึกการเข้า
ossytong
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 138
ออฟไลน์ ออฟไลน์

กระทู้: 1,151



ดูรายละเอียด
« ตอบ #19 เมื่อ: 13 กันยายน 2013, 00:14:45 »

addslashes()

สามารถป้องกันได้ครับ

แต่การมีผลต่อ SQL INJECTION มันจะไม่สามารถสรุปได้ตรงๆหรอกครับ ว่าเราจะใช้อะไรกันได้ หรือไม่ได้ มันอยู่ที่ เคส SQL Cmd จริงๆครับ

แต่ addslashes() เป็น 1 ในทางเลือกการป้องกัน SQL INJECTION ที่ได้ผล ครับ
บันทึกการเข้า
หน้า: [1] 2   ขึ้นบน
พิมพ์