Access control: только владелец может вызвать метод
Ограничишь admin-методы проверкой owner в Tact и FunC и избежишь «открытого» setCode/withdraw.
Access control
Любой метод, который меняет критичное состояние (owner, код, вывод средств, параметры экономики), обязан проверять, что sender() — уполномоченный адрес. Без проверки «админка» доступна всей сети.
Уязвимо: withdraw без owner
tact (fallback highlight)
// @tact-lang/compiler 1.6.13// УЯЗВИМОmessage SetOwner { next: Address;}contract TreasuryBad { receive(msg: SetOwner) { // любой перепишет владельца // (в этом сниппете owner даже не хранится — только демонстрация дыры) } receive("drain") { send(SendParameters{ to: sender(), value: 0, mode: SendRemainingBalance, bounce: false, }); }}
func (fallback highlight)
;; FunC (func 0.4.6) — УЯЗВИМО: нет сравнения с owner в storage() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure { slice cs = in_msg_full.begin_parse(); cs~load_uint(4); slice sender_addr = cs~load_msg_addr(); ;; дальше — действие без проверки sender_addr == owner}
Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация