 |
ว่าด้วยเรื่อง password hash ในฐานข้อมูลกับ form login งงมากครับ รบกวนผู้รู้หน่อย |
|
 |
|
|
 |
 |
|
ในเมื่อในฐานข้อมูลเก็บข้อมูล Password เวลาตรวจสอบ(Login) ก็ต้องเข้ารหัสด้วยครับ
Code (PHP)
$passwd = mysql_real_escape_string($_POST['txtPassword']);
$passwd = md5($passwd); #เป็นการเข้ารหัสแบบ md5 หรือถ้าเข้ารหัสแบบอื่นก็เปลี่ยนตรงนี้ครับ
$strSQL = "SELECT * FROM members WHERE name = '".mysql_real_escape_string($_POST['txtUsername'])."'
and members_pass_hash ='$passwd' ";
|
ประวัติการแก้ไข 2013-08-26 16:56:44
 |
 |
 |
 |
Date :
2013-08-26 16:56:03 |
By :
arm8957 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ยังไม่ได้อ่ะครับ
สมมติน่ะครับ
พาสที่ผมสมัครในฟอม register เป็น 123
แต่พอมันไปอยู่ใน ฐานข้อมูล มันเป็น 818018507e55bfc20c8995c16a026b2b
ซึ้งหน้า php check login เป็น
Code (PHP)
$members_pass_hash = mysql_real_escape_string($_POST['txtPassword']);
$members_pass_hash = md5($salt.md5($members_pass_hash));
$strSQL = "SELECT * FROM members WHERE name = '".mysql_real_escape_string($_POST['txtUsername'])."'
and members_pass_hash ='$members_pass_hash' ";
พอถึงฟอม login
username เป็น 123 pass เป็น 123 พอกด login มันบอกพาสผิด
แต่พอใส่ user = 123 pass = 818018507e55bfc20c8995c16a026b2b
มันกับเข้าได้
แต่สิ่งที่ผมจะทำคือ
หน้า login user = 123 pass ให้เป็น 123 อ่ะครับ
พอเข้าใจผมมั้ย
|
 |
 |
 |
 |
Date :
2013-08-26 23:01:35 |
By :
pongtanakorn |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คือ md5() มันเป็นการเข้ารหัสทางเดียวครับ เอากลับคืนมาไม่ได้
ต้องดูว่าตอนเข้ารหัสมันเข้ายังไง จากที่ดูโค้ดคุณ คุณใช้ salt ด้วย ฉะนั้นค่าของ $salt ก็ต้องตรงกับตอน INSERT
ที่เขาต้องทำแบบนี้เพื่อความปลอดภัย และเป็นไม่การละเมิดผู้ใช้ครับ
เพราะมีเว็บไซต์จำนวนมากที่เก็บรหัสผ่านของผู้ใช้ในแบบไม่เข้ารหัส
และนำไปใช้อย่างผิดๆ เช่นเอาไปแอบเข้าบัญชีอีเมล์ของผู้ใช้
เพราะผู้ใช้ทั่วไปที่ไม่รู้อิโหน่อิเหน่มักจะใช้รหัสผ่านเดียวกันกับทุกๆ บัญชี
Code (PHP)
// กรณีนี้ไม่ต้อง escape string ครับ เพราะถ้า escape string แล้วเวลาเอาไป md5() มันอาจจะได้ hash ผิดเพี้ยนไป
// และยังไงค่าที่ได้จาก md5() มันปลอดภัยที่จะใช้ใน SQL อยู่แล้วครับ
//$members_pass_hash = mysql_real_escape_string($_POST['txtPassword']);
// ดังนั้นที่คุณบอกว่ายังไม่ได้ ก็คงต้องตรวจสอบครับว่า $salt เนี่ย ตรงกับตอน INSERT หรือเปล่า
// หรือ $salt อาจจะต่อท้าย แทนที่จะอยู่ข้างหน้ารหัสผ่าน
// และ md5() ครั้งเดียวพอครับ ไม่ต้องซ้อนสองครั้ง
$members_pass_hash = md5($salt . $_POST['txtPassword']);
// อาจจะเป็นแบบนี้ $members_pass_hash = md5($_POST['txtPassword'] . $salt) ;
$strSQL = "SELECT * FROM members WHERE name = '".mysql_real_escape_string($_POST['txtUsername'])."'
and members_pass_hash ='$members_pass_hash' ";
|
ประวัติการแก้ไข 2013-08-26 23:37:56 2013-08-26 23:38:45
 |
 |
 |
 |
Date :
2013-08-26 23:36:30 |
By :
phpinfo() |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
จริงๆ ถ้าจะให้ดี เอาโค้ดตอน INSERT มาให้ดูประกอบด้วยก็จะดีมากครับ เพราะที่ผมตอบไปอาจจะไม่ช่วยอะไร เพราะจุดที่ต้องตรวจสอบมันอยู่ที่โค้ด INSERT ด้วย
|
 |
 |
 |
 |
