CodeIgnitor: Security

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Bài viết này mô tả một số vấn đề thực tế và quan trọng nhất về bảo mật web và cũng trình bày chi tiết về các tính năng bảo mật web của CodeIgniter.

Bảo mật URI

CodeIgniter khá chặt chẽ về việc sử dụng các ký tự trong chuỗi URI nhằm giúp giảm thiểu khả năng dữ liệu độc hại có thể truyền được qua ứng dụng. URI chỉ có thể chứa những điều sau:

  • Các ký tự chữ và số (chỉ được là các ký tự latin)
  • Dấu ngã: ~
  • Ký hiệu phần trăm: %
  • Dấu chấm: .
  • Dấu hai chấm: :
  • Dấu gạch dưới: _
  • Dấu trừ: -
  • Dấu cách (Space)

register_globals

Khi khởi tạo tất cả các biến global thì các biến $_GET$_POST$_REQUEST và $_COOKIE sẽ bị hủy. Ta thực hiện điều này bằng cách sử dụng câu lệnh register_globals = off;

display_errors

Trong chế độ production ta thường mong muốn vô hiệu hóa thông báo lỗi của PHP vì lý do thông báo lỗi có thể chứa những thông tin nhạy cảm, và ta có thể thực hiện điều này bằng cách đặt cờ display_errors thành 0.

Thiết lập hằng ENVIRONMENT của CodeIgniter trong tập tin index.php thành giá trị là 'production' sẽ tắt được các lỗi này, còn ở chế độ development thì khuyến nghị giá trị là 'development'.

magic_quotes_runtime

magic_quotes_runtime được tắt khi khởi tạo hệ thống, vì thế mà ta không phải bỏ dấu xổ phải khi truy xuất dữ liệu từ cơ sở dữ liệu.

Best Practices

Trước khi chấp nhận bất kỳ dữ liệu nào trong ứng dụng của bạn như dữ liệu được POST khi submit form, dữ liệu COOKIE, URI, XML-RPC, hoặc kể cả là dữ liệu từ mảng SERVER, thì bạn nên thực hiện ba bước sau:

  1. Đảm bảo dữ liệu đúng loại, kiểu, độ dài, kích thước, ...

  2. Lọc dữ liệu có vấn đề.

  3. Hủy dữ liệu trước khi đưa nó vào cơ sở dữ liệu hay hiển thị ra trình duyệt.

CodeIgniter cung cấp các hàm và các hướng dẫn sau để hỗ trợ bạn xử lý các bước trên:

Lọc XSS

CodeIgniter có chứa bộ lọc Cross Site Scripting. Bộ lọc này có nhiệm vụ tìm ra những kỹ thuật được sử dụng phổ biến để nhúng mã độc JavaScript vào dữ liệu của ta, hoặc các kiểu mã lệnh khác nhằm chiếm quyền điều khiển cookie hoặc làm những điều nguy hiểm khác.

Lưu ý
XSS chỉ nên được thực hiện ở đầu ra, việc lọc dữ liệu đầu vào có thể làm thay đổi dữ liệu như bỏ đi các ký tự đặc biệt ở mật khẩu, dẫn đến giảm đi khả năng bảo mật.

Bảo vệ CSRF

CSRF là các ký tự viết tắt của Cross-Site Request Forgery, nó là một dạng tấn công nhằm đánh lừa nạn nhân để họ cố ý gửi một yêu cầu nào đó.

CodeIgniter cung cấp mức bảo vệ CSRF ngoài khối, nó sẽ tự động được kích hoạt cho mỗi yêu cầu không phải là GET HTTP, nhưng bạn cũng cần tạo form submit theo cách thông thường.

Xử lý Password

Một điều rất quan trọng cần thực hiện được đó là xử lý tốt các mật khẩu trong ứng dụng của bạn.

Tuy nhiên, nhiều nhà phát triển lại không biết cách thực hiện, và các trang web thì luôn đưa ra các cảnh báo và lỗi, nhưng ta không khắc phục được nó.

