एक स्ट्रिंग के रूप में संग्रहीत जावास्क्रिप्ट कोड निष्पादित करें


173

मैं कुछ जावास्क्रिप्ट को कैसे निष्पादित करूं जो एक स्ट्रिंग है?

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    // how do I get a browser to alert('hello')?
}

जवाबों:


227

eval("my script here")फ़ंक्शन के साथ ।


11
सावधान रहें ! यह कोड निष्पादित करता है इसलिए सावधान रहें कि आपको यह स्ट्रिंग कहां / कैसे मिली है। ध्यान रखें कि कोई भी आपके स्ट्रिंग के अंदर दुर्भावनापूर्ण कोड डालने का प्रयास कर सकता है।
जॉन

@ डिविविन इसे "क्रॉस साइट स्क्रिप्टिंग" कहा जाता है। यहाँ देखें: en.wikipedia.org/wiki/Cross-site_scripting
ब्रेंडन शॉ

134

आप एक फ़ंक्शन का उपयोग करके इसे निष्पादित कर सकते हैं। उदाहरण:

var theInstructions = "alert('Hello World'); var x = 100";

var F=new Function (theInstructions);

return(F());

3
लेकिन अंत में - कि बुला के रूप में ही नहीं है var F=function(){eval(theInstructions);};?
जोर्न बर्कफेल्ड

14
हां और नहीं: eval कोड के साथ भी निष्पादित किया जाएगा, जबकि फ़ंक्शन () कोड के साथ F तक निष्पादित नहीं किया जाता है () (केस का उपयोग करें? सिंटैक्स त्रुटि की जांच करें लेकिन कोड निष्पादित नहीं करना चाहते हैं)
G3z

2
@ स्टेफान इट्स बीटाइफुल ...new Function("alert('Hello World');")()
एंड्रेस मोरालेस

मैं एक कोशिश / पकड़ ब्लॉक के अंदर यह कोशिश की, और यह पूरी तरह से काम करता है। अब मैं किसी भी टेक्स्ट कोड में टाइप किए गए जावास्क्रिप्ट कोड को अपने फंक्शन में पास कर सकता हूं, और इसे निष्पादित कर सकता हूं। फिर कैच ब्लॉक जावास्क्रिप्ट इंजन से DOM तत्व में त्रुटि संदेश डाल सकता है और कोड में कोई त्रुटि प्रदर्शित कर सकता है। अगर कोई मेरे द्वारा लिखे गए फंक्शन को चाहता है, तो एक बार मैंने इसे टाइड कर दिया है, मैं इसे यहां पोस्ट कर सकता हूं।
डेविड एडवर्ड्स

@DavidEdwards भयानक होगा यदि आपके पास अभी भी यह है और इसे पोस्ट करें।
अनूप

60

evalसमारोह एक स्ट्रिंग है कि यह करने के लिए पारित हो जाता है का मूल्यांकन करेंगे।

लेकिन इसका इस्तेमाल evalखतरनाक हो सकता है , इसलिए सावधानी के साथ उपयोग करें।

संपादित करें: annakata में एक अच्छा बिंदु है - न केवल eval खतरनाक है , यह धीमा है । इसका कारण यह है कि मूल्यांकन किए जाने वाले कोड को मौके पर पार्स किया जाना चाहिए, ताकि कुछ कंप्यूटिंग संसाधनों को ले जाएगा।


34
सुपर खतरनाक और धीमा - आपको बोल्ड, इटैलिक, अंडरलाइन करना चाहिए, और एच 1 कि
एनाटाटा

5
मुझे संदेह है कि यह पृष्ठ पर कहीं और जावास्क्रिप्ट लोड करने की तुलना में कोई भी धीमा है, जिसे पार्स किया जाना है। यदि यह धीमा है, तो यह इसलिए है क्योंकि यह एक अलग दायरे में किया जाता है, जो उस दायरे के लिए संसाधनों के निर्माण के लिए मजबूर कर सकता है।
cgp

6
अगर आप कहते हैं eval()कि खतरनाक है। क्या कोई विकल्प है?
सफेद_जैको

