Newsgroup: it.comp.www.php
Titolo: Problemi di sicurezza in un sito

Ciao a tutti.
Vorrei realizzare una homepage molto semplice in php senza appoggiarmi ad
alcun CMS, e vorrei però che il sito fosse ragionevolmente sicuro.
Se il mio sito per assurdo contiene solo il file INDEX.PHP che contiene
solo il seguente codice:
<?php
echo "Hello Wordl";
?>
Il mio sito dal punto di vista della sicurezza è assolutamente
inattaccabile, giusto?
Mi sono già letto la guida della sicurezza su 
html.it
http://php.html.it/guide/leggi/121/guida-sicurezza-di-php/
Attenendosi a questi consigli posso ritenermi ragionevolmente al sicuro
dagli scherzetti dei crackers (non i biscotti)?
Secondo problema.
La struttura che ho in mente si basa sugli Include di diversi file php.
Che tecnica si usa per evitare che un singolo file php possa essere
richiamato singolarmente?
Esempio: il mio file INDEX.PHP è fatto così:
<?php
include('inizio.php');
include('fine.php');
?>
Come posso fare per evitare che qualcuno mandi in esecuzione direttamente
inizio.php o fine.php digitando
http://www.miosito.it/inizio.php
Mille grazie a che avrà la disponibilità di rispondermi e un saluto a
tutti quanti.
Andrea
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
-- 
www.iuz-lab.info

 leggendo 
Non ho capito....
E se valorizzo una variabile in INDEX.PHP e all'inizio di ogni file da
includere controllo il valore di quella variabile e se non c'č esco?
Andrebbe bene?
Ciao e grazie ancora


 
è un modo per farlo (con register_globals ad off)
altri modi potrebbero essere:
- verificare che $_SERVER['PHP_SELF'] sia diverso dal file incluso (questo è quello
   che ti ha suggerito iuz, almeno credo :D )
- definire una costante prima di includere il file e verificare che sia
   definita nel file incluso
- ... inserire il proprio modo qui ...

   definita nel file incluso
- Evitare di eseguire sul server i file con estensione INC e nominare i
file da includere in .inc (o .quellochevuoi).
-- 
Amministratore
www.amiciamici.com
Giornalismo dal basso sull'amicizia e sul turismo
"Pronto Chi Bussa" il primo podcast di Parma e provincia?

 - verificare che $_SERVER['PHP_SELF'] sia diverso dal file incluso 
Perfetto era proprio quello che mi serviva.
Sei stato più che gentile, ti ringrazio tanto.
Ciao


 richiamato singolarmente?
Non puoi evitare che venga richiamato, se il file è nella webroot e i 
permessi di accesso ci sono il file viene eseguito, però all'interno del 
file tu puoi fare dei controlli per evitare elaborazioni non desiderate.
Esempio banale, in index.php assegni un valore ad una variabile e nei 
file inclusi controlli se la variabile ha quel valore.
$check = "Ciao";
if( $check == "Ciao" ) {
   /* esegui quello che vuoi */
   ;
}
else 
   echo "Cicca";

 file inclusi controlli se la variabile ha quel valore.
Ho utilizzato il PHP_SELF e dovrei aver risolto.
Grazie per la gentile risposta  :-)


 
mmmmhh.. hai provato? sicuro del risultato?
-- 
www.iuz-lab.info

iuz ha scritto:

Se il mio server non elabora ciò che è scritto in un file .inc
richiamandolo direttamente non succede nulla.
Mentre se lo includo in un file php funziona.
Poi io utilizzo sempre un controllo, ad inizio file incluso, su PHP_SELF.


 Grazie per la gentile risposta  :-)
Se ti puņ essere d'aiuto io utilizzo questo codice:
if (eregi("NOMEFILEDAINCLUDERE.php",$_SERVER['PHP_SELF'])) {
    Header("Location: index.php");
    die();
}
Se NOMEFILEDAINCLUDERE.php viene richiamato direttamente si viene
reindirizzati a index.php


 reindirizzati a index.php
Beh, questo codice è più elegante di come l'avevo fatto io.
Grazie davvero :-))


 
suggerirei di usare preg_* invece di ereg..
-- 
www.iuz-lab.info

 Poi io utilizzo sempre un controllo, ad inizio file incluso, su PHP_SELF.
E' questo il motivo per il quale dici che non succede nulla.
--
rob4you

 suggerirei di usare preg_* invece di ereg..
e io aggiungerei di confrontare $_SERVER['PHP_SELF'] con __FILE__ 
(modificando opportunamente gli slash, o i backslash, di uno dei due).
In questo modo non ci si deve preoccupare di modificare ogni volta il 
NOMEDELFILEDAINCLUDERE.inc.php.
--
rob4you

 (modificando opportunamente gli slash, o i backslash, di uno dei due).
o usando basename :p

rob4you ha scritto:

Ho fatto una prova ed effettivamente succede che il server non elabora
nulla di quello scritto nel file .inc e restituisce a video esattamente
quello che vi è scritto.
Quindi si vede il codice in chiaro...e potrebbe essere un problema forte
di sicurezza se si includesse il file di configurazione di accesso al DB
(ad esempio).


 quello che vi è scritto.
Infatti da quello che hai scritto questo ci si aspettava.
Se un file con codice php lo rinomini .html che non è interpretato 
ovviamente vedi il codice quando richiami il contenuto.

 quello che vi è scritto.
Supponendo di aver installato su webserver soltanto php,il 
comportamento da te descritto accadrebbe ovviamente con qualsiasi altro 
file che non abbia estensione .php, a meno di aggiungere l'estensione 
voluta (esempio .inc) nella direttiva di apache alla voce addtype. Ma a 
sto punto, per questioni di portabilità, tanto vale rinominare tutti i 
file con estensione .inc, in .inc.php.
--
rob4you

 quello che vi č scritto.
Si puň sempre dire ad Apache di deny-are l'accesso ai file .inc, ma
perché complicarsi la vita? :-) io preferisco il controllo via php.
piuttosto, non permetterei affatto la creazione di file .inc sul server.
Ciao :o)
Maverick
-- 
«Che non siete piů liberi di non avere una casa con letto per dormire.
 Lavorate voi - schiavi dei soldi - che non sentite la puzza della
 schiavitů!» (a Mario di Monte Mario, Roma) # 
http://libre.netsons.org/

 file con estensione .inc, in .inc.php.
Non ho voglia di cercare il post giusto a cui fare reply, ma proseguendo
sulla strada del file includibile ma non leggibile, l'unica e` impostare
da Apache una regexp tipo /.*\.inc$/ che restituisca Deny al client.
In questo modo puoi includere file .inc da PHP, e vietarne la
visualizzazione diretta. Che siano file di configurazione con password
dentro o semplici pezzi di pagina come un header o un footer condiviso,
non puoi accederci.
Bye.

 o usando basename :p
Sempre puntuale e preciso! :-)
Per Andrea, relativamente a quanto dicevo io:
if(__FILE__==strtr($_SERVER['SCRIPT_FILENAME'],"/","\\")) {
  header('Location: 
http://www.tuosito.it/index.php'
);
  die();
}
Da notare l'uso di SCRIPT_FILENAME (e non di PHP_SELF): in questo modo 
tu confronti non soltanto il nome dei file, ma anche il loro percorso 
assoluto.
--
rob4you