2016-09-24 18 views
12

tôi sử dụng để vượt qua <div [innerHTML]="body"></div> HTML unescaped để mẫu của tôi, và khi tôi vượt qua để bodydiv với thuộc tính id, góc ném:Góc 2: khử trùng HTML đã loại bỏ một số nội dung bằng id div - đây là lỗi hoặc tính năng?

CẢNH BÁO: sanitizing HTML tước một số nội dung (xem http://g.co/ng/security#xss). CẢNH BÁO: khử trùng HTML đã xóa một số nội dung (xem http://g.co/ng/security#xss). CẢNH BÁO: khử trùng HTML đã xóa một số nội dung (xem http://g.co/ng/security#xss).

See. plunker

Vậy tại sao nó nói này? Điều gì có thể nguy hiểm id trong div? Có thể lỗi này?

Trả lời

4

Đó là vì thuộc tính id không an toàn.

Đây không phải là câu trả lời của tôi, nhưng nó sẽ trả lời câu hỏi của bạn: https://security.stackexchange.com/questions/88973/why-do-id-attributes-need-stricter-validation


Đối idname, những thuộc tính này thường được sử dụng như điểm tham chiếu trong DOM.

Nếu kẻ tấn công có thể giả mạo các điểm tham chiếu này, cô ấy có thể lừa các tập lệnh hiện có và nhận giá trị từ những nơi khác ngoài thiết kế, có thể nguy hiểm tùy thuộc vào ngữ cảnh được sử dụng.


Lưu ý từ tôi: Phần còn lại của bài nói chuyện của ông về các thuộc tính tên, nhưng bạn sẽ nhận được ý tưởng đằng sau tất cả điều này nếu bạn chưa theo nội dung trên


này cũng áp dụng cho các biểu mẫu HTML trong đó name được sử dụng để xác định cặp tên/giá trị. Ví dụ, nếu một trang web không mã hóa một trường biểu mẫu cụ thể khi nó là đầu ra, nhưng vì trường biểu mẫu là máy chủ được tạo và biểu mẫu được bảo vệ chống lại CSRF bằng cách sử dụng mã thông báo, nó không thể được khai thác bằng các phương tiện thông thường. Tuy nhiên, kẻ tấn công có thể lôi kéo người dùng truy cập URL bằng thông số được sử dụng trong name, chứa tải trọng XSS để thực thi khi gửi biểu mẫu.

ví dụ:sử dụng bình thường:

https://example.com/product?item_name=watch&qty=1 

mà ám một hình thức

<form> 

<input type="hidden" name="watch" value="1" /> 
<input type="hidden" name="shop_name" value="Bob's Supplies" /> 
<input type="hidden" name="anti-csrf" value="asdjasodhoai" /> 

<input type="submit" value="Click here to buy" /> 

</form> 

Và sau đó được đầu ra như

Thank you for buying from Bob's Supplies. 

Tuy nhiên, kẻ tấn công có thể gửi một liên kết cho người dùng như vậy:

https://example.com/product?item_name=shop_name&qty=<script>alert('xss')</script> 

Vì ứng dụng là một cách chính xác mã HTML vào thời điểm này nó ám chỉ rằng hình thức như

<form> 

<input type="hidden" name="shop_name" value="&lt;script&gt;alert(&#039;xss&#039;)&lt;/script&gt;" /> 
<input type="hidden" name="shop_name" value="Bob's Supplies" /> 
<input type="hidden" name="anti-csrf" value="asdjasodhoai" /> 

<input type="submit" value="Click here to buy" /> 

</form> 

này sau đó được đầu ra như

Thank you for buying from <script>alert('xss')</script>. 

vì trang này không HTML mã hóa các thông số shop_name vì nó là đáng tin cậy và các khung ứng dụng luôn lấy giá trị đầu tiên trong trường hợp trùng lặp. Rất giả tạo, nhưng đó là điều đầu tiên rơi vào đầu tôi để chứng minh quan điểm.

19

Giải pháp đơn giản là viết ống như

import { Pipe, PipeTransform } from "@angular/core"; 
import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; 

@Pipe({ 
    name: 'sanitizeHtml' 
}) 
export class SanitizeHtmlPipe implements PipeTransform { 

    constructor(private _sanitizer:DomSanitizer) { 
    } 

    transform(v:string):SafeHtml { 
    return this._sanitizer.bypassSecurityTrustHtml(v); 
    } 
} 

thêm trong file html của bạn thêm đống như

<td *ngIf="i>0" [innerHTML]="entry.attributes[i] | sanitizeHtml"></td> 
+1

kèm theo câu trả lời từ Karl từ câu hỏi này: http://stackoverflow.com/ Câu hỏi/39007130/the-pipe-can-không-được-tìm-angular2-custom-pipe một sửa chữa tốt cho vấn đề này với Sanitizer – sanyooh

+0

@sanyooh Điều này làm việc tốt sanatizing nhưng tôi nhận được 'undefined' được hiển thị momenteraly trước khi tôi' [ innerHTML] 'nội dung được hiển thị. '

' – fidev

+0

SafeHtml? nơi nó nên được nhập khẩu từ –

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