4
@ मुझे पता है कि यह थोड़ा देर से है लेकिन यह खतरनाक क्यों है? उपयोगकर्ता कंसोल का उपयोग करके आसानी से आपकी वेबसाइट पर जावास्क्रिप्ट कोड चला सकता है।
jkd

7
यदि आपकी सुरक्षा क्लाइंट-साइड जावास्क्रिप्ट पर निर्भर करती है, तो आपने बड़ा समय खराब कर दिया है और इसका निष्कासन से कोई लेना-देना नहीं है।
मैथ्यू

20

Eval () का उपयोग करें।

Eval की डब्ल्यू 3 स्कूलों के दौरे । साइट के कुछ उदाहरण हैं।मोज़िला प्रलेखन में इस पर विस्तार से चर्चा की गई है।

आपको संभवतः इसे सुरक्षित रूप से उपयोग करने के बारे में बहुत सारी चेतावनी मिलेगीउपयोगकर्ताओं को कुछ भी निकालने के लिए अनुमति नहीं दें () क्योंकि यह एक बड़ा सुरक्षा मुद्दा है।

आप यह भी जानना चाहेंगे कि eval () का एक अलग क्षेत्र है


11
w3fools.com । W3C भी eval के बारे में कहने के लिए कुछ भी नहीं है। आप कुछ अधिकारी, लक्ष्य के लिए लिंक चाहते हैं ecma-international.org/ecma-262/5.1/#sec-15.1.2.1
Bergi

7
मैं "किसी भी अधिकारी से लिंक नहीं करना चाहता था, मैं कुछ पठनीय से लिंक करना चाहता था - जो आपने लिंक किया है उसे देखते हुए , यह इसका कोई स्पष्टीकरण नहीं देता है कि इसका उपयोग कैसे किया जाता है, कोई उदाहरण नहीं, टिंकर करने का कोई तरीका नहीं है, और अलगाव में विधि का वर्णन करता है। एक शुरुआत के लिए, यह एक पूरी तरह से अनुचित लिंक है। अरे, आप @bjorninge नहीं होगा, क्या आप?
cgp

1
कल्पना evalमुझे उस W3Schools लेख से बेहतर बताती है। अच्छी व्याख्या और उदाहरणों के साथ कुछ पठनीय होगा । developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… । और नहीं, मैं bjorninge नहीं हूँ
Bergi

मैं सहमत हूँ कि यह दस्तावेज़ीकरण नहीं है, और मैं सहमत हूँ कि मोज़िला का पृष्ठ इसकी एक बेहतर समग्र तस्वीर है। प्रतिक्रिया के आधार पर मेरे जवाब को थोड़ा
मोड़ दिया

1
उस ecma-international.org लिंक के बारे में, मैं इसे JS के साथ 15 मिनट से अधिक के अनुभव के साथ सभी के द्वारा पठनीय और प्रशंसनीय बताऊंगा। यह बहुत अच्छा है।
०३६__

16

इसे इस्तेमाल करे:

  var script = "<script type='text/javascript'> content </script>";
  //using jquery next
  $('body').append(script);//incorporates and executes inmediatelly

व्यक्तिगत रूप से, मैंने इसका परीक्षण नहीं किया, लेकिन काम करने के लिए लगता है।


1
आप स्क्रिप्ट में समापन से बचना भूल गए: var script = "<script type = \" text / javascript \ "> सामग्री </ script \>";
rlib

1
आपको समापन से बचने की आवश्यकता क्यों है>?
जूल्स

11

थोड़ा सा जो @ हसीं हाजीजादेह अलरदी ने कहा, हालांकि अधिक विस्तार से:

के लिए एक विकल्प है eval()

कार्यक्रम setTimeout() को मिलीसेकेंड के अंतराल के बाद कुछ निष्पादित करने के लिए डिज़ाइन किया गया है, और कोड को निष्पादित करने के लिए बस एक स्ट्रिंग के रूप में स्वरूपित किया जाना होता है।

यह इस तरह काम करेगा:

ExecuteJavascriptString(); //Just for running it

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    setTimeout(s, 1);
}

1 इसका मतलब है कि यह स्ट्रिंग निष्पादित करने से पहले 1 मिलीसेकंड इंतजार करेगा।

यह करने के लिए सबसे सही तरीका नहीं हो सकता है, लेकिन यह काम करता है।


