Thứ Ba, 9 tháng 9, 2014

THỦ THUẬT VỚI PHP PHẦN 2

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";

Lưu mật khẩu

Mật khẩu sẽ tuyệt đối không bao giờ được lưu giữ ở dạng văn bản rõ ở bất kỳ nơi nào — không được nằm trong một cơ sở dữ liệu, phiên làm việc, hệ thống tệp tin, hoặc ở bất kỳ dạng nào khác. Cách tốt nhất để xử lý các mật khẩu là lưu chúng đã mã hóa và so sánh với các mật khẩu đã mã hóa với nhau. Mặc dù điều này có vẻ là hiển nhiên, song việc lưu giữ chúng ở dạng văn bản rõ dường như được làm khá nhiều trong thực tế. Bất cứ khi nào bạn sử dụng một trang web mà có thể gửi cho bạn mật khẩu của bạn thay vì việc đặt lại, điều đó có nghĩa là hoặc mật khẩu được lưu ở dạng văn bản rõ hoặc đã có mã lệnh sẵn để giải mã mật khẩu nếu nó được mật mã hóa. Ngay cả ở trường hợp sau, mã lệnh để giải mã có thể tìm thấy và khai thác được.
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àmsession_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