Noções Básicas de Segurança
8 exemplos para você começar com segurança de programas - 5 básicos e 3 intermediários. Abrange o modelo de ameaça Solana, validação de conta, verificações de signatário e design fail-closed no Anchor 0.32.1.
Busque em todas as páginas da documentação
8 exemplos para você começar com segurança de programas - 5 básicos e 3 intermediários. Abrange o modelo de ameaça Solana, validação de conta, verificações de signatário e design fail-closed no Anchor 0.32.1.
anchor-lang 0.32.1.anchor --version # 0.32.1Qualquer conta que move fundos ou muda autoridade deve assinar.
#[derive(Accounts)]
pub struct Withdraw<'info> {
#[account(mut)]
pub vault: Account<'info, Vault>,
pub authority: Signer<'info>,
}Signer<'info> falha se a conta não assinou a transação.Signer a menos que você use invoke_signed.Relacionado: Verificações de Signatário e Owner - padrões mais profundos
Somente o programa proprietário deve interpretar dados da conta.
// Account<'info, T> já garante owner == crate::ID - nenhuma restrição necessária.
pub vault: Account<'info, Vault>,
/// CHECK: owner validado manualmente
pub raw_vault: UncheckedAccount<'info>,
// no handler, para a conta não verificada:
require_keys_eq!(*ctx.accounts.raw_vault.owner, crate::ID, ErrorCode::InvalidOwner);Account<'info, T> do Anchor verifica owner == crate::ID automaticamente para seus tipos.constraint = vault.owner == ... em um Account<'info, T> - ele Deref para sua struct de estado, então .owner significa um campo em seus dados, não o proprietário do programa da conta.AccountInfo e UncheckedAccount pulam a verificação de owner - use *account.owner no AccountInfo e valide manualmente.Relacionado: Ataques de Validação de Conta
PDAs devem ser derivadas com sementes canônicas e bump.
#[account(
seeds = [b"vault", authority.key().as_ref()],
bump = vault.bump,
)]
pub vault: Account<'info, Vault>,Relacionado: Ataques de PDA e Semente
Quantidades de token e shares podem estourar em builds de release, a menos que o workspace ative as verificações de overflow.
let new_balance = old_balance
.checked_add(amount)
.ok_or(ErrorCode::Overflow)?;overflow-checks = true esteja definido em [profile.release] (o template padrão do Anchor o define), +/-/* simples envolvem silenciosamente - verifique se a flag está presente no repositório auditado.checked_*, saturating_* ou intermediários u128: um panic de overflow aborta a instrução com um erro genérico em vez do seu erro tipado.Relacionado: Aritmética e Overflow
Previna reinicialização de contas já inicializadas.
#[account(
init,
payer = payer,
space = 8 + Vault::INIT_SPACE,
)]
pub vault: Account<'info, Vault>,init uma vez, depois mut em instruções subsequentes.init_if_needed é perigoso sem uma guarda de flag is_initialized.Relacionado: Ataques de Reinicialização
Callees devem ser o programa que você espera, não um impostor.
let cpi_program = ctx.accounts.token_program.to_account_info();
require_keys_eq!(cpi_program.key(), anchor_spl::token::ID, ErrorCode::BadProgram);require_keys_eq!.Relacionado: Riscos de CPI e Reentrância
Drene lamports para destino e zere dados para prevenir revival.
#[account(
mut,
close = destination,
)]
pub temp: Account<'info, Temp>,
#[account(mut)]
pub destination: SystemAccount<'info>,close do Anchor drena lamports para o destino, zera o comprimento dos dados e reatribui a conta ao Programa do Sistema para que ela não possa ser revivida dentro da transação.destination deve ser gravável - marque-o como #[account(mut)] ou close = destination falhará.Lógica dependente de preço deve rejeitar feeds obsoletos.
let price = feed
.get_price_no_older_than(clock.unix_timestamp, 60)
.ok_or(ErrorCode::StaleOracle)?;Relacionado: Oráculos - integração de feed
Versões da stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0 e LiteSVM 0.6.x.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026