Đây là một ý tưởng. Điều gì sẽ xảy ra nếu bạn đã sử dụng một trình phân tích tĩnh (ví dụ: bạn có thể xây dựng ví dụ esprima) để xác định các biến bên ngoài mà mã eval'd sử dụng và bí danh chúng. Bởi "mã bên ngoài", tôi có nghĩa là các biến mã được đánh giá là sử dụng nhưng không khai báo.Dưới đây là một ví dụ:
eval(safeEval(
"var x = window.theX;"
+"y = Math.random();"
+"eval('window.z = 500;');"))
nơi safeEval trả về chuỗi javascript sửa đổi với một bối cảnh đó ngăn chặn truy cập đến các biến bên ngoài:
";(function(y, Math, window) {"
+"var x = window.theX;"
+"y = Math.random();"
+"eval(safeEval('window.z = 500;');"
"})();"
Có một vài điều bạn có thể làm bây giờ với điều này:
- Bạn có thể đảm bảo rằng mã eval'd không thể đọc các giá trị của các biến bên ngoài, cũng không viết cho chúng (bằng cách chuyển
undefined
làm đối số hàm, hoặc không chuyển đối số). Hoặc bạn có thể chỉ cần ném một ngoại lệ trong trường hợp các biến được truy cập không an toàn.
- Bạn cũng đảm bảo rằng các biến được tạo ra bởi eval không ảnh hưởng đến phạm vi xung quanh
- Bạn có thể cho phép eval để tạo ra các biến trong phạm vi xung quanh bằng cách tuyên bố các biến ngoài việc đóng cửa thay vì như chức năng thông số
- Bạn có thể cho phép truy cập chỉ đọc bởi sao chép giá trị của biến bên ngoài và sử dụng chúng như các đối số cho hàm
- Bạn có thể cho phép đọc-ghi truy cập vào các biến cụ thể bằng cách nói safeEval để không bí danh những cái tên đặc biệt
- Bạn có thể phát hiện trường hợp eval thực hiện không sửa đổi một biến cụ thể và cho phép nó tự động bị loại trừ khỏi bị bí danh (ví dụ: Toán trong trường hợp này, không được sửa đổi)
- Bạn có thể cung cấp cho các eval một bối cảnh trong đó để chạy, bằng cách thông qua các giá trị lập luận rằng có thể khác nhau so với bối cảnh xung quanh
- Bạn có thể nắm bắt được những thay đổi bối cảnh bởi cũng trả về các đối số hàm từ hàm để bạn có thể kiểm tra chúng bên ngoài eval.
Lưu ý rằng việc sử dụng eval
là một trường hợp đặc biệt, vì bởi bản chất của nó, nó có hiệu quả có thể không được bao bọc trong chức năng khác (đó là lý do tại sao chúng ta phải làm eval(safeEval(...))
).
Tất nhiên, làm tất cả công việc này có thể làm chậm mã của bạn, nhưng chắc chắn có những nơi mà lượt truy cập không thành vấn đề. Hy vọng điều này sẽ giúp một ai đó. Và nếu ai đó tạo ra một bằng chứng về khái niệm, tôi rất muốn nhìn thấy một liên kết đến nó ở đây;)
Nguồn
2013-08-11 20:44:16
Tôi không biết liệu nó sẽ làm việc cho 'eval' nhưng bạn có thể cố gắng để chuyển đổi ngữ cảnh thực thi của nó (đối tượng kích hoạt google). – jfs
Hãy xem triển khai thực hiện dojox.secure.sandbox. – jfs
Bây giờ, những gì bạn có thể muốn là một Web Worker. – bjb568