2012-11-20 39 views
8

Tôi tình cờ đọc về XSS và cách tránh XSS. Từ những gì tôi đã đọc, tôi đã biết rằng chúng ta cần lọc đầu vào, xử lý thích hợp mã ứng dụng và mã hóa đầu ra để làm cho ứng dụng web có phần XSS an toàn. Sau khi trải qua một số bài báo, một số nghi ngờ vẫn tồn tại.Một số giải thích về XSS

  • Khi tôi cố gắng jQuery.text ("untrusted_data") hoặc element.text = untrusted_data, các trình duyệt dường như được mã hóa nội dung một cách hoàn hảo, nhưng tôi đã đọc ở đâu khác mà client-side mã hóa không được tin cậy và bạn phải "luôn" mã hóa ở phía máy chủ. Tại sao mã hóa phía máy khách được coi là không an toàn?

  • Bất cứ khi nào tôi đã cố gắng để thiết lập giá trị sử dụng jQuery.val (untrusted_data) hoặc element.value = untrusted_data nó có vẻ là đủ an toàn. Vì vậy, nó thực sự XSS an toàn hoặc tôi đã bỏ lỡ bất kỳ trường hợp ở đây?

  • Ngoài ra, tôi tình cờ đọc ở đâu đó rằng jQuery.setAttribute (attrName, untrusted_data)setAttribute (attrName, untrusted_data) thường coi là an toàn chỉ khi Thuộc tính tên không bao gồm các thuộc tính dựa URL Context (src, href etc) hoặc Trình xử lý sự kiện (onClick, onMouseOver, v.v.). Nếu đó là trường hợp, làm thế nào tôi phải thiết lập một thuộc tính href bằng cách sử dụng setAttribute ("href", untrusted_data)? Là encodeForHtmlAttribute (untrusted_data) từ phía máy chủ đúng cách tiếp cận?
  • Tôi nên xử lý việc tạo html động như thế nào. Hãy xem xét ví dụ dưới đây

<div id="divName1" onClick="copyData()">untrusted_data</div> <div id="divName2"></div>

function copyData() 
{ 
    var divValue = jQuery("#divName1").html(); 
    jQuery("#divName2").html(divValue);/XSS Here 
} 

Những gì tôi muốn đạt được ở đây là để có được văn bản từ divName1 và dán nội dung divName2 của. Mã tôi đã viết ở trên là XSS dễ bị tổn thương. Tôi có thể thay đổi điều này để

jQuery ("# divName2"). Text (divValue)

