Domanda

Non riesco a capire il motivo per cui Java codifica sicuro è importante. Ad esempio, perché è importante per dichiarare le variabili private? Voglio dire, ho capito che farà l'impossibilità di accedere quelle variabili al di fuori della classe, ma ho potuto semplicemente decompilare la classe per ottenere il valore. Analogamente, definendo una classe come finale rende impossibile alla sottoclasse questa classe. Quando sarebbe sottoclasse una classe essere pericoloso per la sicurezza? Anche in questo caso, se necessario, potrei decompilare la classe originale e reimplementare con qualsiasi cosa codice maligno che può desiderare. Il problema viene quando le applicazioni sono "di fiducia" da parte dell'utente? E la gente potrebbe poi abusare di questa fiducia in qualche modo? Fondamentalmente quello che sto cercando è un buon esempio del perché le linee guida di codifica sicure devono essere seguite.

È stato utile?

Soluzione

La programmazione è difficile.

Se si definisce API severe, che non esporre le variabili che non dovrebbero essere esposti (ci piace chiamare questo incapsulamento ), si aiutano gli utenti dei vostri API, e quindi rendere più facile la programmazione. Questo è considerato una buona cosa.

I motivi non sono in primo luogo la "sicurezza", come nel mantenere le cose segrete segreto, per quanto chiarezza, semplicità e comprensibilità.

Come bonus, è molto più facile per rendere le cose funzionano correttamente se si può sapere che l'utente delle API non cambia "tuoi" variabili dietro la schiena, naturalmente.

Altri suggerimenti

E ' "sicuro" che significa che un lavoro interno di classe sono nascosti a chi lo usa.

Il termine sicurezza non viene utilizzato come in "assicurare un server" viene usato per intendere il fatto che un utente di una classe non deve preoccuparsi di come la classe si esibirà il compito che lo vuole.

Prendendo il tuo esempio:

L'esposizione variabili di una classe avrebbe permesso l'utente della classe sapere della loro esistenza, che è qualcosa che non si vuole, ad esempio: basta premere un pulsante per accendere la luce, non è necessario per ora che all'interno v'è rame o whater è necessario per eseguire l'operazione.

Java è un orientata agli oggetti langauge programmazione , e uno dei concetti chiave in programmazione orientata agli oggetti è incapsulamento .

L'idea alla base incapsulamento è di "nascondere" i dettagli di implementazione come variabili interne che trattengono lo stato dell'oggetto e il funzionamento interno come gli algoritmi, e solo fornire un'interfaccia che altri oggetti possono utilizzare per eseguire funzioni con l'oggetto.

Utilizzando questo concetto, si vorrebbe nascondere stati interni utilizzando private variabili per impedire ad altri oggetti di influenzare direttamente gli stati interni. In Java, è comune vedere getter e setter (per esempio getColor e setColor) per lavorare con gli oggetti.

Inoltre, l'incapsulamento può aumentare la robustezza del codice pure.

Per esempio, limitando l'accesso agli stati interni, sarebbe possibile effettuare alcuni controlli di integrità prima che un oggetto viene modificato.

Come esempio solida, dire c'era un oggetto Score che doveva avere un valore compreso tra percent 0 e 100. Realizzando un procedimento setPercent(int) che convalida che il valore specificato è all'interno della gamma consentita, impedirebbe l'oggetto score.percent = 150 venga impostato in uno stato inaccettabile.

Quindi, cercando di manipolare direttamente lo stato interno scrivendo una dichiarazione come setPercent potrebbero essere evitati, se il metodo Exception causa un errore o genera un <=> se il valore specificato è inaccettabile.

Ci sono due problemi qui.

Le prime variabili quando si dichiara come protected o private, che non entreranno a far parte della vostra API pubblica. Altre classi possono dipendono dalla classe nel futuro, ed è importante che si è liberi di cambiare il più possibile se si desidera includere nuove funzionalità, migliorare le prestazioni, ecc Se tutti i valori sono pubblici di tutto il vostro interno valori e meccanismi sono pubblici. cambiarle potrebbe rompersi altre classi che dipendono vostro.

