|
|
|
php + mysql ถามแนวคิดเรื่อง my_sql_real_escape_string หน่อยครับ |
|
|
|
|
|
|
|
secure_text() มันทำงานยังไงครับ
|
|
|
|
|
Date :
2013-06-17 21:03:50 |
By :
randOmizE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
อ๋อๆ เป็นฟังก์ชั่นทั่วๆไปครับ
Code (PHP)
public function secure_text($data){
if(get_magic_quotes_gpc()){
$data = stripslashes($data);
}
return strip_tags(mysql_real_escape_string($data));
}
ไม่ค่อยมีคนตอบเลยแฮะ
|
|
|
|
|
Date :
2013-06-17 21:16:48 |
By :
บอสคุง |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แบบนั้นไม่ดีครับ
เพราะคุณทึกทักเอาว่า ทุกสิ่งที่ส่งมาจากผุ้ใช้ จะต้องเข้าฐานข้อมูล
ซึ่งมันอาจจะมีบางอย่างที่ไม่ต้องเข้า
การทำแบบนั้นจะทำให้โปรแกรมทำงานโดยไม่จำเป็น และอาจจะทำให้เกิดบั๊กโดยไม่ตั้งใจ
อย่าขี้เกียจครับ อะไรที่ต้องอยู่ query ถึงจะใช้ mysql_real_escape_string()
อะไรที่อยากจะ striptag() ถึงจะใช้ striptag()
ถ้าขี้เกียจพิมพ์ยาวๆ เราสามารถสร้างฟังก์ชั่นตัวช่วยได้
ตัวอย่างฟังก์ชั่นตัวช่วย ที่จะ escape argument ทุกตัว และแทนที่ลงใน query ตามรูปแบบของฟังก์ชั่นตระกูล printf() ให้อัตโนมัติ
<?php
function mysql_queryf()
{
$args = func_get_args();
$query = array_shift($args);
if ($args) {
foreach ($args as &$arg) {
$arg = mysql_real_escape_string($arg);
}
return mysql_query(vsprintf($query, $args));
}
return mysql_query($query);
}
ตอนใช้ก็ประมาณนี้
$result = mysql_queryf(
"SELECT * FROM `users` WHERE `username` = '%s' AND `password` = '%s'",
$_POST['username'],
$_POST['password']
);
|
|
|
|
|
Date :
2013-06-17 21:30:33 |
By :
cookiephp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ส่วน get_magic_quotes_gpc() ไม่ควรใช้ เราไม่ควรตรวจการทำงานส่วนนี้
ให้ตั้งค่าลงใน .htaccess แทน และให้ตั้งเงื่อนไขไว้เลยว่า
โปรแกรมของเราจะต้องทำงานใน setting ที่ปิด magic_quotes_gpc ไว้เท่านั้น
เพราะไม่ดีเลยหากต้องจะมาเรียกใช้ฟังก์ชั่นนี้ทุกครั้ง ทำให้ทำงานช้าครับ
ถ้าเป็นผม จะตรวจตั้งแต่เริ่มโปรแกรม ถ้ามีการเปิดใช้งาน magic_quotes_gpc ก็จะจบการทำงานเลย
<?php
if (get_magic_quotes_gpc()) {
echo 'magic_quotes_gpc must be disabled.';
exit;
}
|
|
|
|
|
Date :
2013-06-17 21:34:53 |
By :
cookiephp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ที่จริงมันไม่แน่เสมอไปว่าถ้าใช้ mysql_real_escape_string() แล้วมันจะป้องกันได้ และมันก็ไม่จำเป็นต้องกรองไปหมดอย่างคุณแมวของคุกกี้ว่า
ควรกรองเฉพาะอันที่จะเอาไป query ในฐานข้อมูลก็พอแล้ว
สมมติ โค๊ดประมาณนี้
Code (PHP)
$sql = "select * from tableX where user='".mysql_real_escape_string($getOrpostUser)."' and pwd='".mysql_real_escape_string($getOrpostPwd)."' ";
แบบข้างบนพอจะกันได้ แต่ 100% หรือป่าวไม่รู้
Code (PHP)
$getOrpostId = mysql_real_escape_string($_GET['id']);
$sql = "select * from tablexx where id= $getOrpostId "; // ไม่มี '
แบบนี้กันไม่ได้ เจอเต็มๆ
มันแล้วแต่กรณี บางอย่างเช็คความยาว เช็คชนิดว่าเป็นตัวเลขหรืออักษร เอาให้แน่ไปเลย ถ้าเช็คลวกๆเดี๋ยวอาจมีอะไรเล็ดลอดไปได้
ลองศึกษาเรื่อง sql injection และวิธีอื่นๆแล้วลองใช้กับเว็บตัวเองดู แล้วค่อยๆปรับปรุงไป(อย่าเพิ่งเอาขึ้นโฮสต์ก่อนทดลองนะครับ) ถ้าเราไม่รู้ช่องโหว่เราก็อุดมันยาก
|
|
|
|
|
Date :
2013-06-17 22:58:03 |
By :
randOmizE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
มีแต่เทพจริงๆด้วย อิอิ ขอบคุณครับ แต่ขอตัวอย่าง magic_quotes_gpc ใน htaccess ด้วยครับ
|
|
|
|
|
Date :
2013-06-18 01:44:00 |
By :
บอสคุง |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 02
|