Domanda

Sembra che si possa fermare tutta la minaccia di iniezione di SQL una volta per tutte semplicemente rifiutando tutte le domande che non usano i parametri nominati. Qualche modo per configurare SQL Server per farlo? Oppure qualche modo per applicarlo a livello di applicazione ispezionando ogni query senza scrivere un intero parser SQL? Grazie.

È stato utile?

Soluzione

Ci sono solo un paio di modi per farlo. OMG Ponies ha la risposta migliore: non consentire le istruzioni SQL dirette rispetto al database e sfruttare invece gli strumenti e la sicurezza SQL Server può fornire.

Un modo alternativo sarebbe quello di aggiungere un livello aggiuntivo che tutte le domande dovrebbero passare. In breve, passeresti tutte le query (SOA Architecture) a una nuova app che valuterebbe la query per passare a SQL Server. Ho visto esattamente una società farlo in reazione ai problemi di iniezione di SQL che il loro sito aveva.

Naturalmente, questo è un modo orribile di fare le cose perché l'iniezione di SQL è solo un potenziale problema.

Oltre l'iniezione di SQL, hai anche problemi di ciò che accade quando il sito stesso è rotto. Una volta che è possibile scrivere una nuova pagina su un server Web, diventa banale per passare qualsiasi query desideri al server di database associato. Ciò aggirerebbe facilmente qualsiasi cosa a livello di codice che potresti mettere in atto. E consentirebbe all'attaccante di scrivere select * from ... o truncate table ... Diamine, una persona interna potrebbe potenzialmente connettersi direttamente al server SQL utilizzando le credenziali dei siti ed eseguire qualsiasi domanda desiderata.

Il punto è che se si sfrutta la sicurezza integrata in SQL Server per impedire l'accesso alla tabella diretta, è possibile controllare tramite procedure memorizzate l'intera gamma di azioni disponibili a chiunque tenta di connettersi al server.

Altri suggerimenti

  1. Rimuovere le sovvenzioni per un ruolo per poter selezionare/aggiornare/inserire/eliminare contro le tabelle coinvolte
  2. Concedere l'esecuzione del ruolo per procedure/funzioni memorizzate/ecc.
  3. Associa il ruolo agli utenti del database che si desidera proteggere

Non fermerà un account che ha anche la possibilità di concedere l'accesso, ma impedirà agli utenti associati al ruolo (supponendo che nessun'altra sovvenzione su base per utente) sia in grado di eseguire query al di fuori della procedura/funzioni memorizzate /ecc che esistono.

E come vuoi verificarlo? Le query a volte hanno valori costanti che sarebbero altrettanto facilmente aggiunti alla query. Ad esempio, ho un database che è preparato per essere multi -linguale, ma non tutto il codice lo è, quindi la mia query assomiglia a questo:

SELECT NAME FROM SOMETABLE WHERE ID = :ID AND LANGUAGEID = 1

L'ID è un parametro, ma l'ID lingua non lo è. Questa query dovrebbe essere bloccata?

Chiedi di bloccare le query che non utilizzano i parametri denominati. Che può essere facilmente applicato. Basta bloccare qualsiasi query che non specifica alcun parametro. Puoi farlo nel livello dell'applicazione. Ma sarà difficile bloccare le query come quella sopra, in cui un valore è un parametro e l'altro non lo è. Dovrai analizzare quella query per rilevarla, e sarà anche difficile.

Non credo che SQL Server abbia funzionalità integrate per farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top