2012-01-12 32 views
5

Vâng, nó không phải là một số nguy cơ bảo mật lớn, mặc dù nó cho thấy một số can thiệp tiềm năng ít nhất.Không phải là JavaScript setTimeout và setInterval có một số lỗ hổng bảo mật tiềm năng

Giả sử chúng tôi có các mô-đun JavaScript được đóng rất tốt được tải vào trang của tôi mà không biết về nhau. Họ là từ "đáng tin cậy" tuy nhiên một số nhà phát triển trong lib2 đã thực hiện một sai lầm, xem mã.

Lib1http://good.site/libs/the-famous-important-lib1.js

setInterval(function(){ 
    alert('I am doing some important stuff'); 
}, 1000); 

Lib2http://not-excelent.site/libs/the-cool-lib2.js

var i = setInterval(function(){}, 0); 
for(; i >= 0; i-=1) { 
    clearInterval(i); 
} 

Html My

<script src="http://good.site/libs/the-famous-important-lib1.js" type="text/javascript"></script> 
<script src="http://not-excelent.site/libs/the-cool-lib2.js" type="text/javascript"></script> 

Trong trình duyệt hoặc ít nhất là trên Firefox, Loading Lib2 sẽ thực sự phá hỏng Lib1 hoàn toàn. Một số người có thể nói điều này là không quan trọng, và làm thế nào ngớ ngẩn để làm cho sai lầm như vậy.

Tôi coi đó là hành vi xấu. Vì chúng tôi đang tải nhiều hơn và nhiều hơn nữa libs bên thứ 3 trong các trang web của chúng tôi. Có thể một giải pháp thích hợp là setIntervalsetTimeout sẽ trả về một Ojbect thực sự độc đáo và không thể thay thế được, thay vì chỉ là số tự động tăng số.

Ai đó có thể cam kết với việc khai thác thực tế cho điều này (vẫn không kiểm tra nếu nó là khung hình chéo, tôi nghi ngờ nó thực sự).

Câu hỏi đặt ra là: Có phải không? và chế độ nghiêm ngặt trong es5 có vượt qua điều đó không?

+0

xóa các thiết lập của người khác? Chắc chắn nó sẽ phá vỡ mọi thứ, nhưng không có gì thảm khốc có thể xảy ra. –

+0

giải pháp dễ dàng .. không sử dụng mã người khác rác;) – musefan

+3

@SergioTulentsev Tôi tuy nhiên đã thấy một trang web có paywall được _triggered_ bởi một 'setTimeout()'. Nếu bộ đếm thời gian đó bị xóa, khách hàng không trả tiền sẽ không bị loại bỏ. Hoàn toàn thiết kế bảo mật _lousy_ ... – Alnitak

Trả lời

3

Chế độ nghiêm ngặt trong ES5 có khắc phục được điều đó không?

số setIntervalsetTimeout là một phần của nối kết DOM - họ không builtins ECMAScript nên không được chỉ định trong bất kỳ phiên bản ECMAScript. Không có gì ở chế độ nghiêm ngặt cụ thể ảnh hưởng đến chúng.

Điều này có thể sẽ thay đổi trong phiên bản tiếp theo của ECMaScript vì ủy ban TC39 cho rằng đồng thời là tính năng ngôn ngữ cốt lõi cần được chỉ định và có thể giữ lại event loop concurrency.

Những thay đổi này dường như không ảnh hưởng đến vấn đề bạn nêu ra.Caja/Secure EcmaScript (SES) đảm bảo rằng các id khoảng thời gian chờ và thời gian chờ không thể đoán được.

3

Điểm thú vị.

Vì id khoảng thời gian/thời gian chờ là tuần tự, bạn có thể (như bạn đã cho chúng tôi thấy) xóa tất cả các khoảng thời gian/khoảng thời gian bằng cách tự nhận id khoảng thời gian tiếp theo và hơn xóa bất kỳ id nào thấp hơn số bạn đã nhận.

Tuy nhiên, tôi không thấy bất kỳ mối đe dọa nào về an ninh . Bất kỳ ứng dụng web nào, điều đó sẽ căn cứ vào sự bảo mật của họ chỉ trong khoảng thời gian và/hoặc thời gian chờ trong Javascript cũng tốt như bị tấn công.

Như Sergio Tulentsev đã nhận xét - lạm dụng clearInterval/clearTimeout sẽ phá vỡ mọi thứ - chắc chắn - nhưng (99% thời gian) sẽ không gây ra bất kỳ mối đe dọa bảo mật nào cho ứng dụng web.

+1

Tôi đã nói về an toàn và an ninh ngôn ngữ không chỉ bảo mật ứng dụng, vì khi chúng ta dành nhiều thời gian để ẩn các mô-đun bên trong các bao đóng (điều này tốt) và chúng tôi đã mời "chế độ nghiêm ngặt". JavaScript nên tránh những điểm phá vỡ ngớ ngẩn như vậy, mặc dù tôi biết đó là điều phức tạp để đạt được vì nó là JavaScript và có rất nhiều người tham gia. –

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