जब आप 0 (शून्य) पास कर सकते हैं तो एक मिलीसेकंड क्यों बर्बाद करें setTimeout? ध्यान दें कि किसी भी स्थिति में यह निष्पादन को अतुल्यकालिक बना देगा। इसका अर्थ है कि setTimeoutकॉल का अनुसरण करने वाले सभी कोड को पास करने से पहले ही कॉल किया जाएगा setTimeout(भले ही 0 (शून्य) के साथ कहा जाए)।
jox

🤷🤷out बस यह बेहतर समझा कि कैसे setTimeout काम करता है
एंटोन

8
new Function('alert("Hello")')();

मुझे लगता है कि यह सबसे अच्छा तरीका है।


7

नीचे के रूप में eval का उपयोग करें । Eval का उपयोग सावधानी के साथ किया जाना चाहिए, " eval is बुराई " के बारे में एक सरल खोज कुछ संकेत फेंकनी चाहिए।

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    eval(s);
}

2
उस पर एक अच्छी खोज "बुराई बुराई है" के बारे में एक सरल खोज धन्यवाद!
टैपट्रोनिक

5

कई जटिल और अस्पष्ट लिपियों पर इसकी जाँच की:

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);

5

यदि आप किसी विशिष्ट समय के बाद किसी विशिष्ट कमांड (यानी स्ट्रिंग) को निष्पादित करना चाहते हैं - cmd = अपना कोड - InterVal = चलाने में देरी

 function ExecStr(cmd, InterVal) {
    try {
        setTimeout(function () {
            var F = new Function(cmd);
            return (F());
        }, InterVal);
    } catch (e) { }
}
//sample
ExecStr("alert(20)",500);

@SteelBrain ExecStr ("अलर्ट (20)", 500) द्वारा चलाए गए एक नमूना जोड़ें;
होसैन हाजीजादेह

1
क्यों है Valमें InterValपूंजीकृत?
रेडवुल्फ प्रोग्राम्स

4

उन उपयोगकर्ताओं के लिए जो नोड का उपयोग कर रहे हैं और जो eval()नोडज ऑफ़र के संदर्भ निहितार्थ से चिंतित हैं vm। यह एक V8 वर्चुअल मशीन बनाता है जो एक अलग संदर्भ में आपके कोड के निष्पादन को सैंडबॉक्स कर सकता है।

चीजों को एक कदम आगे ले जाना, vm2जो vmवीएम को अविश्वास कोड को चलाने की अनुमति देता है।

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.

2
"निष्कासन बुराई है" कहने के बजाय और कोई संदर्भ या समाधान नहीं देने पर, यह वास्तव में मुद्दे को हल करने की कोशिश करता है। आपके लिए +1
रेडवुल्फ प्रोग्राम्स

3
eval(s);

लेकिन यह खतरनाक हो सकता है यदि आप उपयोगकर्ताओं से डेटा ले रहे हैं, हालांकि मुझे लगता है कि अगर वे अपने स्वयं के ब्राउज़र को क्रैश करते हैं तो यह उनकी समस्या है।


1
बिल्कुल सही। सर्वर की तरफ ईवैल खतरनाक है। क्लाइंट पर ... इतना नहीं। उपयोगकर्ता केवल जावास्क्रिप्ट में टाइप कर सकता है: ब्राउज़र के पते और बूम के लिए someevilcode। वहाँ ठीक है।
एसेन स्कोव पेडर्सन

@EsbenSkovPedersen को क्रोम में कम से कम रोका जाता है, और इसके लिए उपयोगकर्ता कार्रवाई की आवश्यकता होती है, क्योंकि साइट evalसे उपयोगकर्ताओं के कोड का विरोध किया जाता है , जो उदाहरण के लिए उपयोगकर्ताओं को उनके पेज को लोड किए बिना केवल जानने के बिना अन्य उपयोगकर्ता के खाते चोरी कर सकता है।
1j01

1
@ १ जे ०१ निष्पक्ष होना मेरी टिप्पणी पाँच साल पुरानी है।
एसेन स्कोव पेडरसन

@EsbenSkovPedersen यह सच है :)
1j01

2

यकीन नहीं होता कि यह धोखा है या नहीं:

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


2

