Prototype pollution
Prototype pollution riskini ve hasOwnProperty ile nasıl korunacağını öğrenirsin.
Prototype pollution riski
JavaScript'te for...in döngüsü, bir nesnenin kendi özelliklerinin yanı sıra prototip zincirindeki özellikleri de dolaşır. Bu, beklenmedik özelliklerin ortaya çıkmasına yol açabilir.
Object.prototype.gift = 'sürpriz';
const obj = { name: 'Ayşe' };
for (const key in obj) {
console.log(key); // name, gift
}Bu duruma prototype pollution benzeri sorunlar denir. Eklenen gift, hiç beklenmeyen yerlerde görünür. Bu yüzden hasOwnProperty ile süzmek gerekir.
Güvenli dolaşma
hasOwnProperty, bir özelliğin nesnenin kendisine mi yoksa prototip zincirine mi ait olduğunu söyler. for...in içinde bununla süzme yaparsın.
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}Daha kısa yol: Object.keys(obj) yalnızca kendi özelliklerini dizi olarak verir, prototipi dahil etmez. İkisi de güvenlidir; Object.keys çoğu durumda daha okunaklıdır.
Uygulama for...in içinde hasOwnProperty ile süz
obj nesnesini { name: 'Ayşe', age: 28 } olarak tanımla. Object.prototype.gift'e 'sürpriz' değerini ata. for...in ile obj'nin anahtarlarını dolaş; obj.hasOwnProperty(key) doğruysa console.log(key, obj[key]) çağır. Sonra console.log(Object.keys(obj)) ile de dizi halinde yazdır.
Örnek çözümü göster
Object.prototype.gift = 'sürpriz';
const obj = { name: 'Ayşe', age: 28 };
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
console.log(Object.keys(obj));
Kendini test et
-
for...in ile dolaşırken ne yapmalısın?
- for...in zaten yalnızca kendi özelliklerini dolaşır
- hasOwnProperty ile yalnızca kendi özellikleri süz
- Object.create(null) ile nesneyi yeniden üret
- Prototipi sil
Cevabı göster
hasOwnProperty ile yalnızca kendi özellikleri süz — Doğru! hasOwnProperty ile yalnızca kendi özellikleri alırsın.
-
for...in içinde hasOwnProperty
for (const key in obj) { if (obj.____(key)) { console.log(key); } }Cevabı göster
for (const key in obj) { if (obj.hasOwnProperty(key)) { console.log(key); } } -
Güvenli ve tehlikeli desenleri eşleştir
- for...in
- prototip dahil
- Object.keys
- sadece kendi
- hasOwnProperty
- kendi özellik kontrolü
- Object.prototype.x = ...
- tehlikeli