2009-05-16 52 views
5

Tôi đang tạo trang web nơi người dùng có thể tương tác và thực hiện các hoạt động hệ thống tệp cơ bản (tạo tệp/dir, xóa tệp/dir, điều hướng hệ thống tệp) trên máy tính từ xa. Trang web là HTML cơ bản (mã hóa UTF-8) và Javascript. Tôi cần phải thực hiện bằng chứng XSS của trang web này.Ngăn chặn các cuộc tấn công XSS

Có thể thoát tất cả các ký tự không phải chữ và số trong đầu vào của người dùng (để bảo vệ chống lại XSS dựa trên DOM) và thông tin tên tệp (để bảo vệ chống lại XSS được lưu trữ) bằng cách sử dụng Javascript (giá trị hex được mã hóa theo phần trăm này) không?

Tôi chủ yếu là danh sách trắng chỉ có mục nhập chữ và số. Ngoài ra, vì tôi đang sử dụng các giá trị hex được mã hóa phần trăm, tôi giả định rằng lỗ hổng mã hóa UTF không nên có mặt.

Có ai có thể nghĩ ra bất kỳ lỗ hổng bảo mật nào trong cơ chế này không?

Trả lời

0

Điều này âm thanh an toàn, và có thể là, nhưng có một sự bắt. Nó chỉ hoạt động nếu bạn triển khai chính xác. Nó chỉ là cách quá dễ dàng để có được sai. Nếu bạn muốn đi cho nó, đó là okay, nhưng tôi sẽ đề nghị sử dụng một số thư viện đã được thử nghiệm để làm điều này, thay vì lăn của riêng bạn.

0

Mã hóa rất tốt. Rủi ro tiềm năng lớn nhất là những gì bạn làm với dữ liệu và nếu/khi dữ liệu được giải mã/hiển thị. Nếu bạn giải mã đầu vào của người dùng và hiển thị nó, giải mã dữ liệu, thì bạn có thể gặp vấn đề tại thời điểm đó.

Nếu bạn không có nhu cầu bức xúc để hỗ trợ các ký tự nguy hiểm hơn về các lỗ hổng XSS tiềm năng (chẳng hạn như '<', '>', ';', v.v.) thì tôi cho rằng nhân vật là tốt. Bằng cách đó, trong trường hợp bạn giải mã và hiển thị dữ liệu, bạn sẽ không có khả năng thể hiện một vấn đề XSS.

8

Sử dụng javascript (Tôi nghĩ là bạn đang nói gì) để thoát không có vẻ quá an toàn. Nó chạy trên máy người dùng và họ có thể, với một số nỗ lực bỏ qua cơ chế thoát.

Điều bạn đang cố gắng phát âm thanh đúng, nhưng bạn cần thực hiện nó phía máy chủ.

+1

Người dùng chỉ có thể tắt JavaScript. –

0

Cách cơ bản để bảo vệ chống lại XSS là sử dụng cụm từ thông dụng để xác thực đầu vào bất cứ khi nào có thể và mã hóa tất cả đầu ra. Đầu ra mã hóa có thể phức tạp, vì vậy tốt nhất là sử dụng thư viện. Ít nhất một đầu vào quan trọng đối với ứng dụng của bạn là tên tệp, vì vậy bạn sẽ muốn có cụm từ thông dụng phù hợp với bất kỳ tên tệp hợp lệ nào cho hệ điều hành đích của bạn. Chỉ chấp nhận đầu vào chữ và số sẽ khiến ứng dụng của bạn không thể xử lý nhiều tên tệp trên các hệ điều hành thông thường. Tôi không làm theo lý do tại sao sử dụng% hex giá trị sẽ làm bất kỳ tốt. Không có lý do nào một tập lệnh độc hại không thể được mã hóa theo cách đó. Kịch bản tương tự có thể có nhiều biểu diễn utf-8 hợp lệ. Bạn cần thực hiện thêm một số thông tin cơ bản về thực hành mã hóa chống XSS. Google OWASP để tham khảo.

1

Một vài điểm cần chú ý:

  • Như @Alo nói, điều này nên được thực hiện server-side, để ngăn chặn kẻ tấn công từ bỏ qua javascript của bạn hoàn toàn và gửi đầu vào độc hại trực tiếp đến máy chủ. Tuy nhiên, như bạn đã lưu ý, điều này nên được thực hiện (trong các tình huống nhất định) C ALNG ở phía máy khách, để ngăn chặn XSS dựa trên DOM.
  • Bạn đã đề cập rằng trang là UTF-8, bạn cần thực thi điều này bằng cách sử dụng thẻ meta, tiêu đề HTTP, v.v. Nếu không, bạn dễ bị tấn công UTF-7.
  • Dấu cách - có phải là số được ghép bằng chữ số hay không? (một số bao gồm ...) Chỉ sử dụng không gian và chữ cái, một cuộc tấn công XSS đầy đủ có thể được gắn kết, trong một số trường hợp.

Kiểm tra một số thông tin khác trong câu trả lời của tôi cho Will HTML Encoding prevent all kinds of XSS attacks? Bạn sẽ tìm thấy tất cả những gì bạn cần biết ở đó.

1

Một lưu ý để bổ sung những điểm khác thực hiện:

Hãy chắc chắn rằng bạn đang sử dụng GET và POST một cách chính xác, bởi vì đó là loại đơn giản nhất của lỗ hổng bảo mật trên nhiều trang web.

Nếu đầu vào của người dùng sẽ kích hoạt bất kỳ thay đổi nào đối với cơ sở dữ liệu, hãy đảm bảo bạn sử dụng POST.

Chỉ người dùng GET nếu bạn đang truy xuất thông tin được hiển thị.

Các vấn đề liên quan