ThaiSEOBoard.com

พัฒนาเว็บไซต์ => Programming => ข้อความที่เริ่มโดย: nokia201 ที่ 12 กันยายน 2013, 01:47:46



หัวข้อ: addslash กับ sql injection
เริ่มหัวข้อโดย: nokia201 ที่ 12 กันยายน 2013, 01:47:46
อยากจะถามว่า function addslashes นี้สามารถป้องกัน sql injection ได้ไหมครับ
ขอบคุณครัับ  :wanwan017:


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: Misaka ที่ 12 กันยายน 2013, 01:58:16
กันได้ครับแต่ปรกติผมใช้ htmlspecialchars($query,ENT_QUOTES)
รอท่าอื่นมาตอบครับ  :wanwan017:


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: dekmv ที่ 12 กันยายน 2013, 01:59:57
mysql_real_escape_string($category)


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: dekmv ที่ 12 กันยายน 2013, 02:00:30
กันได้ครับแต่ปรกติผมใช้ htmlspecialchars($query,ENT_QUOTES)
รอท่าอื่นมาตอบครับ  :wanwan017:
htmlspecialchars($query,ENT_QUOTES)

ได้เล่นกันครับ


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: MapTwoZa ที่ 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 ขึ้นมาบนเว็บ


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: nokia201 ที่ 12 กันยายน 2013, 13:26:06
ขอบคุณทุกท่านมากๆครับ


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: igensite ที่ 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 ขึ้นมาบนเว็บ

ขอบคุณครับผม


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: igensite ที่ 12 กันยายน 2013, 14:12:57
$stmt->bindParam(':name', $name);

หมายความว่าอะไรครับ ?


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: adidog ที่ 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 แจ่มๆ น่าจะทำแบบนี้มาตั้งนานแล้ว


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: dekmv ที่ 12 กันยายน 2013, 16:46:45
กำลังศึกษา PDO อยู่พอดีครับ ... อันนี้แบบเก่าแล้วครับ  :wanwan012:


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: xvlnw.com ที่ 12 กันยายน 2013, 16:52:05
ใช้พวก Framework เขียนเลยก็ได้ครับ
มี SE มาให้แล้ว


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: dekmv ที่ 12 กันยายน 2013, 16:53:51
ใช้พวก Framework เขียนเลยก็ได้ครับ
มี SE มาให้แล้ว

ยังไงอ่ะครับ ...  :P


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: xvlnw.com ที่ 12 กันยายน 2013, 17:18:10
ใช้พวก Framework เขียนเลยก็ได้ครับ
มี SE มาให้แล้ว


ยังไงอ่ะครับ ...  :P


ตัวอย่างของ CI ครับ
http://codeigniter.in.th/user_guide/database/active_record.html


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: ฉันไม่มีตัวตน ที่ 12 กันยายน 2013, 17:56:38
งานเข้าล่ะผม ใช้ mysql_real_escape_string ทุกเว็บเลย :wanwan004:


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: xvlnw.com ที่ 12 กันยายน 2013, 18:44:54
งานเข้าล่ะผม ใช้ mysql_real_escape_string ทุกเว็บเลย :wanwan004:

ยังดีกว่าไม่ทำครับผม :)


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: ฉันไม่มีตัวตน ที่ 12 กันยายน 2013, 20:36:37
ผมนั่งอ่านบทความนี้มามะกี้ http://www.thaicreate.com/community/basic-mysqli-reference.html

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

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


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: MapTwoZa ที่ 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();


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: xvlnw.com ที่ 12 กันยายน 2013, 23:11:14
^
^
^

+1


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: 9wong ที่ 12 กันยายน 2013, 23:43:31
เหมือนจะมีในเล่มนี้  สำหรับการเขียนแบบ คุณ MapTwoZa

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