Vì vậy, điều này sẽ đảm bảo mã hóa, nhưng như tôi hiểu, chúng ta nói rằng mã hóa client-side là không an toàn và chỉ sử dụng mã hóa phía máy chủ. Làm thế nào tôi nên viết này để được XSS an toàn mà không cần sử dụng mã hóa phía máy khách? Tôi là một chút nhầm lẫn ở đây :(. Xin hãy giúp tôi ra để xóa những nghi ngờ.

+0

'element.text' chính nó là an toàn, nhưng bạn có thể gặp phải vấn đề nếu bạn sử dụng nội suy chuỗi để truyền dữ liệu đến mã máy khách. –

Trả lời

8

Đây là rất nhiều câu hỏi cùng một lúc.

Tại sao mã hóa client-side coi là không an toàn không?

Mã hóa phía máy khách là tốt miễn là mã được thực hiện đúng và nhất quán.Mã hóa phía máy khách thường có thanh thấp hơn vì nó không cần phải lo lắng về các cuộc tấn công mức mã hóa ký tự như các tấn công UTF-7.

Bất cứ khi nào tôi cố gắng đặt giá trị bằng cách sử dụng jQuery.val (untrusted_data) hoặc element.value = untrusted_data có vẻ như đủ an toàn. Vì vậy, nó thực sự XSS an toàn hoặc tôi đã bỏ lỡ bất kỳ trường hợp ở đây?

Giả sử untrusted_data là một chuỗi và phần tử có giá trị được đặt là nút văn bản thông thường trong phần tử luồng hoặc khối thì bạn vẫn ổn. Bạn có thể gặp sự cố nếu nút có giá trị đang được chỉ định là nút văn bản trong phần tử <script> hoặc URL, trình xử lý sự kiện hoặc nút thuộc tính kiểu hoặc bất kỳ thứ gì có liên quan đến <object>.

Ngoài ra, tôi tình cờ đọc ở đâu đó rằng jQuery.setAttribute (attrName, untrusted_data) và setAttribute (attrName, untrusted_data) thường được coi là an toàn chỉ khi thuộc tính tên không bao gồm các thuộc tính dựa URL Context (src, href vv) hoặc Trình xử lý sự kiện (onClick, onMouseOver, v.v.). Nếu đúng như vậy,

Điều đó đúng một phần. Các thuộc tính khác có cạnh sắc như style và nhiều thứ liên quan đến <object><embed><meta>.

Nếu bạn không biết nhiều về thuộc tính thì không hiển thị nó cho dữ liệu không đáng tin cậy. Những điều thường an toàn là các thuộc tính chứa nội dung văn bản như title hoặc có các giá trị được liệt kê như dir=ltrdir=rtl.

Khi bạn đang xử lý các thuộc tính có giá trị phức tạp hơn, bạn có nguy cơ bị tấn công khai thác các tiện ích mở rộng của trình duyệt tối nghĩa như -moz-binding trong thuộc tính style.

nó có vẻ là đủ an toàn

Mìn dường như được an toàn cho đến khi bạn bước vào chúng.

Bạn không thể kết luận nhiều thứ gì đó "có vẻ an toàn". Bạn thực sự cần phải nhìn vào nó và hiểu những gì có thể có khả năng sai, và sắp xếp mọi thứ để bạn có nguy cơ chỉ khi có một cơn bão hoàn hảo của sự việc xảy ra sai (P (thảm họa) = P (fail0) * P (failure1) * ...) và bạn không gặp rủi ro khi chỉ có một điều sai (P (thảm họa) = P (fail0) + P (fail1) * P (! failure0) + ...).

Tôi nên đặt thuộc tính href bằng cách sử dụng setAttribute ("href", untrusted_data) như thế nào?

Đừng làm điều đó mà không có giao thức lập danh sách trắng.

if (!/^https?:\/\//i.test(untrusted_data) && !/^mailto:/i.test(untrusted_data)) { 
    throw new Error('unsafe'); 
} 

là encodeForHtmlAttribute (untrusted_data) từ server-side đúng cách của phương pháp?

No. Mã hóa HTML giá trị được chuyển đến setAttribute là không cần thiết và sẽ không giúp bảo vệ bất kỳ thuộc tính bảo mật nào. <iframe srcdoc> có thể là một ngoại lệ hiếm khi nội dung của nó là HTML nếu hồi ức của tôi về các thay đổi thông số gần đây là chính xác.

Điều tôi muốn đạt được ở đây là lấy văn bản từ divName1 và dán nó vào nội dung của divName2. Mã tôi đã viết ở trên là XSS dễ bị tổn thương.

Đừng bỏ qua xung quanh bằng HTML. Trình duyệt '.innerHTML getters là lỗi và đôi khi dẫn đến khai thác như với backticks hoạt động như delimiters giá trị trong IE. Chỉ cần sao chép các nút từ một đến khác. Một cái gì đó giống như dưới đây sẽ làm điều đó:

var div1 = $('#divName1'); 
for (var child = div1[0].firstChild(); child; child = child.nextSibling) { 
    $('#divName2').append([child.cloneNode(true)]); 
} 

tôi có thể thay đổi điều này để

jQuery("#divName2").text(divValue) 

Đó là tốt nếu tất cả các bạn muốn là nội dung văn bản.

+1

Câu trả lời rõ ràng. Chỉ cần thêm một chút vào nó - như tác giả đã đề cập, các thuộc tính cũng nên được khử trùng. Bạn có thể làm điều này tương đối dễ dàng phía máy chủ hoặc phía máy khách - khó khăn chính với nó là phạm vi rộng của các cuộc tấn công có thể được gây ra trên chúng. Có một số ví dụ cực kỳ tốt trên web về lọc các tập lệnh. –

+2

'Mìn có vẻ an toàn cho đến khi bạn bước vào chúng.' Đó là tóm tắt tốt nhất mà tôi từng gặp phải đối với bất kỳ loại vấn đề bảo mật CNTT nào, nơi giải pháp được đề xuất 'dường như đủ an toàn' ... – ppeterka

+0

@Mike Cảm ơn rất nhiều câu trả lời chi tiết :) –