- Đăng ký kênh tại đây: https://www.youtube.com/channel/UCXjV9sLt3WgamL7vofLofow?sub_confirmation=1
- Trang fan page: https://www.facebook.com/lophocvitinhcom
- Trang web: http://lophocvitinh.com
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
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 và $_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.
Ở 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.
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:
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.
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 đú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ó!
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 và $_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,…).
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:
- Đăng ký kênh tại đây: https://www.youtube.com/channel/UCXjV9sLt3WgamL7vofLofow?sub_confirmation=1
- Trang fan page: https://www.facebook.com/lophocvitinhcom
- Trang web: http://lophocvitinh.com
By #drM
Nguồn: User Guide – General Topics
Không có nhận xét nào:
Đăng nhận xét