मैं इसी तरह के सवाल का जवाब दे रहा था और एक और विचार आया कि इसे बिना उपयोग के कैसे हासिल किया जाए eval():

const source = "alert('test')";
const el = document.createElement("script");
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));
document.head.appendChild(el);

ऊपर दिए गए कोड में आप मूल रूप से ऑब्जेक्ट स्क्रिप्ट (फ़ाइल या ब्लॉब ऑब्जेक्ट का ब्राउज़र मेमोरी में प्रतिनिधित्व) बनाने के लिए, अपनी स्क्रिप्ट युक्त ब्लॉब बनाते हैं। चूंकि आपके पास टैग srcपर संपत्ति है <script>, लिपि को उसी तरह निष्पादित किया जाएगा जैसे कि इसे किसी अन्य URL से लोड किया गया था।


2
function executeScript(source) {
    var script = document.createElement("script");
    script.onload = script.onerror = function(){ this.remove(); };
    script.src = "data:text/plain;base64," + btoa(source);
    document.body.appendChild(script);
}

executeScript("alert('Hello, World!');");


0
eval(s);

हालांकि, याद रखें कि यह बहुत शक्तिशाली है और काफी असुरक्षित है। आपको बेहतर विश्वास है कि आपके द्वारा निष्पादित की जा रही स्क्रिप्ट उपयोगकर्ताओं द्वारा सुरक्षित और अप्राप्य है।


1
जेएस में उपयोगकर्ता द्वारा सब कुछ बदला जा सकता है "टाइप करें जावास्क्रिप्ट: डॉक्यूमेंट.राइट (" हैलो वर्ल्ड ");" लगभग किसी भी ब्राउजर के एड्रेस बार में।
१२:

1
हां, लेकिन आप वैश्विक चर का उपयोग न करके, क्लोजर में अपने कार्यों को छुपाना, प्लेग की तरह eval से बचकर =)
PatrikAkerstrand

0

एक गणित का उपयोग कर सकते हैं

उपरोक्त लिंक से स्निपेट:

// 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कोई भी वस्तु है इसलिए यदि आप एवलाट फ़ंक्शन के लिए वैश्विक स्कोप पास करते हैं, तो आप गतिशील रूप से अलर्ट () को निष्पादित करने में सक्षम हो सकते हैं।

मैथज भी eval () की तुलना में बहुत बेहतर विकल्प है क्योंकि यह सैंडबॉक्स में चलता है।

एक उपयोगकर्ता अभिव्यक्ति पार्सर के माध्यम से दुर्भावनापूर्ण जावास्क्रिप्ट कोड को इंजेक्ट करने की कोशिश कर सकता है। मैथज के अभिव्यक्ति पार्सर एक सैंडबॉक्स वाले वातावरण को अभिव्यक्तियों को निष्पादित करने के लिए प्रदान करते हैं जो इसे असंभव बनाना चाहिए। हालांकि यह संभव है कि अज्ञात सुरक्षा कमजोरियां हैं, इसलिए सावधान रहना महत्वपूर्ण है, खासकर जब सर्वर साइड को मनमाने ढंग से अभिव्यक्ति के निष्पादन की अनुमति देता है।

मैथज के नए संस्करण इवेल () या फंक्शन () का उपयोग नहीं करते हैं।

पार्सर सक्रिय रूप से JavaScripts आंतरिक निष्कासन और नए फ़ंक्शन तक पहुंच को रोकता है जो सुरक्षा हमलों का मुख्य कारण हैं। Mathjs के संस्करण 4 और नए में हूड के तहत जावास्क्रिप्ट के उपयोग का उपयोग नहीं किया गया है। संस्करण 3 और पुराने ने संकलन चरण के लिए eval का उपयोग किया। यह सीधे सुरक्षा का मुद्दा नहीं है, बल्कि एक बड़े संभावित हमले की सतह पर परिणाम देता है।


0

दोनों का उपयोग करना और जावास्क्रिप्ट को निष्पादित करने के लिए एक नया फ़ंक्शन बनाना सुरक्षा जोखिमों के साथ आता है।

const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);

मैं एक स्ट्रिंग के रूप में प्राप्त जावास्क्रिप्ट को निष्पादित करने के लिए इस पद्धति को पसंद करता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.