Rust akıllı sözleşmeler yetiştirme günlüğü: hizmet reddi saldırısı önleme
hizmet reddi saldırısı ( DoS ) saldırısı, akıllı sözleşmelerin bir süreliğine ya da kalıcı olarak düzgün çalışamamasına neden olabilir. Yaygın nedenler arasında:
Sözleşme mantığındaki hesaplama karmaşıklığı sorunu, Gas tüketiminin sınırını aşmasına neden olur.
Akıllı sözleşmeler arası çağrılarda, dış sözleşmelerin yürütme durumuna yanlış bağımlılık, bu sözleşmenin engellenmesine neden olur.
Sözleşme sahibi özel anahtar kayboldu, bu da ayrıcalıklı fonksiyonların çağrılamamasına ve önemli sistem durumunun güncellenememesine neden oldu.
Aşağıda, DoS saldırı açıklarını ve bunların çözüm yollarını analiz etmek için birkaç somut örnek verilecektir.
1. Dışarıdan değiştirilebilen büyük veri yapılarında döngüsel gezinme
Aşağıda bir "temettü" akıllı sözleşmesi bulunmaktadır, hizmet reddi saldırısı riski vardır:
pas
#[near_bindgen]
#[derive(BorshDeserialize, BorshSerialize)]
pub struct Sözleşme {
pub kayıtlı: Vec,
pub hesaplar: SırasızHarita<accountid, bakiye="">,
}
impl Sözleşme {
pub fn register_account(&mut self) {
if self.accounts.insert(&env::predecessor_account_id(), &0).is_some() {
env::panic("Hesap zaten kayıtlı".to_string().as_bytes());
} else {
self.registered.push(env::predecessor_account_id());
}
log!("Kayıtlı hesap {}", env::önceki_hesap_id());
}
pub fn distribute_token(&mut self, amount: u128) {
assert_eq!(env::predecessor_account_id(), DISTRIBUTOR, "ERR_NOT_ALLOWED");
for cur_account in self.registered.iter() {
let balance = self.accounts.get(&cur_account).expect("ERR_GET");
self.accounts.insert(&cur_account, &balance.checked_add(amount).expect("ERR_ADD"));
log!("Hesaba {} dağıtmaya çalışın", &cur_account);
ext_ft_token::ft_transfer(
cur_account.clone(),
miktar,
&FTTOKEN,
0,
TEKÇAĞRI İÇİN GAZ
);
}
}
}
Sorun, registered dizisinin boyutunun bir sınırı olmaması ve kötü niyetli kullanıcılar tarafından çok büyük hale getirilmesi, bu nedenle distribute_token fonksiyonu çalıştırıldığında Gas tüketiminin sınırı aşmasıdır.
Önerilen çözüm:
registered dizisinin boyutunu sınırlayın.
"Çekim" modunu benimseyin, kullanıcıların ödülleri kendilerinin çekmesine izin verin, sözleşmenin aktif olarak dağıtması yerine.
2. Akıllı sözleşmelerin durumu bağımlılığı nedeniyle sözleşme engellenmesi
Aşağıda bir "tender" akıllı sözleşme örneği bulunmaktadır:
pas
#[near_bindgen]
#[derive(BorshDeserialize, BorshSerialize)]
pub struct Sözleşme {
pub kayıtlı: Vec,
pub bid_price: UnorderedMap\u003caccountid,balance\u003e,
mevcut_lider: HesapId,
en yüksek teklif: u128,
pub iade: bool
}
impl Sözleşme {
PromiseOrValue {
assert!(miktar > self.en_yüksek_teklif);
Sorun, sözleşme durum güncellemelerinin dış sözleşme çağrılarına bağımlı olmasıdır. Eğer önceki en yüksek teklif verenin hesabı kapatılmışsa, sonraki teklif verenler durumu güncelleyemez.
Önerilen çözüm:
Dış çağrıların başarısız olabileceği durumları dikkate alarak, makul bir hata işleme mekanizması uygulayın. Örneğin, geri alınamaz tokenleri sözleşmede geçici olarak saklayın ve daha sonra kullanıcılara aktif olarak çekme izni verin.
3. Sahip özel anahtar kayboldu
Birçok sözleşme yalnızca sahip tarafından yürütülebilen ayrıcalıklı işlevler içerir. Eğer sahip özel anahtarı kaybolursa, bu işlevler çağrılmaz hale gelir ve sözleşmenin düzgün çalışmamasına neden olabilir.
Önerilen çözüm:
Birden fazla sözleşme sahibini ortak yönetim için ayarlayın.
Tek bir sahibi kontrol etmek yerine çoklu imza mekanizması kullanın.
Merkeziyetsiz bir sözleşme yönetim mekanizmasının gerçekleştirilmesi.
Yukarıdaki önlemlerle, akıllı sözleşmelerde hizmet reddi saldırısı riskini etkili bir şekilde azaltabilir, sözleşmenin güvenliğini ve güvenilirliğini artırabilirsiniz.
<accountid,balance><accountid,>
View Original
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
22 Likes
Reward
22
8
Share
Comment
0/400
MEVHunterWang
· 12h ago
Bir sözleşmeyi bozmaya gelince, elinde tutarak yapabilirsin.
View OriginalReply0
ProofOfNothing
· 16h ago
Yine formalizmin kağıt üzerinde konuşulması.
View OriginalReply0
LuckyHashValue
· 19h ago
Saldırı engellenmedi, yine sıfıra düşme zamanı geldi.
View OriginalReply0
ColdWalletGuardian
· 19h ago
Blok Zinciri Giriş Temel Bilgileri
View OriginalReply0
SelfSovereignSteve
· 19h ago
Özel Anahtar kaybolursa kötü olur.
View OriginalReply0
StableBoi
· 19h ago
Bu sözleşmenin riskleri gerçekten biraz fazla, istikrarı pek iyi değil.
View OriginalReply0
Ser_This_Is_A_Casino
· 19h ago
Ah~Rust gerçekten zor, Solidity'yi düşünmekten daha iyi.
View OriginalReply0
GasFeeThunder
· 19h ago
gas çok fazla yenildiğinde ne olur? Er ya da geç sözleşme tamamen boşaltılacak.
Rust akıllı sözleşmeler DoS saldırılarına karşı korunma uygulama kılavuzu
Rust akıllı sözleşmeler yetiştirme günlüğü: hizmet reddi saldırısı önleme
hizmet reddi saldırısı ( DoS ) saldırısı, akıllı sözleşmelerin bir süreliğine ya da kalıcı olarak düzgün çalışamamasına neden olabilir. Yaygın nedenler arasında:
Sözleşme mantığındaki hesaplama karmaşıklığı sorunu, Gas tüketiminin sınırını aşmasına neden olur.
Akıllı sözleşmeler arası çağrılarda, dış sözleşmelerin yürütme durumuna yanlış bağımlılık, bu sözleşmenin engellenmesine neden olur.
Sözleşme sahibi özel anahtar kayboldu, bu da ayrıcalıklı fonksiyonların çağrılamamasına ve önemli sistem durumunun güncellenememesine neden oldu.
Aşağıda, DoS saldırı açıklarını ve bunların çözüm yollarını analiz etmek için birkaç somut örnek verilecektir.
1. Dışarıdan değiştirilebilen büyük veri yapılarında döngüsel gezinme
Aşağıda bir "temettü" akıllı sözleşmesi bulunmaktadır, hizmet reddi saldırısı riski vardır:
pas #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Sözleşme { pub kayıtlı: Vec, pub hesaplar: SırasızHarita<accountid, bakiye="">, }
impl Sözleşme { pub fn register_account(&mut self) { if self.accounts.insert(&env::predecessor_account_id(), &0).is_some() { env::panic("Hesap zaten kayıtlı".to_string().as_bytes()); } else { self.registered.push(env::predecessor_account_id()); } log!("Kayıtlı hesap {}", env::önceki_hesap_id()); }
}
Sorun, registered dizisinin boyutunun bir sınırı olmaması ve kötü niyetli kullanıcılar tarafından çok büyük hale getirilmesi, bu nedenle distribute_token fonksiyonu çalıştırıldığında Gas tüketiminin sınırı aşmasıdır.
Önerilen çözüm:
registered dizisinin boyutunu sınırlayın.
"Çekim" modunu benimseyin, kullanıcıların ödülleri kendilerinin çekmesine izin verin, sözleşmenin aktif olarak dağıtması yerine.
2. Akıllı sözleşmelerin durumu bağımlılığı nedeniyle sözleşme engellenmesi
Aşağıda bir "tender" akıllı sözleşme örneği bulunmaktadır:
pas #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Sözleşme { pub kayıtlı: Vec, pub bid_price: UnorderedMap\u003caccountid,balance\u003e, mevcut_lider: HesapId, en yüksek teklif: u128, pub iade: bool }
impl Sözleşme { PromiseOrValue { assert!(miktar > self.en_yüksek_teklif);
}
Sorun, sözleşme durum güncellemelerinin dış sözleşme çağrılarına bağımlı olmasıdır. Eğer önceki en yüksek teklif verenin hesabı kapatılmışsa, sonraki teklif verenler durumu güncelleyemez.
Önerilen çözüm:
Dış çağrıların başarısız olabileceği durumları dikkate alarak, makul bir hata işleme mekanizması uygulayın. Örneğin, geri alınamaz tokenleri sözleşmede geçici olarak saklayın ve daha sonra kullanıcılara aktif olarak çekme izni verin.
3. Sahip özel anahtar kayboldu
Birçok sözleşme yalnızca sahip tarafından yürütülebilen ayrıcalıklı işlevler içerir. Eğer sahip özel anahtarı kaybolursa, bu işlevler çağrılmaz hale gelir ve sözleşmenin düzgün çalışmamasına neden olabilir.
Önerilen çözüm:
Birden fazla sözleşme sahibini ortak yönetim için ayarlayın.
Tek bir sahibi kontrol etmek yerine çoklu imza mekanizması kullanın.
Merkeziyetsiz bir sözleşme yönetim mekanizmasının gerçekleştirilmesi.
Yukarıdaki önlemlerle, akıllı sözleşmelerde hizmet reddi saldırısı riskini etkili bir şekilde azaltabilir, sözleşmenin güvenliğini ve güvenilirliğini artırabilirsiniz.