Những rủi ro khi sử dụng Javascript là gì và cách tránh chúng?Rủi ro bảo mật Javascript?
Trả lời
Một trong những lỗi phổ biến nhất là HTML injection, cho phép các bên thứ ba chèn JavaScript vào ngữ cảnh bảo mật của bạn. Điều đó cho phép kẻ tấn công kiểm soát những gì người dùng thực hiện trên trang web của bạn, hoàn toàn phá vỡ bảo mật tài khoản.
Mặc dù đã có một số tiến trình chậm cố gắng để các tác giả web nhớ các chuỗi mã hóa HTML chúng xuất ra các trang web ở phía máy chủ (ví dụ: htmlspecialchars
trong PHP), một thế hệ webapps mới đang sử dụng cùng một chuỗi câm -concatenation hacks để tạo ra nội dung ở phía máy khách sử dụng JavaScript:
somediv.innerHTML= '<p>Hello, '+name+'</p>';
thường sử dụng jQuery:
$('table').append('<tr title="'+row.title+'"><td>'+row.description+'</td></tr>');
Đây chỉ là dễ bị tổn thương như tiêm HTML server-side và tác giả thực sự cần phải dừng lại buildin g nội dung theo cách này. Bạn có thể nội dung văn bản HTML mã hóa ở phía khách hàng, nhưng vì JS không có một built-in HTML encoder bạn phải làm điều đó cho mình:
function encodeHTML(s) {
return s.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"');
}
somediv.innerHTML= '<p>Hello, '+encodeHTML(name)+'</p>';
Tuy nhiên nó thường là tốt hơn để sử dụng các phương pháp DOM sẵn có và tài sản mà lọai trừ nhu cầu cho thoát:
var p= document.createElement('p');
p.appendChild(document.createTextNode('Hello, '+name);
và với jQuery sử dụng attr()
, text()
và tạo ra các phím tắt:
$('table').append(
$('<tr>', {title: row.title}).append(
$('<td>', {text: row.description})
)
);
Javascript chạy ở phía máy khách để rủi ro lớn nhất là cho khách hàng. Ví dụ về rủi ro là cookie của họ có thể bị đánh cắp để người dùng khác có thể mạo danh họ. Phương pháp tấn công phổ biến là inject Javascript vào trang thông qua gửi biểu mẫu. Để ngăn chặn điều này, bạn nên đảm bảo rằng bạn luôn thoát đúng cách đầu ra HTML.
Bảo mật bên máy chủ của bạn phải không phải phụ thuộc vào tính bảo mật của Javascript. Bạn nên giả định rằng kẻ tấn công của bạn có thể và sẽ thay đổi HTML/CSS/Javascript trên các trang của bạn để cố gắng xem thông tin không hiển thị bình thường và họ sẽ gửi dữ liệu đến máy chủ của bạn mà không thể gửi qua giao diện bình thường . Để bảo vệ chống lại điều này, bạn nên luôn luôn xác nhận tất cả các đầu vào của người dùng - coi đó là dữ liệu hoàn toàn không đáng tin cậy. Đừng dựa vào các giả định về nội dung mà người dùng của bạn sẽ gửi cho bạn - luôn kiểm tra rõ ràng các giả định bạn yêu cầu là đúng sự thật.
Không có rủi ro. Chỉ có thể có lỗi của lập trình viên. Một lỗi mà tôi có thể nghĩ đến là quên các tham số mã hóa url được gửi đến máy chủ và nó nhận được các giá trị sai. Nhưng rủi ro bảo mật thực sự là ở mã phía máy chủ, chứ không phải javascript.
Mặc dù chính xác, việc sử dụng JavaScript có thể ngụ ý không sử dụng mã phía máy chủ, tức là anh ta di chuyển xác thực và logic dữ liệu * sang * JavaScript, tất nhiên sẽ vô lý và vô cùng nguy hiểm.Đáng chú ý, cho người mới. –
@Noon nhưng như ông nói rằng nguy cơ bảo mật thực sự là trong mã phía máy chủ, mà trong trường hợp của bạn là không có và do đó không an toàn. Tôi nghĩ rằng điều này là chính xác, với mã phía máy chủ chính xác js không phải là một nguy cơ bảo mật –
Oskar: Thực hiện tốt, bạn lặp đi lặp lại chính xác những gì tôi đã nói. –
Johann-Peter Hartmann gần đây đã tổ chức một buổi nói chuyện tuyệt vời về bảo mật Javascript. Đó là một chủ đề nóng thực sự, đặc biệt là kể từ khi các ứng dụng đơn trang đang trở nên phổ biến hơn. Xem các trang trình bày của anh ấy tại slideshare. Các trang trình bày bằng tiếng Đức - theo như tôi biết chưa có bản dịch tiếng Anh nào.
- 1. Rủi ro bảo mật khi bật MSDTC
- 2. Mở xác thực 2.0 - Rủi ro bảo mật kế thừa
- 3. Rủi ro bảo mật của PermitUserEnvironment trong ssh
- 4. Tìm kiếm tài nguyên để giải thích rủi ro bảo mật
- 5. rủi ro Django SECRET_KEY
- 6. Rủi ro bảo mật khi sử dụng XMLHttpRequest giữa nhiều miền là gì? người
- 7. Thông báo lỗi/ngoại lệ chi tiết có phải là rủi ro bảo mật không?
- 8. Có rủi ro bảo mật khi chạy các ứng dụng web trong debug = "true" không?
- 9. Rủi ro bảo mật trong việc lưu trữ thông tin đăng nhập SQL trong mã PHP?
- 10. Rủi ro bảo mật trong việc phơi bày token truy cập người dùng facebook trong javascript là gì?
- 11. Rủi ro khi sử dụng Apache mod_proxy
- 12. rủi ro của "Ad Hoc Distributed Queries"
- 13. Bất kỳ rủi ro nào khi sử dụng Macports?
- 14. Rủi ro của giao tiếp JSONP miền chéo là gì?
- 15. SQL Injection có phải là rủi ro hiện nay không?
- 16. R quá tải nhà điều hành đơn nhất: rủi ro?
- 17. Rủi ro khi sử dụng unsafeperformIO trên randomIO
- 18. Có rủi ro khi sử dụng @ Html.Raw không?
- 19. Có rủi ro bảo mật nào không nếu chúng tôi cài đặt Chứng chỉ SSL ở trình cân bằng tải thay vì các máy chủ?
- 20. Mã GPGPU không đáng tin cậy (OpenCL vv) - có an toàn không? Rủi ro gì?
- 21. Tôi làm cách nào để cho phép người dùng chèn mã HTML mà không gặp rủi ro? (không chỉ rủi ro kỹ thuật)
- 22. Những rủi ro khi phơi bày khóa oauth không bí mật là gì? Có cách giải quyết nào không?
- 23. Có rủi ro liên quan đến việc sử dụng polyfill ràng buộc MDN không?
- 24. Bảo mật nguồn PhoneGap
- 25. Điều khiển rõ ràng không thải bỏ chúng - rủi ro là gì?
- 26. Biểu mẫu không có mã thông báo CSRF: những rủi ro là gì
- 27. Rủi ro trong việc cho phép người dùng tải lên các tệp HTML/JS
- 28. Rủi ro của việc sử dụng dữ liệu: image/jpeg; base64 là gì?
- 29. Rủi ro của các trang web lập trình với jQuery Mobile?
- 30. cách thích hợp để sao lưu/khôi phục cơ sở dữ liệu rủi ro là gì?
sử dụng javascript để làm gì? –
để xây dựng trang web :) – Adam