Date :
2013-08-26 23:39:54 |
By :
phpinfo() |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
INSERT ผม INSERT กับ บอร์ดสำดร๊จรูปครับ คือ IPB
|
 |
 |
 |
 |
Date :
2013-08-26 23:44:48 |
By :
pongtanakorn |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|

|
 |
 |
 |
 |
Date :
2013-08-26 23:48:32 |
By :
pongtanakorn |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อ่อ งั้นลองดูไปเรื่อยๆ ครับ ว่า $salt อยู่หน้า หรืออยู่หลัง
ถ้าไม่ได้เลย ซึ่งบางที salt อาจจะผสมอยู่ระหว่างรหัสผ่าน คงต้องเข้าไปดูโค้ดของบอร์ดแล้วล่ะครับ ว่าเขาใช้ salt แบบไหน
|
 |
 |
 |
 |
Date :
2013-08-26 23:54:46 |
By :
phpinfo() |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
โอ้้ มันเยอะมากอ่ะครับ ซึ้งผมก็ลองดูแล แต่ไม่เข้าใจเลย T^T
|
 |
 |
 |
 |
Date :
2013-08-27 00:08:12 |
By :
pongtanakorn |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
โค้ดนี้คือน่า register ของบอร์ดครับ
|
 |
 |
 |
 |
Date :
2013-08-27 00:08:40 |
By :
pongtanakorn |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เออ ไม่ต้องเอาส่วน HTML มาครับ มันไม่เกี่ยวกันเลย ต้องเป็นส่วนที่ query อ่ะครับ
แต่อย่างที่ผมบอก คุณลองหรือยังล่ะครับ ตามตัวอย่างของผม และแบบเปลี่ยนตำแหน่งของ salt
ลองหรือยังครับ
|
 |
 |
 |
 |
Date :
2013-08-27 00:15:35 |
By :
phpinfo() |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองแล้วครับ
แต่ไปเจอนี่มาครับ
Code (PHP)
$this->DB->build( array( 'select' => 'email, name, member_id, ip_address, members_pass_salt, members_pass_hash, joined',
'from' => 'members',
'order' => 'member_id ASC',
'limit' => array( $limit_a, $limit_b ) ) );
$this->DB->execute();
while( $row = $this->DB->fetch() )
{
$members[ $row['member_id'] ] = array( 'email_address' => $row['email'],
'pass_salt' => $row['members_pass_salt'],
'password' => $row['members_pass_hash'],
'ip_address' => $row['ip_address'],
'username' => $row['name'],
'extra' => '',
'flag' => 0,
'join_date' => $row['joined'] );
|
 |
 |
 |
 |
Date :
2013-08-27 00:20:12 |
By :
pongtanakorn |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เป็นโค้ด SELECT ครับ ไม่ใช่ INSERT
|
 |
 |
 |
 |
Date :
2013-08-27 00:21:32 |
By :
phpinfo() |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แบบที่ผมลองน่ะครับ
Code (PHP)
$members_pass_hash = md5($salt . $_POST['txtPassword']);
$strSQL = "SELECT * FROM members WHERE name = '".mysql_real_escape_string($_POST['txtUsername'])."'
and members_pass_hash ='$members_pass_hash' ";
Code (PHP)
$members_pass_hash = md5($_POST['txtPassword'] . $salt) ;
$strSQL = "SELECT * FROM members WHERE name = '".mysql_real_escape_string($_POST['txtUsername'])."'
and members_pass_hash ='$members_pass_hash' ";
ไม่ได้เหมือนกันครับ ฟ้องพาสผิด
|
 |
 |
 |
 |
Date :
2013-08-27 00:22:08 |
By :
pongtanakorn |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
งั้นเด่วลองหาดูครับ สักครู่
|
 |
 |
 |
 |
Date :
2013-08-27 00:22:31 |
By :
pongtanakorn |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
หาไม่เจอครับ ไฟล์มันเยอะมากเลย ตาลายหมดแล้ว งมทั้งวันเลย T^T
|
 |
 |
 |
 |
Date :
2013-08-27 00:30:23 |
By :
pongtanakorn |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
$salt นี่ เอามาจากไหนครับ SELECT ออกมาแล้วหรือยัง
|
 |
 |
 |
 |
Date :
2013-08-27 00:34:39 |
By :
phpinfo() |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Tip เล็ๆน้อยๆ
สำหรับคนที่ ใช่ โปรแกรม Dreamweaver สามารถค้นหา Text ที่อยู่ใน File หรือ Folder ได้ แบบ อัติโนมัติ
คีร์ลัด
window : Ctrl + F
mac os : Command +F
ขึ้นหน้าต่าง Find And Replace ให้เลือก Find In : เป็น Folder... และเลือก Path ที่อยู่ Folder ที่ต้องการ ครับ

สำหรับคนที่ ใช้ Mac OS โปรแกรม Coda2 สามารถค้นหาได้เช่นกัน ตามภาพครับ

|
 |
 |
 |
 |
Date :
2013-08-27 06:47:34 |
By :
yamcrocodile |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|