La seconda, è che quando si espone le variabili permette altre classi di cambiare i tuoi valori. Se cambiano i valori interni se può rompere il vostro programma e creare strano comportamento imprevisto. Se si crea un sistema che si basa sulle prestazioni accurata di uno vostre classi, ei valori interni sono cambiati, che non è più possibile fare affidamento su quel sistema. Subclassing rende più complicato. Il sistema può contare su una classe di un certo tipo per eseguire le azioni previste. Con sottoclasse è possibile creare una nuova classe che sembra essere dello stesso tipo, ma non esegue le azioni previste.

Ad esempio, se si dispone di una piazza di classe con un getArea funzione protetta (), ci si aspetta di tornare l'area di un quadrato. Tuttavia, una nuova classe può essere fatta estendentesi quadrato, rettangolo dire classe estende quadrato. Ora rectange possono ignorare getArea (), ma è ancora di tipo quadrato, che può rompere qualcosa che dipende tale funzionalità della piazza. Rendendo il vostro finale di classe che si sta affermando che questo non potrà mai accadere nel vostro sistema.

Questo tipo di "sicuro codifica" non impedire a qualcuno di vedere il vostro codice sorgente, ma aiuta a rendere il codice più affidabile e utilizzabile in futuro.

Giusto per aggiungere a ciò che altri hanno già detto: Alcune di queste caratteristiche possono anche semplicemente essere visto come un modo per affermare l'intenzione. Se faccio un membro private faccio "impossibile" per gli altri di accedervi (è possibile, ma questo è oltre il punto qui), ma ancora più importante dico gli utenti che questo è un dettaglio di implementazione, che non dovrebbero fare affidamento su.

Provate a immaginare se il vostro oggetto ha proprietà interna, che non è privata (nascosto) e il tuo codice di accesso a questa proprietà capita di essere eseguito in ambiente multithreading, quindi N discussioni avrebbero cominciato ad accedervi simultaneamente, 5 filetti vorrebbero cambiare questa proprietà , 4 da leggere. Non v'è alcun modo di assicurarsi che le cose funzioneranno perfettamente, né filo saprà quali dati si tiene in questo momento e lo ha fatto ha cambiato con successo la proprietà di tale oggetto.

Si dovrà programmare speciale pezzo di codice che sarà responsabile di gestire l'accesso sincrono e ancora che non sarà guarrantee il codice funzionerà a destra da quando si devono ancora verificare resto del 680 classi nel vostro programma di accesso che la proprietà di non accedervi direttamente.

In breve, ci si trova in un problema enorme, e il debug è un incubo dal momento che non si sa quando i dati sono stati chagned, quale thread ha fatto, da dove si gionro ecc

Un solo scenario di ciò che sta accadendo se non è incorporato ...

Buona cosa, il codice corre più veloce 1%, c'è meno carico sulla pila, hai raggiunto probabilmente i guadagni trascurabili delle prestazioni che si pagherà con gli arresti periodici di sistema e le probabilità minori per il debug successo.

Il termine "sicuro di codifica" si riferisce alla costruzione di software che tenta chiaramente di evitare vulnerabilità di sicurezza, sia in C, Java, Ruby, il linguaggio assembly, o qualsiasi altra cosa. Forse la parte più centrale di che, dopo la selezione di un sistema linguistico sicuro, è quello di mantenere le buone pratiche di programmazione. Se un programma non è chiaro, allora hai poche possibilità di esso che è degno di alcuna fiducia.

Per Java ci sono due guide importanti:

In Java ci sono due modalità distinte di codifica sicura.

In un avete a che fare con il codice che non può avere tutti i privilegi che il codice fa. Per esempio, se si sta scrivendo una libreria o di firmare il codice è necessario fare questo. Dovrebbe essere impossibile per codici maligni per sfruttare le autorizzazioni in modo non intenzionale. Questo è difficile!

Più comunemente avete a che fare con i programmi che si occupano di dati solo non attendibili. Per esempio, i server Web (si pensi XSS e SQL Injection) e programmi di applicazioni desktop che fare con i file non attendibili (di solito il problema è con il codice C con buffer overflow - genuino C ++ è meglio). In alcune situazioni denial of service (DoS) può essere un problema grave.

V'è una certa sovrapposizione. Per esempio interpreti eseguiti con le autorizzazioni del codice di interprete e possono essere molto "potente".

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