Phalcon - Tính năng bảo mật
Phalcon cung cấp các tính năng bảo mật với sự trợ giúp của thành phần Bảo mật, giúp thực hiện các tác vụ nhất định như băm mật khẩu và Cross-Site Request Forgery (CSRF).
Mật khẩu băm
Hashingcó thể được định nghĩa là quá trình chuyển đổi một chuỗi bit có độ dài cố định thành một độ dài xác định theo cách mà nó không thể bị đảo ngược. Bất kỳ thay đổi nào trong chuỗi đầu vào sẽ thay đổi giá trị của dữ liệu được băm.
Quá trình giải mã dữ liệu băm diễn ra bằng cách lấy giá trị do người dùng nhập làm đầu vào và so sánh dạng băm giống nhau. Thông thường đối với bất kỳ ứng dụng dựa trên web nào, việc lưu trữ mật khẩu dưới dạng văn bản thuần túy là một việc làm không tốt. Nó dễ bị bên thứ ba tấn công vì những người có quyền truy cập vào cơ sở dữ liệu có thể dễ dàng mua mật khẩu cho bất kỳ người dùng nào.
Phalcon cung cấp một cách dễ dàng để lưu trữ mật khẩu ở dạng mã hóa tuân theo một thuật toán như md5, base64 hoặc là sh1.
Như đã thấy trong các chương trước, nơi chúng tôi tạo một dự án cho blog. Màn hình đăng nhập chấp nhận đầu vào là tên người dùng và mật khẩu cho người dùng. Để nhận mật khẩu từ người dùng và giải mã nó ở một dạng cụ thể, đoạn mã sau được sử dụng.
Mật khẩu được giải mã sau đó được khớp với mật khẩu được người dùng chấp nhận làm đầu vào. Nếu giá trị khớp, người dùng có thể đăng nhập thành công vào ứng dụng web nếu không sẽ có thông báo lỗi hiển thị.
<?php
class UsersController extends Phalcon\Mvc\Controller {
public function indexAction() {
}
public function registerUser() {
$user = new Users();
$login = $this->request->getPost("login");
$password = $this->request->getPost("password");
$user->login = $login;
// Store the hashed pasword
$user->password = $this->security->sh1($password);
$user->save();
}
public function loginAction() {
if ($this->request->isPost()) {
$user = Users::findFirst(array(
'login = :login: and password = :password:',
'bind' => array(
'login' => $this->request->getPost("login"),
'password' => sha1($this->request->getPost("password"))
)
));
if ($user === false) {
$this->flash->error("Incorrect credentials");
return $this->dispatcher->forward(array(
'controller' => 'users',
'action' => 'index'
));
}
$this->session->set('auth', $user->id);
$this->flash->success("You've been successfully logged in");
}
return $this->dispatcher->forward(array(
'controller' => 'posts',
'action' => 'index'
));
}
public function logoutAction() {
$this->session->remove('auth');
return $this->dispatcher->forward(array(
'controller' => 'posts',
'action' => 'index'
));
}
}
Các mật khẩu được lưu trữ trong cơ sở dữ liệu ở định dạng được mã hóa sh1 thuật toán.
Khi người dùng nhập tên người dùng và mật khẩu thích hợp, người dùng có thể truy cập vào hệ thống, nếu không, một thông báo lỗi sẽ được hiển thị dưới dạng xác nhận.
Yêu cầu trên nhiều trang web giả mạo (CSRF)
Đây là một cuộc tấn công buộc người dùng đã xác thực của ứng dụng web phải thực hiện một số hành động không mong muốn. Các biểu mẫu chấp nhận đầu vào từ người dùng dễ bị tấn công này. Phalcon cố gắng ngăn chặn cuộc tấn công này bằng cách bảo vệ dữ liệu được gửi qua các biểu mẫu bên ngoài ứng dụng.
Dữ liệu trong mỗi biểu mẫu được bảo mật với sự trợ giúp của việc tạo mã thông báo. Mã thông báo được tạo là ngẫu nhiên và nó được khớp với mã thông báo mà chúng tôi đang gửi dữ liệu biểu mẫu (chủ yếu là bên ngoài ứng dụng web thông qua phương thức POST).
Mã:
<?php echo Tag::form('session/login') ?>
<!-- Login and password inputs ... -->
<input type = "hidden" name = "<?php echo $this->security->getTokenKey() ?>"
value = "<?php echo $this->security->getToken() ?>"/>
</form>
Note - Điều quan trọng là sử dụng bộ điều hợp phiên trong khi gửi mã thông báo của biểu mẫu, vì tất cả dữ liệu sẽ được duy trì trong phiên.
Bao gồm bộ điều hợp phiên trong services.php bằng cách sử dụng mã sau.
/**
* Start the session the first time some component request the session service
*/
$di->setShared('session', function () {
$session = new SessionAdapter();
$session->start();
return $session;
});