Ajax ยากๆ กับการ Login ให้ปลอดภัย
กับการใช้งาน Ajax สร้างระบบ Login
เปรียวได้ดัดแปลงโค้ดที่ได้จากหนังสือเรื่อง "คู่มือเรียน Ajax" ของ "provision" ที่คุณ "" เป็นผู้เขียน โดยตัวต้นแบบอยู่ "ที่นี่" เพื่อสร้างระบบ Login ของตัวเอง แต่ประสบกับปัญหาหลายอย่าง
เช่น
1.ต้องการเปลี่ยนฐานข้อมูลจาก MySql ไปใช่ txt แทน (อันนี้แก้ได้แล้ว)
2.เข้ารหัสข้อมูลจากฝั่ง clian ก่อนส่งไปประมวลผลต่อที่ server (อันนี้แก้ได้แล้ว)
"ปัญหาอยู่ตรงไหน"
3.เมสเสสส่งคืนมา ค่ามันกลับกลายเป็นค่าที่ใช้เข้ารหัสร่วมกับข้อมูลในตอนแรก
4.ตรวจสอบข้อมูล Login ได้แต่ข้อมูลในบันทัดล่าสุด
ปัญหาที่ยังแก้ไม่ได้คือ เมื่อส่งข้อมูลไปประมวลผลแล้ว มีการตรวจสอบจาก server แล้วว่า ชื่อและรหัสผ่านตรงกับในฐานข้อมูล
ถ้าตรงตามในฐานข้อมูลเงื่อนใขก็เป็นจริงและต้อง redirect ไปยังหน้าเป้าหมาย
เปิดหน้าแรกขึ้นมา จะเรียกไฟล์ login/index.php
<?php
$keywords='testkeyword';
$description='testdescription';
$charset='utf-8';
header( 'Content-Type: text/html; charset='.$charset);
require_once 'login/index.php';
?>
เพื่อนำโค้ดมารวมเข้ากับหน้านี้ โดยตัวไฟล์ที่ว่ามีใจความโค้ดดังนี้
<div id="login">
<form id="loginForm" method="post" onsubmit="sendData();">
<p style="text-align:center">
<table cellspacing="0" class="lined">
<tr><th><div class="fieldTitle">User name</div></th><td class="control"><input class="fieldEntry" type="text" id="username"></td></tr>
<tr><th><div class="fieldTitle">Password</div></th><td class="control"><input class="fieldEntry" type="password" id="password"></td></tr>
<tr><td colspan="2" class="control"><div style="text-align: center"><input type="submit" id="loginButton" value="เข้าระบบ" ></td></tr>
</table>
</p>
</form>
</div>
<div id="promptDiv">
</div>
เมื่อมีการ Submit Form ฟังชั่น sendData(); จะถูกเรียกให้ทำงานดังนี้
function sendData() {
var sUsername = document.getElementById("username").value;
var sPassword = document.getElementById("password").value;
var sChallenge = "challenge";
if (sUsername == "" || sPassword == "") {
alert("คุณยังไม่ได้พิมพ์ชื่อหรือรหัสผ่าน");
return;
}
postDataReturnText("login/chk_login.php", "username=" + sUsername + "&password=" + hex_sha256(hex_sha1(hex_hmac_md5(sPassword, sChallenge))), sendDataCallback);
//ใช้ตัวแปร promptDiv อ้างอิงไปยังกรอบแสดงสถานะที่อยู่ด้านล่างของฟอร์ม
var promptDiv = document.getElementById("promptDiv");
promptDiv.style.color = "green";
promptDiv.innerHTML = "กำลังตรวจสอบ...";
}
ส่วนในไฟล์ login/chk_login.php มีหน้าที่อย่างนี้
<?php
session_start(); //เริ่มต้นเซสชั่น
$username=$_POST["username"]; //เก็บชื่อที่ส่งมาจากบราวเซอร์ไว้ในตัวแปร $username
$password=$_POST["password"]; //เก็บรหัสผ่านที่ส่งมาจากบราวเซอร์ไว้ในตัวแปร $password
authenticateUser($username, $password); //ตรวจสอบชื่อและรหัสผ่านที่ส่งมาจากบราวเซอร์
//ฟังก์ชั่นที่ใช้ตรวจสอบว่ามีชื่อและรหัสผ่านนี้ในฐานข้อมูลหรือไม่
function authenticateUser($username, $password) {
//เชื่อมต่อและเลือกฐานข้อมูลที่จะทำงานด้วย
$filename="database.txt";
$fp=fopen($filename,"r");
$get_member=fread($fp,filesize($filename));
fclose($fp);
$data=explode("
",$get_member);
for($i=0; $i<count($data); $i++){
$member=explode("|",$data[$i]);
if (!$get_member) {
sendResponse("error", "เกิดปัญหาในการติดต่อฐานข้อมูล");
return;
}
if($username==$member[6] and $password==$member[7]){
session_start();
$session_id=session_id();
$member_privileges=$member[0];
$member_position=$member[1];
$member_fname=$member[2];
$member_lname=$member[3];
$member_nickname=$member[4];
$member_facename=$member[5];
$member_username=$member[6];
$member_password=$member[7];
session_register("member_privileges");
session_register("member_position");
session_register("member_fname");
session_register("member_lname");
session_register("member_nickname");
session_register("member_facename");
session_register("member_username");
session_register("member_password");
sendResponse("success", "location: complete.php");
}
else {
session_start();
session_register("username");
session_register("password");
if($username==$member[6] and $password!==$member[7]){
sendResponse("error", "<div>ค้นพบชื่อ</div>
".$username."
<div>ตรงฐานข้อมูลที่มีอยู่</div>
<div>แต่รหัสผ่านของคุณ</div>
".$password."
<div>ไม่ตรงกับฐานข้อมูลที่มีอยู่</div>
");
}else if($username!==$member[6] and $password==$member[7]){
sendResponse("error", "<div>ค้นพบรหัสผ่านของคุณ</div>
".$password."
<div>ตรงกับฐานข้อมูลที่มีอยู่</div>
<div>แต่ชื่อของคุณ</div>
".$username."
<div>ไม่ตรงกับฐานข้อมูลที่มีอยู่</div>
");
}
}
}
}//ฟังก์ชั่นที่ใช้ส่งผลลัพธ์กลับไปยังบราวเซอร์
function sendResponse($status, $message) {
echo $status . "|" . $message;
}
?>
/* ฟังก์ชั่นที่จะถูกเรียกกลับ (callback) หลังจากได้รับ response จากเพจ chk_login.php แล้ว */ //ใช้ตัวแปร promptDiv อ้างอิงไปยังกรอบแสดงสถานะที่อยู่ด้านล่างของฟอร์ม switch (respStatus) {
function sendDataCallback(data) {
//แยกสตริงที่เซิร์ฟเวอร์ส่งกลับมาโดยใช้ | เป็นตัวแยก
var respArray = data.split('|');
//เก็บสตริงส่วนแรกไว้ในตัวแปร respStatus ซึ่งจะบอกสถานะของการล็อกอินว่าสำเร็จหรือไม่
var respStatus = respArray[0].toLowerCase();
//เก็บสตริงส่วนที่สองไว้ในตัวแปร respMessage ซึ่งจะเป็นชื่อไฟล์ในกรณีล็อกอินสำเร็จ หรือเป็นข้อความแจ้งข้อผิดพลาดในกรณีล็อกอินไม่สำเร็จ
var respMessage = respArray[1];
var promptDiv = document.getElementById("promptDiv");
case "success":
promptDiv.style.color = "green";
promptDiv.innerHTML = "ล็อกอินสำเร็จ กำลังจะเข้าสู่เพจ " + respMessage;
//ตั้งเวลา 2 วินาทีให้เรียกฟังก์ชั่น redirectTo โดยส่งค่าของ respMessage ไปเป็นอาร์กิวเมนต์
setTimeout("redirectTo('" + respMessage + "')", 2000);
break;
case "error":
promptDiv.style.color = "red";
promptDiv.innerHTML = respMessage;
break;
}
}
กรณี login สำเร็จ
นี่เป็นแมสเสสที่ส่งมาจาก server
success|login/complete.php
โดย success คือ Login สำเร็จ
ส่วน login/complete.php คือ เป้าหมายปลายทาง
มันควรจะเป็นไปตามนั้น แต่พอแมสเสสส่งมายัง เบราว์เซอร์
ค่ามันกลับกลายเป็นค่าที่ใช้เข้ารหัสร่วมกับข้อมูลในตอนแรก
อีกด้านหนึ่งหาก login ไม่สำเร็จ
(กรณีชื่อถูกต้อง แต่รหัสผ่านไม่ถูกต้อง)
แมสเสสที่ส่งมาจะเป็นดังนี้
error|ค้นพบชื่อ username ตรงฐานข้อมูลที่มีอยู่ แต่รหัสผ่านของคุณ
8d2eb64b9d3c8dd96c7cdb73d1f44013411177460cca7f93032619f49ac21717
ไม่ตรงกับฐานข้อมูลที่มีอยู่
(กรณีรหัสผ่านถูกต้อง แต่ชื่อไม่ถูกต้อง)
error|ค้นพบรหัสผ่านของคุณ
95a6f18e191ab727096becd05641830c5e276c71407f2d289d3e46a171a92f2a
ตรงกับฐานข้อมูลที่มีอยู่ แต่ชื่อของคุณ
d.fjbnj
ไม่ตรงกับฐานข้อมูลที่มีอยู่
ไม่ว่าจะยังไงค่าที่ส่งมาถึงเครื่องผู้ใช้กลับกลายเป็นค่าที่ใช้เข้ารหัสร่วมกับข้อมูลในตอนแรก
"ขอชวนมาลองออกไอเดียกันหน่อย ว่ามันควรจะแก้ยังไง"
pyo@sanook.com
555+++
ก็สมควรอยู่หรอกครับ หากใช้การเข้ารหัสแบบ MD5
การเข้ารหัสแบบ MD5 เป็นการเข้ารหัสทางเดียว เข้าแล้วถอดไม่ได้ ดังนั้นถ้าจะเก็บค่าเพื่อถอดกลับได้ ก็ไม่ควรใช้ MD5
MD5 จะถูกใช้ เข้ารหัสเพื่อการตรวจสอบเท่านั้น ไม่สามารถถอกกลับเป็นค่าเดิมได้ ดังนั้น
1.มันไม่สามารถคืนค่า รหัสผ่านที่เข้าไว้ หรือชื่อ ก่อน เข้ารหัสไว้ กลับมาได้
2.มันไม่สามารถ xxx้รหัสผ่านได้ เนื่องจากมันไม่สามารถถอดกลับได้ ทำได้แค่ขอรหัสผ่านใหม่
หากคิดว่าต้องการเข้ารหัสก่อน เพื่อป้องกันคนดัก message ก่อนกลางทาง ก็ควรใช้ วิธีอื่น ที่สามารถถอดกลับได้แทน ผมยกตัวอย่างของผมเอง คือ txtDatabase ที่ผมใช้ ผมใช้อยู่ใน GCMS ครับ ลองไปศึกษาดู
แต่เปรียวลองเช็คดูแล้ว
กรณีนี้เปรียวให้การเข้ารหัสแบบทางเดียว ไม่ได้ต้องการให้มีการเข้าแล้วถอดค่ากลับได้ เพราะตั้งใจไว้ว่าจะจะนำข้อมูลส่วนที่อยู่ในฐานข้อมูลมาเข้ารหัสเพื่อเปรียบเทียบกับ ข้อมูลที่ถูกเข้ารหัสจาก User ว่าตรงกันหรือไม่
ไม่รู้ว่าวิธีนี้มันดีมั๊ย (ทำไปโดยเปล่าประโยชน์รึป่าว)
if($ข้อมูลการ Login ของ User ส่งมาโดยเข้ารหัสแล้ว = $ข้อมูลขากฐานข้อมูลที่นำมาเข้ารหัส){
คำสั่งทำงาน;
}
ณ ตอนนี้ในฐานข้อมูล เก็บข้อมูลที่เข้ารหัสไว้แล้ว
หาก login สำเร็จ
มันมีเมสเสสส่งมาจาก serverจริง เป็น
success|login/complete.php
แต่ถ้า login ไม่สำเร็จ
มันก็มีเมสเสสส่งมาจาก serverจริงเป็น
error|บอกเหตูผลที่ Login ไม่สำเร็จ
ดังนั้นเมื่อเมสเสสมันก็ออกมาตรงตามเงื่อนใขแล้ว "ทำไม" "และทำไม"
ผลมันยังไม่เป็นไปตามที่คาดหวังไว้
มีส่วนที่อยากให้พิจารณาอยู่หน่อยนึง
ใน function sendData()
มันมีการกำหนดค่า
var sChallenge = "challenge";
และถูกนำเข้ามาเข้าร่วมดังนี้
hex_sha256(hex_sha1(hex_hmac_md5(sPassword, sChallenge)))
แต่เมื่อระบบทำงานไปตามเงื่อนใขดังกล่าวแล้ว มีเมสเสสส่งกลับมา อยากที่บอก
ท้ายที่สุด เมื่อมีการ Update หน้าจอ ผลที่ได้คือ มันไม่ได้ redirect ไปยังหน้าที่กำหนด
หน้าแสดงสถานะเหมือนก่อน Login แถมยังมีค่า Challenge=challenge พ่วงมาได้ไง
ดูแล้วเหมือน $งองู 2 ตัว = "งง";
ปัญหามันอยู่ที่ ชื่อ+password ที่ไม่ได้เข้ารหัสอยู่ที่ไหน
ผมเดาเอาว่าไฟล์ password.txt คงเก็บแต่ ชื่อ+password ที่เข้ารหัสไว้ ถ้าเป็นแบบนั้น แล้วชื่อจริง pass จริง (หรือจะชื่จริงอย่างเดียวก็ตาม) จะเอาจากไหนแสดง
มันถึงได้คืนค่าเข้ารหัสกลับมา
ถ้าส่งค่าที่ถอดรหัสแล้วกลับมา มันถึงจะแสดงชื่อที่ถูกต้อง
Ajax มันจะส่งค่าที่ถูกต้องกลับมาได้ มันก็ขึ้นอยู่กับว่า echo อะไรออกมานั่นแหละครับ ลองไปตรวจดูโค้ดให้ละเอียด ว่ามีอะไรที่ echo ออกมาบ้าง
ในทางปฏิบัตินะครับ ผมไม่แนะนำวิธีนี้
ลองเรียก http://xxx.com/path/to/database.txt ดูครับ จะเห็นว่าจะได้ไฟล์ database มา ซึ่งไม่คุ้มเลยครับ อย่าบอกนะว่า เข้ารหัสไว้ md5 สามารถถอดได้ด้วยโปรแกรมครับ (มีเว็บแนวนี้เยอะแยะ)
if($ข้อมูลการ Login ของ User ส่งมาโดยเข้ารหัสแล้ว = $ข้อมูลขากฐานข้อมูลที่นำมาเข้ารหัส){
คำสั่งทำงาน;
}
มาคิดทบทวนดูแล้ววิธีข้างบนนี้ เปล่าประโยชน์จริงๆ
//ตรวจสอบข้อมูลโดย
if($username==$member[6] and $password==$member[7]){
session_start();
$session_id=session_id();
//กำหนดตัวแปรเก็บค่าจาก Array member[0] - member[7]
$member_privileges=$member[0];
$member_position=$member[1];
$member_fname=$member[2];
$member_lname=$member[3];
$member_nickname=$member[4];
$member_facename=$member[5];
$member_username=$member[6];
$member_password=$member[7];
//ลงทะเบียน ตัวแปรเหล่านี้
session_register("member_privileges");
session_register("member_position");
session_register("member_fname");
session_register("member_lname");
session_register("member_nickname");
session_register("member_facename");
session_register("member_username");
session_register("member_password");
//แล้วส่งเมสเสนี้ออกไป
sendResponse("success", "location: complete.php");
/* ฟังก์ชั่นที่จะถูกเรียกกลับ (callback) หลังจากได้รับ response จากเพจ chk_login.php แล้ว */
function sendDataCallback(data) ทำงาน
ตอนนี้ได้ค่าทั่งหมดไว้ในตัวแปรแล้ว ซึ่งก็คือ
สิทธิการใช้งาน|ตำแหน่งหน้าที่|ชื่อจริง|นามสกุล|ชื่อเล่น|นามแฝง|ชื่อ Login|รหัสผ่านที่ถูกเข้ารหัส
ทีนี้ -- > ที่ถามว่า
ปัญหามันอยู่ที่ ชื่อ+password ที่ไม่ได้เข้ารหัสอยู่ที่ไหน
ผมเดาเอาว่าไฟล์ password.txt คงเก็บแต่ ชื่อ+password ที่เข้ารหัสไว้ ถ้าเป็นแบบนั้น แล้วชื่อจริง pass จริง (หรือจะชื่จริงอย่างเดียวก็ตาม) จะเอาจากไหนแสดง
ก็คือ ค่าพวกนี้
สิทธิการใช้งาน|ตำแหน่งหน้าที่|ชื่อจริง|นามสกุล|ชื่อเล่น|นามแฝง|ชื่อ Login|รหัสผ่านที่ถูกเข้ารหัส
ซึ่งมีเพียงตัวเดียวที่ถูกเข้ารหัส คือ รหัสผ่าน
ส่วนการแสดงผลที่ echo ออกมา อยู่ในหน้า complete.php ที่รอการ redirect ไป
และก็มีแค่นี้
<?php
session_start();
$_SESSION['member_privileges'];
$_SESSION['member_position'];
$_SESSION['member_fname'];
$_SESSION['member_lname'];
$_SESSION['member_nickname'];
$_SESSION['member_facename'];
$_SESSION['member_username'];
$_SESSION['member_password'];
echo $member_privileges;
echo $member_position;
echo $member_fname;
echo $member_lname;
echo $member_nickname;
echo $member_facename;
echo $member_username;
echo $member_password; //ค่าของตัวนี้เข้ารหัสไว้
?>
ในการแสดงผลนั้น เป็นดังนี้
สิทธิการใช้งาน
ตำแหน่งหน้าที่
ชื่อจริง
นามสกุล
ชื่อเล่น
นามแฝง
ชื่อ Login
รหัสผ่านที่ถูกเข้ารหัส
ด่เนรำเ
Ajax มันจะส่งค่าที่ถูกต้องกลับมาได้ มันก็ขึ้นอยู่กับว่า echo อะไรออกมานั่นแหละครับ ลองไปตรวจดูโค้ดให้ละเอียด ว่ามีอะไรที่ echo ออกมาบ้าง
ตรงนี้ไง
var promptDiv = document.getElementById("promptDiv");
ตรง promptDiv.innerHTML = "ล็อกอินสำเร็จ กำลังจะเข้าสู่เพจ " + respMessage;
respMessage ที่ Login สำเร็จ คือ sendResponse("success", "location: complete.php");
respMessage ที่ Login ไม่สำเร็จ คือ sendResponse("error", "ค้นพบชื่อ username ตรงฐานข้อมูลที่มีอยู่ แต่รหัสผ่านของคุณ
8d2eb64b9d3c8dd96c7cdb73d1f44013411177460cca7f93032619f49ac21717
ไม่ตรงกับฐานข้อมูลที่มีอยู่
");
และ sendResponse("error", "ค้นพบรหัสผ่านของคุณ
95a6f18e191ab727096becd05641830c5e276c71407f2d289d3e46a171a92f2a
ตรงกับฐานข้อมูลที่มีอยู่ แต่ชื่อของคุณ
d.fjbnj
ไม่ตรงกับฐานข้อมูลที่มีอยู่
");
switch (respStatus) {
case "success":
promptDiv.style.color = "green";
promptDiv.innerHTML = "ล็อกอินสำเร็จ กำลังจะเข้าสู่เพจ " + respMessage;
//ตั้งเวลา 2 วินาทีให้เรียกฟังก์ชั่น redirectTo โดยส่งค่าของ respMessage ไปเป็นอาร์กิวเมนต์
setTimeout("redirectTo('" + respMessage + "')", 2000);
break;
case "error":
promptDiv.style.color = "red";
promptDiv.innerHTML = respMessage;
break;
}
}
ต่อ---------->>
จาก function authenticateUser() มีการกำหนดค่าไว้ดัวนี้
ต่อ---------->>
จาก function authenticateUser() มีการกำหนดค่าไว้ดัวนี้
ทำไมตกมาอยู่ข่าล่างได้ มันอยู่ตรงตรวจสอบข้อมูลต่างหาก
ลองตรวจสอบดูการวนลูปตรวจสอบรหัสผ่านซิครับ ดูเหมือนว่า เมื่อพบ user ที่ต้องการแล้ว มันไม่ได้ return ค่าออกมาเลย (ดูจากฟังก์ชั่น authenticateUser)
เมื่อพบ user ที่ถูกต้องแล้ว มันควรคืนค่าออกมาแล้วหยุดการทำงานไปเลยครับ
อีกอย่าง ตอนคืนค่ากลับมาควรคืนค่ากลับมาจากค่า ที่ อ่านได้ครับ ถ้าเอาจากค่าที่ส่งมามันก็ต้องเป็นค่าที่เข้ารหัสครับ sendResponse("error", "<div>ค้นพบชื่อ</div>
".$username."
<div>ตรงฐานข้อมูลที่มีอยู่</div>
<div>แต่รหัสผ่านของคุณ</div>
".$password."
<div>ไม่ตรงกับฐานข้อมูลที่มีอยู่</div>
");
ตัวแปรทั้ง 2 ควรเป็นค่าที่ได้จาก db คือ $member_username และ $member_password ครับ
อ้อ อย่าลืมพิจารณาตามคำตอบที่ 3 ด้วยนะครับ ในกรณีท้ายสุดในคำตอบ
ลองตรวจสอบดูการวนลูปตรวจสอบรหัสผ่านซิครับ ดูเหมือนว่า เมื่อพบ user ที่ต้องการแล้ว มันไม่ได้ return ค่าออกมาเลย (ดูจากฟังก์ชั่น authenticateUser)
แย่.........!! ดีใจจัง ตรงนี้ลืมจริงๆ แก้แล้วๆ จ๊ะ
เมื่อพบ user ที่ถูกต้องแล้ว มันควรคืนค่าออกมาแล้วหยุดการทำงานไปเลยครับ
ตอนนี้หยุดสนิทเลย กระโดดกระเด็นออกจาก Loop เลยฮั๊บ
อ้อ อย่าลืมพิจารณาตามคำตอบที่ 3 ด้วยนะครับ ในกรณีท้ายสุดในคำตอบ
ตอนนี้ ยังมึนๆ อยู่ฮะ
ลองเรียก http://xxx.com/path/to/database.txt ดูครับ จะเห็นว่าจะได้ไฟล์ database มา ซึ่งไม่คุ้มเลยครับ อย่าบอกนะว่า เข้ารหัสไว้ md5 สามารถถอดได้ด้วยโปรแกรมครับ (มีเว็บแนวนี้เยอะแยะ)
ที่แน่ๆ เข้ารหัสด้วย MD5
นำผลที่ได้มาเข้ารหัส SHA1
นำผลที่ได้มาเข้ารหัส SHA256 เป็นอันดับสุดท้าย
(หนักไปรึป่าวเนี่ย)
****************************************************
** ตอนนี้แก้ปัญหาได้แล้วเหลือข้อสุดท้าย **
** ตรง Loop ยังติดอยู่ตรงที่ว่า ถ้า User กับ Pass ไม่ตรงเลย **
** จะมีการแจ้ง Error อีกตัวที่เปรียวยังไม่ได้เขียน โดยมีการ **
** ตรวจสอบเปรียบเทียบชุดข้อมูลในฐานข้อมูลจนจบไฟล์ **
**แล้วค่อยหยุดการทำงาน และกระโดดออกจาก Loop อย่างถูกต้อง**
****************************************************
555+++
1. เปลี่ยนวิธีเก็บเป็นแบบอื่น เช่นเก็บเป็น php แล้วใช้ตัวแปร หรือ
2. เข้ารหัสส่วนข้อมูล ชือจริง นามสกุลจริง หรือ อะไรก็ตามที่คาดว่า จะใช้ดาวน์โหลดได้ โดยใช้การเข้ารหัสที่ถอดกลับได้ (มีบนเว็บ) ต้องไม่ลืมนะว่า เข้ารหัสได้ ก็ถอดรหัสได้ ถ้าพยายาม ดังนั้นผมมองว่า ไม่ควรให้เขาได้ไฟล์นี้ไป
3. ก็ไม่ยากนี่ ปล่อยให้วนลูปตรวจสอบไป ถ้า ถูกต้องมันก็ return ออกไปก่อน ถ้าไม่พบ มันก็จะทำงานถึงบรรทัดสุดท้ายของฟังก์ชั่น ถ้าถึงบรรทัดสุดท้าย ก็ให้ return ข้อผิดพลาดมาแทน
ขอโทษครับคุณน้าช่วยขยายความตรงนี้หน่อยฮะ
1. เปลี่ยนวิธีเก็บเป็นแบบอื่น เช่นเก็บเป็น php แล้วใช้ตัวแปร หรือ
ส่วนใน ข้อ 2. อันนี้ขอช่วยแสดงตัวอย่างด้วยฮะ จะได้มองภาพได้ชัดเจนขึ้น
และ ไม่ควรให้เขาได้ไฟล์นี้ไป หมายถึง database.txt อ๊ะป่าว หรือตัวไฟล์ที่ทำหน้าที่เข้ารหัส <-- เข้าใจว่าน่าจะเป็นอันนี้
ข้อ 3. เป็นวิธีง่ายๆ ที่ทำให้เปรียวรู้สึกว่าตัวเองโง่จัง 555++
ขอขอบคุณ คุณน้ามากเลยฮะ
** ถ้าจะลงลึกในเรื่อง Login ให้ปลอดภัย มากกว่านี้ เปรียวขออนุญาตปรึกษาทาง goragod@yahoo.com ได้รึป่าวฮะ (เพราะบางสิ่งบางอย่างต้องเป็นความลับ)
ไฟล์นามสกุล txt (และอื่นๆอีกหลายไฟล์) เป็นไฟล์ที่สามารถดาวน์โหลดได้จาก web browser มันจึงไม่ปลอดภัย ส่วนไฟล์ที่ทำหน้าที่เข้ารหัส มักเป็น php อันนี้ไม่มีปัญหา
ข้อ 1 และ 2 ผมบอกแล้ว ว่ามีบนเว็บ ถ้าจะลองหาดู
ถ้าจำเป็นต้องเก็บเป็น text ผมแนะนำพวก database text ดีกว่ามั้ย น่าจะทำให้งานง่ายขึ้น สามารถหาได้จากทุกโปรเจ็คบนเว็บ ล่าสุดเลยก็ GCMS ซึ่งใช้ ฐายข้อมูล text ล้วนๆ
ส่วน msn ผมไม่อยากให้ใช้ เนื่องจากส่วนใหญ่ผมเอาไว้ติดต่องาน ทำให้บางครั้งไม่สะดวกที่จะตอบ แต่ที่สำคัญที่สุด ผมว่าการถามคำถามบนบอร์ด ถึงจะตอบช้าซักหน่อย แต่มันก็อาจจะเป็นประโยชน์ต่อท่านอื่นด้วย ส่วนถ้าจำเป็นต้องส่งไฟล์ให้ผมก็ยังส่งผ่านเมล์ได้
ปล. ผมว่าบางทีเรื่องที่คิดว่าลับมันก็ไม่ลับหรอกนะ ขึ้นกับความเต็มใจมากกว่า ยิ่งเปิดเผยมากเท่าไร ก็อาจได้ความช่วยเหลือ หรือแนวคิดจากคนอื่นหลายๆคนมากขึ้นเท่านั้น
เปรียวเก็บ Username Password และข้อมูลอื่นๆ ไว้ใน ไฟล์ที่ไม่รู้ว่าจะมีใครรู้จักมันอ๊ะป่าว
โค้ดไฟล์ส่วนที่เข้ารหัสทั้งหมด เป็น "จาวา" ฮะ
คำถามบนบอร์ด ตอบมาไม่ได้ช้าเลย (เร็วทันใจดีด้วยซ้ำ )
เดี๋ยวผมส่งไฟล์ทั้งโปรเจ็คนี้ไปให้พิจารณาเลยแล้วกัน ที่เมล์นี้เลยรึป่าวฮะ goragod@yahoo.com
หรือจะไปทดสอบโปรเจ็คท์ก่อนได้ที่ http://krajay.thport.com