รวมวิธีป้องกัน sql injection จากเว็บอื่น
หน้าแรก PHP MySQL เกร็ดความรู้ รวมวิธีป้องกัน sql injection จากเว็บอื่น
1. การป้องกัน sql injection แบบเก่าๆ เลิกใช้ได้แล้วพวก mysql_real_escape_string
php เค้าเอาออกแล้วครับ (current stable version ปัจจุบันอยู่ที่ 5.5)
2. ไปใช้ MYSQL PDO/ MYSQLi prepare statement แล้ว bind parameter เอา
(ไม่ต้องนั่งกังวลอีกต่อไป รับมายังไงก็ bind ไปอย่างนั้น จบ)
| Code |
| <?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 ขึ้นมาบนเว็บ
====================================================================================
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 มา มันน่าใช้กว่าตรงไหนเลยครับ ทำให้รำคาญซะอีก
ขึ้นไปด้านบน