Dưới đây là các gợi ý nên làm và không nên làm để giúp bạn thực hiện:

  • Không lưu mật khẩu theo dạng văn bản thông thường.

    Cần luôn tạo mã băm cho mật khẩu.

  • Không sử dụng kiểu mã hóa Base64 hoặc tương tự để lưu mật khẩu, bởi vì kiểu mã hóa này tương tự như plain-text (văn bản thông thường).

    Encoding, and encryption too, are two-way processes. Passwords are secrets that must only be known to their owner, and thus must work only in one direction. Hashing does that - there’s no un-hashing or de-hashing, but there is decoding and decryption.

  • Không sử dụng các thuật toán băm yếu hoặc bị hỏng như MD5 hay SHA1.

    Những thuật toán này đã cux và đã được chứng mình là có thiếu sót, và không được thiết kế để băm mật khẩu ở vị trí đầu tiên.

    Ngoài ra, không được phát mình ra thuật toán của riêng bạn.

    Chỉ sử dụng các thuật toán băm mật khẩu như BCrypt, nó được sử dụng trong các hàm băm mật khẩu dành riêng cho PHP.

    Bạn nên sử dụng chúng, ngay cả khi bạn không sử dụng bản PHP 5.5+, vì CodeIgniter sẽ cung cấp chúng cho bạn điều này từ phiên bản PHP version 5.3.7. Nếu bạn sử dụng phiên bản nhỏ hơn bạn nên nâng cấp.

    Trường hợp bạn không không thể nâng cấp lên phiên bản PHP hiện thời thì bạn sử dụng hash_pbkdf() <http://php.net/hash_pbkdf2>.

  • Không hiển thị hay gửi mật khẩu dưới dạng văn bản thông thường plain-text!

    Ngay cả với chủ sở hữu mật khẩu thì nếu bạn cần sử dụng tính năng "Quên mật khẩu", bạn chỉ cần tạo ngẫu nhiên một mật khẩu mới và gửi nó đi chứ không gửi đi mật khẩu cũ.

  • Không được thiết lập những giới hạn không cần thiết đối với mật khẩu người dùng.

    Nếu bạn đang sử dụng thuật toán băm khác mà không phải BCrypt (giới hạn tới 72 ký tự), thì bạn nên thiết lập giới hạn ở mức cao đối với độ dài mật khẩu để giảm thiểu các cuộc tấn công DoS, ví dụ như để độ dài 1024 ký tự chẳng hạn.

Validate dữ liệu đầu vào

CodeIgniter đã có sẵn một thư viện Form Validation để hỗ trợ bạn validating, lọc và sửa dữ liệu.

Trong bất kỳ hoàn cảnh nào bạn cũng phải đảm bảo rằng dữ liệu đầu vào luôn luôn được validate và phải 'sạch sẽ'. Ví dụ, nếu bạn mong muống đầu vào là một chuỗi số thì bạn có thể sử dụng hàm is_numeric() hoặc ctype_digit(). Luôn luôn cố gắng giảm xuống mức thấp nhất có thể việc kiểm tra một mẫu nhất định.

Luôn nhớ rằng không chỉ có các biến $_POST và $_GET, bạn còn có các cookie, chuỗi tác nhân người dùng và về cơ bản là tất cả các dữ liệu mà không được tạo trực tiếp từ mã lệnh của chính bản.

Bỏ đi tất cả các dữ liệu trước khi chèn vào database

Không bao giờ được chèn thông tin vào database mà trước đó chưa xóa bỏ chúng. Vui lòng xem thêm tại database queries.

Ẩn tập tin của bạn

Một cách thức bảo mật thực tế tốt nữa là tại thư mục gốc của website (thường là thư mục có tên "htdocs/") bạn chỉ nên đặt tập tin index.php và các tập tin tài nguyên khác (.js, .css và các tập tin ảnh). Đây là những tập tin duy nhất mà bạn cần để truy cập từ trang web.

Điều này sẽ cho phép khách viếng thăm có thể xem được tất cả các tập tin này, thực hiện các kịch bản, ... Nếu bạn không cho phép làm điều đó thì bạn sử dụng tập tin .htaccess để ngăn chặn hoặc hạn chế truy cập.

CodeIgniter đã tạo săn file index.html trong tất cả các thư mục để nhằm mục đích ẩn đi những dữ liệu này, nhưng cần lưu ý là nó không đủ khả năng ngăn chặn những cuộc tấn công nguy hiểm.

» Tiếp: Lớp Pagination
« Trước: URI Routing
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!