NTM Solutions

Thứ Ba, 18 tháng 12, 2018

Tự học CodeIgniter-Bài 24-Bảo mật web

#hoccodeigniter


Trang này mô tả vài “ví dụ kinh điển” liên quan đến bảo mật web, và các chi tiết của tính năng bảo mật trong CodeIgniter.
Ghi chú:
Nếu bạn muốn tìm liên hệ khi có vấn đề về bảo mật vui lòng tham khảo tại: user_guide/contributing/index.html
Bảo mật URI

CodeIgniter có khả năng hạn chế tốt các ký tự trong chuỗi URI nhằm giảm thiểu khả năng tác hại  của dữ liệu khi truyền vào ứng dụng của bạn. Các URIs chỉ có thể chứa các ký tự sau:
·         Chữ cái và số (chỉ ký tự latin)
·         Dấu ngã ~
·         Dấ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 khoảng

Register_globals

Trong suốt quá trình khởi tạo của hệ thống tất cả biến toàn cục tồn tại trong $_GET, $_POST, $_REQUEST$_COOKIE được hủy thiết lập.
Việc hủy thiết lập này có thể thực hiện bằng cách register_globals = off.
display_errors

Ở chế độ “production” , người ta thường muốn “hủy kích hoạt” tính năng báo cáo lỗi của PHP bằng thiết lập cờ display_errors có giá trị là 0. Thao tác này sẽ làm vô hiệu các lỗi nội tại PHP xuất ra thông báo, vốn dĩ có khả năng vô tình làm lộ thông tin nhạy cảm.
Việc thiết lập hằng số ENVIRONMENT  trong tập tin index.php thành giá trị ‘production’ sẽ tắt các báo lỗi này. Khi đang phát triển ứng dụng, tôi khuyến cáo các bạn nên thiết lập giá trị là ‘development’. Để hiểu rõ hơn về sự khác biệt của các môi trường ứng dụng các bạn xem thêm: bài 22-Xử lý trên nhiều môi trường
magic_quotes_runtime

Điều khiển magic_quotes_runtime bị tắt đi trong suốt quá trình khởi tạo hệ thống do đó bạn không phải xóa các dấu gạch chéo khi nhận dữ liệu từ cơ sở dữ liệu của bạn.
Best Practices

Trước khi nhận bất kỳ dữ liệu nào vào ứng dụng , cho dù là dữ liệu POST gửi từ 01 biểu mẫu, dữ liệu COOKIE, dữ liệu URI, dữ liệu XML-RPC, hoặc ngay cả dữ liệu từ mảng SERVER, bạn nên thực hiện 03 bước sau:
1.      Kiểm tra dữ liệu để bảo đảm nó đúng theo kiểu dữ liệu mong muốn, kích thước, dung lượng, v.v.
2.      Lọc dữ liệu để ngừa mã độc.
3.      Lược dữ liệu trước khi gửi nó đến cơ sở dữ liệu hoặc xuất ra trình duyệt.
CodeIgniter cung cấp các hàm và thủ thuật sau đây để hỗ trợ bạn làm chuyện này:
Lọc XSS

CodeIgniter có tính năng lọc Cross Site Scripting. Nó lọc các đoạn mã JavaScript được nhúng vào dữ liệu dùng trong các kỹ thuật tấn công thông dụng, hoặc các đoạn mã khác dùng hijack cookies hoặc làm những thứ độc hại. Bộ lọc XSS được mô tả chi tiết tại user_guide/libraries/security.html
Ghi chú:
Việc lọc XSS  chỉ nên thực hiện đối với dữ liệu xuất. Nếu lọc dữ liệu nhập có thể làm thay đổi dữ liệu theo cách không mong muốn, trong đó có cả việc lột bỏ các ký tự đặc biệt của mật khẩu , làm giảm đi thay vì tăng cường tính bảo mật.

Bảo vệ CSRF

CSRF là chữ viết tắt của Cross-Site Request Forgery, là kỹ thuật tấn công lừa nạn nhân vô  ý gửi thông tin đi mà không hay biết.
CodeIgniter cung cấp tính năng bảo vệ CSRF ở lớp ngoài, nó không chỉ tự động bẫy các yêu cầu HTTP không thuộc dạng GET, mà còn giúp bạn tạo các biểu mẫu theo 01 cách an toàn.
Mục này được giải thích rõ trong tài liệu về lớp Security: user_guide/libraries/security.html
Xử lý mật khẩu

