2010-10-18 35 views
5

Tôi muốn thực hiện một ngôn ngữ kịch bản để hỗ trợ một phần tự động hóa các tác vụ nhất định trên một wiki công cộng. Tôi không thể cài đặt bất cứ thứ gì như Google Caja trên máy chủ hoặc sửa đổi phần mềm wiki, nhưng tôi có thể cài đặt mã JavaScript để thực thi phía máy khách. Bởi vì mục đích của tôi là cho phép người dùng thông thường tạo và đăng các tập lệnh, việc sử dụng chính JavaScript không an toàn và có thể dẫn đến sự thỏa hiệp tài khoản.Ngôn ngữ kịch bản đơn giản, an toàn được triển khai trong JavaScript?

Việc triển khai ngôn ngữ kịch bản đó có tồn tại hay không, liệu việc tạo ngôn ngữ đó có tương đối dễ dàng không? Trọng tâm của tôi là dễ xử lý văn bản, yêu cầu Ajax và triển khai.

Dưới đây là một nhiệm vụ dụ một kịch bản sẽ cần phải thực hiện, lấy từ Wikipedia's procedure for requesting article deletion:

  1. Hãy hỏi người dùng cho tên của một trang wiki và một lý do chính đáng để xóa nó.
  2. Nhận mã nguồn của trang đó, thêm thông báo xóa lên trên cùng và lưu văn bản mới.
  3. Tạo trang mới (tên của trang này dựa trên tên của trang đầu tiên) bao gồm lý do xóa.
  4. Nhận danh sách người dùng đã chỉnh sửa trang và thông báo cho trang đầu tiên (một lần nữa, bằng cách chỉnh sửa một trang cụ thể) mà trang mà anh đã tạo sắp bị xóa.
+0

Nếu bạn muốn ngôn ngữ này có thể thực hiện yêu cầu ajax và truy cập/sửa đổi DOM, bạn không đạt được bất kỳ bảo mật nào chỉ trên JS (nếu nó không thể chạm vào DOM tho nó _might_ không thành vấn đề) – tobyodavies

+0

ý tưởng không dành cho bất kỳ sửa đổi DOM tùy ý hoặc yêu cầu Ajax nào được phép, chỉ những yêu cầu tương đối "an toàn" và có thể dễ dàng hoàn tác sau khi người dùng được hiển thị danh sách các hành động được thực hiện. – PleaseStand

+0

Tôi không hiểu chút nào. "Ngôn ngữ kịch bản" này có nghĩa vụ gì để có thể làm được? – Pointy

Trả lời

3

Dưới đây là việc triển khai Tcl trong javascript: Tcl in Javascript.

Đây là nguồn: tcl.js.

Và đây là mã thực hiện một giao diện điều khiển trực tiếp trong trình duyệt của bạn để chơi với: A little tcl.js console

Tcl có thể không tách trà của bạn nhưng việc thực hiện trông khá đơn giản dễ hiểu. Điều này chủ yếu là do chính tcl là một ngôn ngữ đơn giản. Bạn có thể sử dụng nó để lấy ý tưởng về cách triển khai các biến và chức năng.

Gợi ý: trong tcl, cấu trúc điều khiển là các hàm để xem xét nơi các hàm dựng sẵn được triển khai để xem triển khai thực hiện, trong khi và foreach.

1

Bạn chỉ có thể sandbox; có nghĩa là, phạm vi trong một vài biến quan trọng để mã của người dùng không thể truy cập các đối tượng không an toàn.

var execSandboxedJS = function (jsCode) { 
    var window = document.getElementById('myRootElement'); 
    var document = window; 
    eval(jsCode); 
}; 

Mặc dù, cho phép mã người dùng thực hiện yêu cầu ajax, bản thân, vốn không an toàn. Tôi sẽ xem xét lại sự tỉnh táo của dự án nếu đó là điều được kêu gọi.

+4

Không đủ tốt. Để bắt đầu, có thể dễ dàng bị phá vỡ bằng cách sử dụng 'self' thay vì cửa sổ. JavaScript theo cách, rất khó để vá tất cả các lỗ - xem http://code.google.com/p/google-caja/wiki/AttackVectors. – PleaseStand

2

Douglas Crockford ADsafe được coi là một tập con JavaScript an toàn.

Nó bao gồm thư viện thời gian chạy (~ 20 KB rút gọn) và trình xác minh (bao gồm trong JSLint). Nếu Crockford phải bỏ "Phần mềm sẽ được sử dụng cho Tốt, không phải Ác ma" từ giấy phép, cả hai thành phần sẽ là các chương trình nguồn mở tương thích với GPL.

Vì JSLint là một chương trình JavaScript, nó có thể xác minh hoàn toàn tập lệnh người dùng trong trình duyệt web. Điều này trái ngược với Google Caja, được viết bằng Java.

+0

Adsafe dường như không làm bất kỳ điều gì về vòng lặp vô hạn hoặc thực thi thời gian chờ, điều đó có nghĩa là người dùng vẫn có thể thực hiện một số việc như 'for (;;);' và khóa trang của người dùng khác; hoặc một cái gì đó như 'a = []; for (;;) {a = [a, a]} 'cho một vụ nổ bộ nhớ. –

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