मान लीजिए कि आप उपयोगकर्ता को अन्य जावास्क्रिप्ट निष्पादन योग्य कोड के बजाय इच्छित डेटा को सुनिश्चित करने के लिए उचित रूप से ऑपरेटरों और ऑपरेटरों को प्रदान कर रहे हैं, तो आप ऑपरेटर के साथ दो ऑपरेटरों को बीच में जोड़ सकते हैं और इसे eval()
पर फ़ीड कर सकते हैं इसे निष्पादित किया गया।
अब, eval()
खतरनाक है क्योंकि यह किसी भी जावास्क्रिप्ट कोड को निष्पादित कर सकता है। उपयोगकर्ता निष्पादन योग्य और संभावित रूप से दुर्भावनापूर्ण जावास्क्रिप्ट कोड को ऑपरेटर के रूप में खिला सकता है और eval()
इसका मूल्यांकन करेगा। इसलिए, जब आप concatenation करते हैं, तो आपको यह सत्यापित करने के बाद यह करना चाहिए कि ऑपरेंड सुरक्षित है। इस बिंदु पर जोर देने के लिए, मैं बड़े फोंट में कंप्यूटर सुरक्षा के सबसे महत्वपूर्ण सिद्धांतों में से एक लिखूंगा:
अन्य इनपुट अन्यथा सिद्ध होने तक बुराई है।
यह भी ध्यान दें कि eval()
जावास्क्रिप्ट दुभाषिया को आपके कोड की व्याख्या, संकलन और निष्पादन करने के लिए कहते हैं। यह धीमा है। जबकि आप किसी भी अवलोकन योग्य प्रदर्शन मुद्दे पर ध्यान नहीं दे सकते हैं, यदि आप थोड़ी देर में eval()
का उपयोग कर रहे हैं, तो आप प्रत्येक कुंजीपटल पर eval()
को कॉल करते समय प्रदर्शन समस्याओं को देख सकते हैं।
eval()
के इन दोषों को ध्यान में रखते हुए, आप फ़ेलिक्स क्लिंग द्वारा पोस्ट किए गए एक निएटर समाधान के लिए जाना चाह सकते हैं।
function compare(a, op, b)
{
// Check that we have two numbers and an operator fed as a string.
if (typeof a != 'number' || typeof b != 'number' || typeof op != 'string')
return
// Make sure that the string doesn't contain any executable code by checking
// it against a whitelist of allowed comparison operators.
if (['<', '>', '<=', '>=', '==', '!='].indexOf(op) == -1)
return
// If we have reached here, we are sure that a and b are two integers and
// op contains a valid comparison operator. It is now safe to concatenate
// them and make a JavaScript executable code.
if (eval(a + op + b))
doSomething();
}
ध्यान दें कि एक श्वेत सूची के खिलाफ इनपुट मान्य लगभग हमेशा एक काली सूची के खिलाफ यह मान्य तुलना में एक बेहतर विचार है: हालांकि, यह भी संभव इस समस्या को एक सुरक्षित तरीके से eval()
का उपयोग कर हल करने के लिए के रूप में नीचे दिखाया गया है। इस पर एक संक्षिप्त चर्चा के लिए https://www.owasp.org/index.php/Input_Validation_Cheat_Sheet#White_List_Input_Validation देखें। शामिल जेसी के परीक्षण का मामला साथ डेमो:: http://jsfiddle.net/YrQ4C/ (कोड भी नीचे reproduced):
function doSomething()
{
alert('done something!')
}
function compare(a, op, b)
{
if (typeof a != 'number' || typeof b != 'number' || typeof op != 'string')
return
if (['<', '>', '<=', '>=', '==', '!='].indexOf(op) == -1)
return
if (eval(a + op + b))
doSomething();
}
// Positive test cases
compare(2, '<', 3)
compare(2, '<=', 3)
// Negative test cases
compare(2, '>', 3)
compare(2, '>=', 3)
// Attack tests
compare('alert(', '"attack!"', ')')
// Edit: Adding a new attack test case given by Jesse
// in the comments below. This function prevents this
// attack successfully because the whitelist validation
// for the second argument would fail.
compare(1, ';console.log("executed code");2==', 2)
संपादित http://jsfiddle.net/99eP2/
नहीं, आप जेएस –