Làm cách nào để thực thi một số JavaScript là một chuỗi?
function ExecuteJavascriptString()
{
var s = "alert('hello')";
// how do I get a browser to alert('hello')?
}
Làm cách nào để thực thi một số JavaScript là một chuỗi?
function ExecuteJavascriptString()
{
var s = "alert('hello')";
// how do I get a browser to alert('hello')?
}
Câu trả lời:
Với eval("my script here")
chức năng.
Bạn có thể thực hiện nó bằng cách sử dụng một chức năng. Thí dụ:
var theInstructions = "alert('Hello World'); var x = 100";
var F=new Function (theInstructions);
return(F());
var F=function(){eval(theInstructions);};
sao?
new Function("alert('Hello World');")()
Các eval
chức năng sẽ đánh giá một chuỗi được truyền cho nó.
Nhưng việc sử dụng eval
có thể nguy hiểm , vì vậy sử dụng một cách thận trọng.
Chỉnh sửa: annakata có một điểm tốt - Không chỉ eval
nguy hiểm , nó còn chậm . Điều này là do mã được đánh giá phải được phân tích cú pháp tại chỗ, do đó sẽ mất một số tài nguyên tính toán.
eval()
là nguy hiểm. Có sự thay thế nào không?
Sử dụng eval ().
W3 Trường tham quan eval . Trang web có một số ví dụ có thể sử dụng của eval. Tài liệu Mozilla bao gồm chi tiết này.
Bạn có thể sẽ nhận được rất nhiều cảnh báo về việc sử dụng này một cách an toàn. KHÔNG cho phép người dùng tiêm BẤT CỨ vào eval () vì đây là một vấn đề bảo mật rất lớn.
Bạn cũng sẽ muốn biết rằng eval () có phạm vi khác .
eval
tốt hơn với tôi so với bài viết đó của W3Schools. Một cái gì đó có thể đọc được với lời giải thích tốt và ví dụ sẽ là developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ,. Và không, tôi không phải là bjorninge
Thử cái này:
var script = "<script type='text/javascript'> content </script>";
//using jquery next
$('body').append(script);//incorporates and executes inmediatelly
Cá nhân, tôi đã không kiểm tra nó nhưng dường như làm việc.
Một chút giống như những gì @Hossein Hajizadeh alerady đã nói, mặc dù chi tiết hơn:
Có một sự thay thế cho eval()
.
Hàm setTimeout()
được thiết kế để thực thi một cái gì đó sau một khoảng thời gian tính bằng mili giây và mã được thực thi chỉ để được định dạng dưới dạng một chuỗi.
Nó sẽ hoạt động như thế này:
ExecuteJavascriptString(); //Just for running it
function ExecuteJavascriptString()
{
var s = "alert('hello')";
setTimeout(s, 1);
}
1
có nghĩa là nó sẽ đợi 1 mili giây trước khi thực hiện chuỗi.
Nó có thể không phải là cách chính xác nhất để làm điều đó, nhưng nó hoạt động.
setTimeout
? Lưu ý rằng trong mọi trường hợp, nó sẽ làm cho việc thực thi không đồng bộ. Điều đó có nghĩa là tất cả các mã theo sau setTimeout
cuộc gọi sẽ được gọi trước khi mã được chuyển đến setTimeout
(ngay cả khi được gọi bằng 0 (không)).
Sử dụng eval như dưới đây. Eval nên được sử dụng một cách thận trọng, một tìm kiếm đơn giản về " eval là ác " nên ném một số gợi ý.
function ExecuteJavascriptString()
{
var s = "alert('hello')";
eval(s);
}
Đã kiểm tra điều này trên nhiều tập lệnh phức tạp và khó hiểu:
var js = "alert('Hello, World!');" // put your JS code here
var oScript = document.createElement("script");
var oScriptText = document.createTextNode(js);
oScript.appendChild(oScriptText);
document.body.appendChild(oScript);
Nếu bạn muốn thực thi một lệnh cụ thể (đó là chuỗi) sau một thời gian cụ thể - cmd = mã của bạn - InterVal = delay để chạy
function ExecStr(cmd, InterVal) {
try {
setTimeout(function () {
var F = new Function(cmd);
return (F());
}, InterVal);
} catch (e) { }
}
//sample
ExecStr("alert(20)",500);
Val
trong InterVal
hoa?
Đối với người dùng đang sử dụng nút và có liên quan đến ý nghĩa ngữ cảnh của các ưu eval()
đãi của nodejsvm
. Nó tạo ra một máy ảo V8 có thể tạo hộp cát cho việc thực thi mã của bạn trong một ngữ cảnh riêng.
Tiến xa hơn một bước là vm2
làm cứng vm
cho phép vm chạy mã không tin cậy.
https://nodejs.org/api/vm.html - Nodejs / vm chính thức
https://github.com/patriksimek/vm2 - Mở rộng vm2
const vm = require('vm');
const x = 1;
const sandbox = { x: 2 };
vm.createContext(sandbox); // Contextify the sandbox.
const code = 'x += 40; var y = 17;';
// `x` and `y` are global variables in the sandboxed environment.
// Initially, x has the value 2 because that is the value of sandbox.x.
vm.runInContext(code, sandbox);
console.log(sandbox.x); // 42
console.log(sandbox.y); // 17
console.log(x); // 1; y is not defined.
eval(s);
Nhưng điều này có thể nguy hiểm nếu bạn lấy dữ liệu từ người dùng, mặc dù tôi cho rằng nếu họ gặp sự cố trình duyệt của họ thì đó là vấn đề của họ.
eval
mã từ người dùng, ví dụ, có thể cho phép người dùng đánh cắp tài khoản của người dùng khác mà họ không biết chỉ bằng cách tải trang.
Không chắc đây có phải là gian lận hay không:
window.say = function(a) { alert(a); };
var a = "say('hello')";
var p = /^([^(]*)\('([^']*)'\).*$/; // ["say('hello')","say","hello"]
var fn = window[p.exec(a)[1]]; // get function reference by name
if( typeof(fn) === "function")
fn.apply(null, [p.exec(a)[2]]); // call it with params
Hàm mới và áp dụng () cùng hoạt động
var a=new Function('alert(1);')
a.apply(null)
eval()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Tôi đã trả lời câu hỏi tương tự và có một ý tưởng khác làm thế nào để đạt được điều này mà không cần sử dụng eval()
:
const source = "alert('test')";
const el = document.createElement("script");
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));
document.head.appendChild(el);
Trong đoạn mã trên, về cơ bản bạn tạo Blob, chứa tập lệnh của bạn, để tạo URL đối tượng (đại diện cho đối tượng Tệp hoặc Blob trong bộ nhớ trình duyệt). Vì bạn có thuộc src
tính trên <script>
thẻ, tập lệnh sẽ được thực thi theo cách tương tự như khi nó được tải từ bất kỳ URL nào khác.
eval nên làm điều đó.
eval(s);
eval(s);
Hãy nhớ rằng, eval đó rất mạnh mẽ và khá không an toàn. Bạn nên tự tin rằng tập lệnh bạn đang thực thi là an toàn và không thể thay đổi bởi người dùng.
Người ta có thể sử dụng mathjs
Đoạn trích từ liên kết trên:
// evaluate expressions
math.evaluate('sqrt(3^2 + 4^2)') // 5
math.evaluate('sqrt(-4)') // 2i
math.evaluate('2 inch to cm') // 5.08 cm
math.evaluate('cos(45 deg)') // 0.7071067811865476
// provide a scope
let scope = {
a: 3,
b: 4
}
math.evaluate('a * b', scope) // 12
math.evaluate('c = 2.3 + 4.5', scope) // 6.8
scope.c
scope
là bất kỳ đối tượng. Vì vậy, nếu bạn chuyển phạm vi toàn cầu cho hàm evalute, bạn có thể thực hiện cảnh báo () một cách linh hoạt.
Ngoài ra mathjs là lựa chọn tốt hơn nhiều so với eval () vì nó chạy trong hộp cát.
Một người dùng có thể thử tiêm mã JavaScript độc hại thông qua trình phân tích cú pháp biểu thức. Trình phân tích cú pháp biểu thức của mathjs cung cấp một môi trường hộp cát để thực thi các biểu thức sẽ làm cho điều này là không thể. Mặc dù có thể có các lỗ hổng bảo mật không xác định, do đó, điều quan trọng là phải cẩn thận, đặc biệt là khi cho phép phía máy chủ thực hiện các biểu thức tùy ý.
Các phiên bản mới hơn của mathjs không sử dụng eval () hoặc Function ().
Trình phân tích cú pháp chủ động ngăn chặn truy cập vào JavaScripts nội bộ và Hàm mới là nguyên nhân chính của các cuộc tấn công bảo mật. Mathjs phiên bản 4 và mới hơn không sử dụng eval của JavaScript dưới mui xe. Phiên bản 3 trở lên đã sử dụng eval cho bước biên dịch. Đây không phải là vấn đề bảo mật trực tiếp nhưng dẫn đến bề mặt tấn công lớn hơn có thể.
Sử dụng cả eval và tạo một Hàm mới để thực thi javascript đi kèm với rất nhiều rủi ro bảo mật.
const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);
Tôi thích phương thức này để thực thi Javascript tôi nhận được dưới dạng chuỗi.