Bảo vệ phiên làm việc của bạn
Theo mặc định, thông tin phiên làm việc trong PHP được viết vào một thư mục tạm thời. Hãy xem xét biểu mẫu trong Liệt kê 5, nó cho thấy cách lưu một mã nhận dạng người sử dụng và số tài khoản trong một phiên làm việc.
Liệt kê 5. Lưu trữ dữ liệu trong phiên
<?php
session_start();
?>
<html>
<head>
<title>Storing session information</title>
</head>
<body>
<?php
if ($_POST['submit'] == 'Save') {
$_SESSION['userName'] = $_POST['userName'];
$_SESSION['accountNumber'] = $_POST['accountNumber'];
}
?>
<form id="myFrom" action="<?php echo $_SERVER['PHP_SELF']; ?>"
method="post">
<div><input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="text" name="userName"
value="<?php echo(isset($_POST['userName']) ? $_POST['userName'] : ''); ?>" />
<br />
<input type="text" name="accountNumber"
value="<?php echo(isset($_POST['accountNumber']) ?
$_POST['accountNumber'] : ''); ?>" />
<br />
<input type="submit" value="Save" name="submit" /></div>
</form>
</body>
</html>
Liệt kê 6 cho thấy nội dung của thư mục /tmp.
Liệt kê 6. Các tệp tin phiên trong thư mục /tmp
-rw------- 1 _www wheel 97 Aug 18 20:00 sess_9e4233f2cd7cae35866cd8b61d9fa42b
Như bạn có thể thấy, tệp tin phiên, khi được in ra (xem Liệt kê 7), chứa các thông tin trong một định dạng khá dễ đọc. Vì tệp tin phải đọc được và viết được đối với người sử dụng máy chủ web, các tệp tin phiên này có thể tạo ra một vấn đề lớn đối với bất cứ người nào trên một máy chủ chia sẻ. Người nào đó không phải là bạn có thể viết một kịch bản lệnh đọc các tệp tin này để họ có thể thử lợi dụng phiên làm việc đó.
Liệt kê 7. Nội dung của một tệp tin phiên
userName|s:5:"ngood";accountNumber|s:9:"123456789";
Bạn có thể làm hai điều để bảo vệ dữ liệu phiên của bạn. Trước tiên là mã hóa mọi thứ mà bạn đưa vào phiên. Tuy nhiên chỉ riêng việc bạn đã mã hóa dữ liệu không có nghĩa là nó đã an toàn trọn vẹn, do đó hãy cẩn thận, đừng tin tưởng vào việc này như là phương tiện duy nhất của bạn để bảo vệ phiên làm việc của mình. Có cách khác là lưu dữ liệu phiên của bạn ở một nơi khác, ví dụ như một cơ sở dữ liệu. Bạn vẫn phải đảm bảo rằng bạn đang khóa kín cơ sở dữ liệu của bạn, nhưng cách tiếp cận này giải quyết được hai vấn đề: Trước nhất, nó đặt dữ liệu của bạn vào một nơi an toàn hơn một hệ thống tệp tin chia sẻ; thứ hai, nó cho phép ứng dụng của bạn mở rộng trải ra bao gồm nhiều máy chủ web dễ dàng hơn với các phiên được chia sẻ xuyên qua nhiều máy chủ.
Để thực hiện ghi lưu bền vững các dữ liệu về phiên làm việc của chính bạn, xem hàm
session_set_save_handler() trong PHP. Dùng nó, bạn có thể lưu trữ thông tin phiên trong một cơ sở dữ liệu hoặc triển khai thực hiện một trình xử lý (handler) để mã hoá và giải mã toàn bộ các dữ liệu của bạn. Liệt kê 8 cung cấp một thí dụ về cách sử dụng hàm này và các hàm khung cho việc triển khai thực hiện. Bạn cũng có thể kiểm tra các thí dụ về cách sử dụng một cơ sở dữ liệu trong phần Tài nguyên.
Liệt kê 8. Ví dụ về hàm session_set_save_handler()
function open($save_path, $session_name)
{
/* custom code */
return (true);
}
function close()
{
/* custom code */
return (true);
}
function read($id)
{
/* custom code */
return (true);
}
function write($id, $sess_data)
{
/* custom code */
return (true);
}
function destroy($id)
{
/* custom code */
return (true);
}
function gc($maxlifetime)
{
/* custom code */
return (true);
}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
Không có nhận xét nào:
Đăng nhận xét