2010-06-28 32 views
6

Tôi có một plugin WordPress tải các trang với AJAX và để đảm bảo khả năng tương thích với các plugin khác và "tiện ích con".Phương pháp tốt nhất cho JavaScript nội tuyến động sandbox là gì?

Tính đến ngay bây giờ tôi sử dụng đoạn mã sau để đánh giá tất cả JS trực tiếp mà là bên trong các khối nội dung được cập nhật:

function do_JS(e){ 
     var Reg = '(?:<script.*?>)((\n|.)*?)(?:</script>)'; 
     var match = new RegExp(Reg, 'img'); 
     var scripts = e.innerHTML.match(match); 
     var doc = document.write; 
     document.write = function(p){ e.innerHTML = e.innerHTML.replace(scripts[s],p)}; 
     if(scripts) { 
      for(var s = 0; s < scripts.length; s++) { 
       var js = ''; 
       var match = new RegExp(Reg, 'im'); 
       js = scripts[s].match(match)[1]; 
       js = js.replace('<!--',''); 
       js = js.replace('-->',''); 
       eval('try{'+js+'}catch(e){}'); 
      } 
     } 
     document.write = doc; 
    } 

Tôi muốn để có thể sandbox JS một chút tốt hơn rất nguy cơ xung đột được giảm thiểu. Một ý tưởng tôi đã có là tự động tạo ra một và chạy JS bên trong của nó, nhưng tôi đã hy vọng có một phương pháp tốt hơn một chút để đảm bảo tính tương thích và tăng tính bảo mật.

Trả lời

1

Rất có thể điều này sẽ không cung cấp cho bạn chính xác những gì bạn cần, nhưng làm thế nào về gói văn bản script của bạn bên trong một hàm hoặc chức năng tự thực hiện nghĩa đen (function(){/*...*/})().

var strEval = 'try{'; 
strEval += 'widget[' + intWidgetNumber + '] = (function(){'; 
strEval += js; 
strEval += '})();'; 
strEval += '}catch(e){}'; 

này cung cấp bảo vệ tốt hơn thẳng eval uation và giữ mã trong cùng một tài liệu. Nhược điểm là nếu mã bạn đang nhập là lộn xộn về các biến toàn cầu (có lẽ là lý do tại sao bạn hỏi câu hỏi chính xác này), bạn vẫn có thể có mã của họ dậm trên mã khác. Và nếu họ sử dụng từ khóa this, mã của họ có thể sẽ không hoạt động như dự định. Nhưng điều này ít nhất sẽ giữ các biến khai báo đúng và khai báo hàm trong một phạm vi đóng gói.

Tôi đã làm việc với mã của bên thứ ba rất nhiều (chủ yếu là mã quảng cáo khủng khiếp) và tôi đã tìm ra giải pháp tốt nhất là giữ mã trang web của bạn được bao bọc trong một không gian tên dài và độc đáo (mySiteUtils, mySiteGames, v.v. hoặc com.mysite.utils, com.mysite.games, v.v.). Nếu một đại lý quảng cáo quyết định bỏ mã khớp với không gian tên chính xác của bạn, họ sẽ phá hủy trang của bạn, nhưng cho đến nay điều đó chưa bao giờ xảy ra.

2

Bạn có thể thử biên dịch lại javascript với Caja: http://en.wikipedia.org/wiki/Caja_project

+0

Thật không may, plugin này chạy trên hàng trăm trang web mà tôi không kiểm soát, vì vậy tôi không thể chạy đoạn mã JS thông qua Caja như một trang web như myspace. Giải pháp cần phải được phân phối lại. –

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