تبدو هجمات إعادة الدخول معقدة في البداية. دعني أبسطها لك بمصطلحات بسيطة ويظهر لك بعض الطرق للحفاظ على أمان العقود الذكية 🛡️
ما هو هجوم إعادة الدخول؟ 🧐
إنها عندما يقوم ContractB بالاتصال مرة أخرى بـ ContractA بينما لا يزال ContractA قيد التشغيل. أشياء سيئة. يحب المهاجمون هذه الثغرة لاستنزاف الأموال من العقود 💸
تخيل هذا:
عقد يحمل 10 ETH
وضع ContractB في 1 ETH
ثم يسرق ContractB كل شيء
آلية الهجوم 🕵️♂️
تحتاج إلى شيئين رئيسيين:
attack() وظيفة لبدء كل شيء
fallback() وظيفة للجزء الماكر
تسير العملية كالتالي:
ContractB يبدأ الهجوم() الذي يستدعي سحب ContractA()
ContractA يتحقق من رصيد ContractB
يرسل ContractA ETH إلى ContractB
هذا يُشغّل الاسترجاع ContractB()
الحلقة تستمر. الأموال ذهبت 🚨
من المفاجئ نوعًا ما مدى بساطة هذا ومع ذلك مدى تدميره.
مثال على الكود الضعيف 📝
إليك ما يبدو عليه العقد القابل للاختراق:
صلابه
وظيفة withdrawAll() عامة {
uint bal = أرصدة [msg.sender];
require(bal > 0).
(bool تم إرسالها ، ) = msg.sender.call {value: bal}("");
require(sent, "فشل في إرسال الإيثر");
balances[msg.sender] = 0; // تحديث بعد الإرسال؟ خطأ كبير!
}
يظهر عقد الهجوم هذا:
صلابه
fallback() خارجي قابل للدفع {
if(etherStore.balance >= 1 ether)
etherStore.withdrawAll();
}
function attack() خارجي قابل للدفع {
require(msg.value >= 1 ether) ؛
etherStore.deposit{القيمة: 1 إيثر} ();
etherStore.withdrawAll();
}
اعتبارًا من سبتمبر 2025، لا تزال هذه الهجمات تؤرق DeFi. ليس من الواضح تمامًا لماذا يواصل المطورون ارتكاب نفس الأخطاء. يمكن لأدوات مثل Slither اكتشاف هذه المشكلات. تساعد Echidna و Foundry في اختبارها 🚀
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
فهم هجمات إعادة الدخول وكيفية منعها 🔐
تبدو هجمات إعادة الدخول معقدة في البداية. دعني أبسطها لك بمصطلحات بسيطة ويظهر لك بعض الطرق للحفاظ على أمان العقود الذكية 🛡️
ما هو هجوم إعادة الدخول؟ 🧐
إنها عندما يقوم ContractB بالاتصال مرة أخرى بـ ContractA بينما لا يزال ContractA قيد التشغيل. أشياء سيئة. يحب المهاجمون هذه الثغرة لاستنزاف الأموال من العقود 💸
تخيل هذا:
آلية الهجوم 🕵️♂️
تحتاج إلى شيئين رئيسيين:
تسير العملية كالتالي:
من المفاجئ نوعًا ما مدى بساطة هذا ومع ذلك مدى تدميره.
مثال على الكود الضعيف 📝
إليك ما يبدو عليه العقد القابل للاختراق: صلابه وظيفة withdrawAll() عامة { uint bal = أرصدة [msg.sender]; require(bal > 0).
}
يظهر عقد الهجوم هذا: صلابه fallback() خارجي قابل للدفع { if(etherStore.balance >= 1 ether) etherStore.withdrawAll(); }
function attack() خارجي قابل للدفع { require(msg.value >= 1 ether) ؛ etherStore.deposit{القيمة: 1 إيثر} (); etherStore.withdrawAll(); }
ثلاث طرق لوقف هذه الهجمات 🛡️
1. غير قابلة لإعادة الدخول المعدل 🔒
الصمود bool خاص مقفل = false;
المعدل nonReentrant() { require(!locked, "لا إعادة دخول"); مقفلة = true; _; مقفل = خطأ; }
أضفه إلى الوظائف الضعيفة. بسيطة ولكن فعالة.
2. نمط الفحوصات-التأثيرات-التفاعلات 📊
هذا أمر حاسم:
سوليديتي وظيفة withdrawAll() عامة { uint bal = أرصدة [msg.sender]; require(bal > 0).
}
قم بتحديث ولايتك أولاً. تفاعل لاحقاً. دائماً.
3. الحماية العالمية 🌐
للمشاريع الأكبر:
صلابه عقد GlobalReentrancyGuard { bool خاص مغلق = false;
}
اجعل جميع عقودك ترث هذا. نظام بيئي أكثر أمانًا.
أحدث الاتجاهات 🔥
اعتبارًا من سبتمبر 2025، لا تزال هذه الهجمات تؤرق DeFi. ليس من الواضح تمامًا لماذا يواصل المطورون ارتكاب نفس الأخطاء. يمكن لأدوات مثل Slither اكتشاف هذه المشكلات. تساعد Echidna و Foundry في اختبارها 🚀
الأمان ليس مجرد إضافة مُعدل. إنها عقلية.
ابق حذرًا هناك! 🛡️