|
|
|
php/mysql ถามเรื่องการเข้ารหัสด้วย mysql_real_escape_string ??? |
|
|
|
|
|
|
|
mysql_real_escape_string ส่วนมากผมจะใช้สำหรับที่เป็นข้อความเท่านั้นครับ
ถ้าเป็นตัวเลขผมจะระบุชนิดไปเลย เช่น (int)$_GET['id']; ประมาณนี้ครับ
|
|
|
|
|
Date :
2013-08-24 00:21:29 |
By :
somparn |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Code (PHP)
<?php
// Connect
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>
php แนะนำเองเลย
|
|
|
|
|
Date :
2013-08-24 11:17:57 |
By :
mr.win |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เพิ่มเติมนิดนึงครับ
ยกตัวอย่าง 2 กรณี
กรณีแรก มี ' (single quote)ครอบ
Code (PHP)
$id = $_GET['id'];
$sql = "select * from xxx where id='$id'";
ถ้าไม่ใช้ mysql_real_escape_string() จะ injection ได้ แต่ถ้าใช้ mysql_real_escape_string() ก็หมดปัญหา
กรณีที่ 2 ไม่มี ' (single quote)ครอบ
Code (PHP)
$id = $_GET['id'];
$sql = "select * from xxx where id=$id";
ไม่ใช้ mysql_real_escape_string()
หรือ ใช้ mysql_real_escape_string()
Code (PHP)
$id = mysql_real_escape_string($_GET['id']);
$sql = "select * from xxx where id=$id";
ก็ไม่ปลอดภัยทั้งนั้น
ในกรณีที่ใช้ sprintf ควรระบุให้ชัดว่าเป็น %s (string) หรือ %d (int 0-9) และควรจะใช้ mysql_real_escape_string() กับตัวแปรที่เป็น %s
วิธีที่ปลอดภัยที่สุดคือ ใช้ mysql_real_escape_string() กรองตัวแปรทุกตัวที่จะเอาเข้าไปเที่ยบในฐานข้อมูล และ ใช้ ' (single quote)ครอบด้วย บางครั้งเราป้องกันส่วน login แต่ไม่กรอง id เวลาที่จะ select ข้อมูลมาแสดง
การ injection ส่วนใหญ่ไม่ได้ต้องการ bypass เข้าหน้าสมาชิกเว็บหรือส่วนควบคุมเว็บ แต่ต้องการเจาะไปถึงฐานข้อมูล เอาชื่อ DB table ข้อมูลอื่นๆ ทั้งหมด และไม่ได้หมดเพียงแค่นั้น
|
|
|
|
|
Date :
2013-08-24 18:02:56 |
By :
โปรแกรมมั่ว |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 04
|