(https://se-edws.se-ed.com/Storage/Originals/978616/081/9786160813964L.jpg)


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: ossytong ที่ 13 กันยายน 2013, 00:14:45
addslashes()

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

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

แต่ addslashes() เป็น 1 ในทางเลือกการป้องกัน SQL INJECTION ที่ได้ผล ครับ


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: MapTwoZa ที่ 13 กันยายน 2013, 00:36:41
addslashes()

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

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

แต่ addslashes() เป็น 1 ในทางเลือกการป้องกัน SQL INJECTION ที่ได้ผล ครับ

addslashes() ก็มีเคสที่โดน sql injection ได้
mysql_real_escape_string() ก็มีเคสที่ยังโดน sql injection ได้
mysql_real_escape_string php ปรับเป็น deprecated ตั้งแต่ 5.3 แล้ว current stable ปัจจุบันก็เอาออกไปแล้ว ไม่สามารถใช้งานได้อีก

prepare statement >> กันได้ 100%
prepare statement >> รับมายังไงก็ใส่ไปได้เลยไม่เสียเวลานั่ง real escape + addslash
prepare statement >> อ่าน query ได้ง่ายกว่าเยอะมากๆ

เค้าใช้ prepare statement กันหมดทั้งโลกแล้วครับ
framework ที่ทำฝั่ง model มาให้ ก็ใช้กันหมด
ทุก ORM framework เค้าก็ใช้ prepare statement กันหมด

ผมยังไม่เห็นว่า การที่ต้องไปนั่ง addslashes() ทุกครั้งที่รับ parameter มา มันน่าใช้กว่าตรงไหนเลยครับ ทำให้รำคาญซะอีก


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: dekmv ที่ 13 กันยายน 2013, 00:50:58
เป็นประโยชน์มากครับ ขอบคุณมากครับ  :wanwan002:


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: taokae ที่ 13 กันยายน 2013, 01:20:44
แต่ก่อนตอนเด็กๆ ผมทำแบบนี้เลยครับ

โค๊ด:
foreach($_POST as $key => $value) $_POST[$key] = mysql_real_escape_string($value)

โตมาอ่าน code ตัวเองแล้วขำ   :wanwan004:


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: ฉันไม่มีตัวตน ที่ 13 กันยายน 2013, 12:14:09
แต่ก่อนตอนเด็กๆ ผมทำแบบนี้เลยครับ

โค๊ด:
foreach($_POST as $key => $value) $_POST[$key] = mysql_real_escape_string($value)

โตมาอ่าน code ตัวเองแล้วขำ   :wanwan004:


อธิบายเพิ่มที ผมเขียนแบบนี้ล่ะ อยากรู้ว่าต้องเขียนแบบไหนจึงถูกต้องครับ :P
สคริปผมต้องแก้ตรึมเลย :wanwan004: เมื่อวานก็เพิ่งเปลี่ยน mysql_fetch_array เป็น mysql_fetch_assoc

ปล.คิดถูกจริงๆที่เข้ามาอ่านกระทู้นี้ :wanwan017:

เอาข้อมูลมาเพิ่มครับ
http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/

http://www.php.net/manual/en/mysqli.real-escape-string.php
http://www.php.net/manual/en/ref.pdo-mysql.php
http://www.php.net/manual/en/book.mysqli.php
http://www.php.net/manual/en/ref.pdo-mysql.php

http://www.thaicreate.com/community/php-mysql-to-mysqil.html
http://www.thaicreate.com/community/basic-mysqli-reference.html
http://www.alcaros.com/blog/index.php?topic=9


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: dekmv ที่ 13 กันยายน 2013, 14:17:54
สรุปว่า

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

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

อย่างโดยเร็ว ต้อนรับ PHP 5.5  :wanwan044:


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: siammbk ที่ 15 กันยายน 2013, 21:53:18
จริงๆ ถ้ามอง injection จาก url ออก

แค่ดักจาก get url มันก็น่าจะจบแล้วคับ

ส่วนวิธีกรองก็มีหลายวิธีคับ


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: MASTER-X ที่ 15 กันยายน 2013, 22:21:29
เลิกกลัว sql i มาตั้งนานแล้ว ...

กลัวอย่างอื่นมากกว่า


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: siammbk ที่ 15 กันยายน 2013, 22:24:44
ผมสิโดนมากับตัวเอง injection เข้ามาลบ member ลบนั่นลบนี่

จนต้องมานั่งดูว่าเข้ามาจากอะไร เซงมากตอนข้อมูลหาย

ผมเลยยอมเสียเวลามานั่งดู พอคิด logic กันขึ้นมาได้ มันก็ทำอะไรผมไม่ได้ละ สบายใจ  :P


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: dekmv ที่ 15 กันยายน 2013, 23:56:44
ผมสิโดนมากับตัวเอง injection เข้ามาลบ member ลบนั่นลบนี่

จนต้องมานั่งดูว่าเข้ามาจากอะไร เซงมากตอนข้อมูลหาย

ผมเลยยอมเสียเวลามานั่งดู พอคิด logic กันขึ้นมาได้ มันก็ทำอะไรผมไม่ได้ละ สบายใจ  :P

โดนมาสดๆเลยนะครับ  :'(


หัวข้อ: Re: addslash กับ sql injection
เริ่มหัวข้อโดย: Amdroid ที่ 17 กันยายน 2013, 03:56:21
เลิกกลัว sql i มาตั้งนานแล้ว ...

กลัวอย่างอื่นมากกว่า
ก็กันเท่าที่กันได้อะครับ