Xử lý mật khẩu đúng cách trong ứng dụng là việc rất quan trọng.
Không may là nhiều lập trình viên không biết cách xử lý như thế nào, và trên các trang web thì đầy những hướng dẫn lỗi thời hoặc thậm chí không đúng đắn , không giúp ích được gì.
Tôi sẽ đưa ra 01 danh sách kết hợp các điều NÊN và KHÔNG NÊN làm dưới đây:
·         KHÔNG lưu mật khẩu ở dạng văn bản thuần.
Luôn luôn phải băm các mật khẩu của bạn (xem hàm băm trong bài 15-hàm tương thích).
·         KHÔNG sử dụng Base64 hoặc chuyển mã khi lưu trữ mật khẩu.
Điều này cũng tốt như việc lưu trữ chúng ở dạng văn bản thuần. Thật đấy. Hãy băm đừng chuyển mã (encoding).
Chuyển mã cũng như mã hóa , là tiến trình 02 chiều (nghĩa là sau khi chuyển mã xong có thể dịch ngược lại văn bản gốc). Mật khẩu là bí mật và chỉ được nhận biết bởi chủ nhân của nó, do đó điều này chỉ nên diễn ra theo 01 chiều . Thao tác băm là 01 thao tác như vậy – không có thao tác hủy băm hay dịch ngược lại văn bản gốc, nhưng có thao tác dịch mã ngược lại văn bản gốc khi chuyển mã hay mã hóa (decode-decryption).
·         KHÔNG dùng các thuật toán băm yếu hoặc có lỗ hổng như MD5 hoặc SHA1.
Các giải thuật này đã cũ, đã được chứng minh có lỗ hổng, và không được ưu tiên thiết kế  cho việc băm mật khẩu.
Và cũng KHÔNG NÊN tạo ra các giải thuật của riêng bạn.
Chỉ dùng giải thuật băm mật khẩu mạnh mẽ như BCrypt, vốn dĩ được dùng trong hàm băm của PHP. Xem thêm tại Password Hashing
Hãy dùng chúng , ngay cả khi bạn không chạy PHP 5.5+, CodeIgniter sẽ cung cấp cho bạn.
·         KHÔNG BAO GIỜ hiển thị hoặc gửi 01 mật khẩu ở dạng văn bản thuần!
Ngay cả khi là người tạo ra mật khẩu, nếu bạn cần 01 tính năng “Đã quên mật khẩu”, chỉ việc tạo 01 mật khẩu mới ngẫu nhiên , loại mật khẩu dùng 01 lần (điều này rất quan trọng) và gửi mậ khẩu thay thế này đi.
·         KHÔNG đặt các giới hạn không cần thiết cho mật khẩu người dung.
Nếu bạn đang dùng 01 thuật toán băm khác ngoài BCrypt (loại có giới hạn 72 ký tự), bạn nên thiết lập giới hạn về chiều dài lớn nhất của mật khẩu nhằm nhằm giảm thiểu các cuộc tấn công DoS – ví dụ như loại thuật toán có 1024 ký tự.
Ngoài trường hợp đó, không có 01 qui tắc ép buộc 01 mật khẩu chỉ được giới hạn số ký tự, hoặc mật khẩu không thể chứa các ký tự đặc biệt.
Việc hạn chế này không những làm giảm tính bảo mật, mà còn có rất ít lí do để làm như vậy. Không có kỹ thuật hạn chế và ép buộc lưu trữ nào áp dụng một khi bạn băm nó!
Kiểm tra dữ liệu nhập vào

CodeIgniter có 01 thư viện Form Validation hỗ trợ bạn trong việc kiểm tra, lọc, và chuẩn bị dữ lieu.
Ngay cả khi các thư viện đó không hỗ trợ được trường hợp của bạn mong muốn, bạn cũng phải luôn tìm cách kiểm tra và làm sạch tất cả dữ liệu nhập vào. Ví dụ, nếu bạn muốn dữ liệu biến nhập vào là 01 chuỗi số, bạn có thể kiểm tra bằng hàm is_numeric() hoặc ctype_digit(). Hãy luôn tìm cách thu hẹp các phạm vi kiểm tra tương ứng với 01 kiểu mẫu nào đó.
Hãy nhớ trong đầu rằng việc kiểm tra này không chỉ gồm các biến $_POST$_GET , mà còn bao gồm luôn cả cookies, chuỗi user-agent và cơ bản là bao gồm tất cả dữ liệu không được tạo trực tiếp bằng dòng mã của bạn (ví dụ:dữ liệu người dùng,…).

Lọc tất cả dữ liệu trước khi chèn vào cơ sở dữ liệu

KHÔNG BAO GIỜ chèn thông tin vào cơ sở dữ liệu của bạn mà không lược bớt. Vui lòng đọc hướng dẫn trong mục truy vấn cơ sở dữ liệu (Escaping queries) : user_guide/database/queries.html
Ẩn tập tin

01 trường hợp bảo mật trong thực tế khác là chỉ đặt tập tin index.php và các tài nguyên “assets” (ví dụ: js, css và các tập tin ảnh) dưới thư mục chứa web của máy chủ (thường là thư mục có tên như “htdocs/” hay trong WAMP là “www”). Đây là những tập tin duy nhất mà bạn có thể truy cập từ web.
Việc cho phép người dùng thấy bất kỳ thứ gì khác có khả năng cho phép họ quyền truy cập dữ liệu nhạy cảm, thực thi các đoạn scripts, v.v.
Nếu bạn muốn chặn truy cập tài nguyên, bạn có thể thử dùng 01 tập tin .htaccess
CodeIgniter có 01 tập tin  index.html trong tất cả các thư mục con nhằm che dấu 01 vài thông tin, nhưng bạn hãy nhớ trong đầu rằng trò này chưa đủ để ngăn các cuộc tấn công nghiêm trọng.
Nếu vẫn chưa rõ các bạn xem thêm video clip sau:


By #tiensim
Nguồn: User Guide – General Topics
Facebook Youtube Google+