Qo'shimcha mavzular
Eval: kod satrini ishga tushirish
eval โ o'rnatilgan funksiya bo'lib, satr (string) ko'rinishida berilgan JavaScript kodini ishga tushirib, natijasini qaytaradi. U kuchli, ammo xavfli โ shu sabab zamonaviy kodda deyarli ishlatilmaydi.
Sintaksis
eval(code) satrni kod sifatida bajaradi va oxirgi ifodaning qiymatini qaytaradi:
// natija shu yerda chiqadi
Kod bir nechta ifoda va operatordan iborat bo'lishi mumkin:
// natija shu yerda chiqadi
eval ko'lami (scope)
eval ichidagi kod joriy leksik ko'lamda ishlaydi, ya'ni atrofdagi o'zgaruvchilarni ko'ra oladi:
// natija shu yerda chiqadi
Zamonaviy qat'iy rejimda (
"use strict") eval ichida e'lon qilingan o'zgaruvchilar tashqi ko'lamga sizib chiqmaydi โ ular faqat eval ichida yashaydi. Bu tashqi kodni ifloslanishdan himoya qiladi.// natija shu yerda chiqadi
Nega eval xavfli?
eval odatda quyidagi sabablarga ko'ra tavsiya etilmaydi:
- Xavfsizlik โ agar satr foydalanuvchidan yoki tashqi manbadan kelsa, unda zararli kod bo'lishi mumkin.
evaluni cheklovsiz bajaradi; - Sekinlik โ dvigatel
evalichidagi kodni oldindan kompilyatsiya va optimallashtira olmaydi; - Nosozliklarni tuzatishda qiyinchilik โ satr ichidagi kodni tahrirlagichlar tekshirmaydi, xatolarni topish qiyin;
- Minifikatsiya muammosi โ kod qisqartirilganda tashqi o'zgaruvchilar nomi o'zgaradi,
evalichidagi satr esa eskicha qoladi va buziladi.
Foydalanuvchi kiritgan matnni hech qachon to'g'ridan-to'g'ri
evalga bermang. Bu ilovangizni to'liq egallab olishga imkon beruvchi jiddiy xavfsizlik teshigi.Muqobillar
Deyarli har doim evalsiz yaxshiroq yechim topiladi:
- Obyekt xususiyatiga dinamik nom bilan murojaat โ
obj[nomSatr](kvadrat qavs); - JSON matnini o'qish โ
JSON.parse(satr)(evaldan xavfsiz va tez); - Nomga ko'ra funksiya chaqirish โ funksiyalarni obyektga ("lug'atga") joylash;
- Cheklangan, izolyatsiyalangan bajarish kerak bo'lsa โ
new Functionyoki Web Worker.
Dinamik xususiyat nomi bilan evalsiz ishlash:
// natija shu yerda chiqadi
new Function โ evalga o'xshaydi, lekin kodni global ko'lamda ishlatadi, shuning uchun tashqi mahalliy o'zgaruvchilarga tegmaydi (bu esa aksincha xavfsizroq):
// natija shu yerda chiqadi
Agar dinamik kod juda zarur bo'lsa,
eval o'rniga new Functionni afzal ko'ring โ u tashqi ko'lamga kira olmaydi, demak kamroq xavf tug'diradi.Xulosa
eval(code)satr ko'rinishidagi kodni bajaradi va oxirgi ifoda qiymatini qaytaradi;- U joriy ko'lamni ko'radi; qat'iy rejimda o'zgaruvchilari sizib chiqmaydi;
- Xavfsizlik, sekinlik va nosozlik tuzatish sabablariga ko'ra tavsiya etilmaydi;
- Ko'p hollarda kvadrat qavs,
JSON.parseyoki obyekt-lug'at yechadi; - Chindan kerak bo'lsa โ
new Functionxavfsizroq muqobil.