Interzicere accesare directa fisiere din director

Probleme, intrebari si subiecte legate de Server Apache, setari in fisier htaccess si Gazduire site-uri Web (Hosting).
Stefan
Mesaje: 90

Interzicere accesare directa fisiere din director

Salut, cum as putea interzice accesarea directa a fisierelor din anumite foldere? Am incercat mai multe modalitati, si toate functioneaza doar partial. In sensul ca in unele fisiere este introdus fisierul de conectare la baza de date (care se afla in alt folder) si am observat ca fisierul nu se mai "executa".

Exemplul meu:
fisier baza de date: core/database/connect.php

Am un fisier profil.php in care folosesc jquery pentru validarea datelor si apelez fisierul parola.php (pentru a verifica daca parola este aceeasi cu cea actuala). Acest fisier se afla in ''actiuni/setari/" si am inclus fisierul bazei de date.

In folderul actiuni este un fisier .htaccess care contine acest cod

Cod: Selectaţi tot

order allow,deny 
Deny from all
Fara .htaccess, profil.php functioneaza perfect, doar ca fisierle din folderul actiuni pot fi accesate direct. Daca .htaccess contine acel cod, fisierele sunt protejate, dar profil.php nu mai functioneaza, mai exact, nu stiu sigur daca mai acceseaza "actiuni/setari/parola.php" fiindca nu mai verifica daca parola este aceeasi. Dar restul scriptului jquery folosit in fisierul profil.php (sa verifice daca input ul este gol, numarul de caractere, etc) functioneaza.

Profil.php : pastebin.com/86qQdN0f
setari.php: pastebin.com/xe8qJLfm

MarPlo
Salut
Cu urmatorul cod in .htaccess poti bloca accesul la toate fisierele din director, cu exceptia celor specifcate (la <FilesMatch>) care vor putea fi accesate.

Cod: Selectaţi tot

Deny From All
<FilesMatch "profil\.php$">
Allow From All
</FilesMatch>
<FilesMatch "parola\.php$">
Allow From All
</FilesMatch>

Stefan
Pai eu vreau ca toate fisierele din folderul "actiuni" sa nu se poata accesa direct. Numai ca daca fac asta fisierele din acel folder nu mai se executa..

MarPlo
Fisierele care sunt blocate prin .htaccess nu mai pot fi accesate din browser, deci nici din codul javascript /ajax care se executa in browser.
Solutia e sa lasi accesul la fisierele php care sunt accesate din browser /javascript (cu ajax), si sa folosesti un sistem de tocken cu sesiune care sa securizeze executia codului php; astfel nu e nici o problema daca acele fisiere php vor fi accesate direct.

De exemplu, in cazul tau, in fisierul "profil.php" in care e si codul ajax poti crea si folosi tocken-ul asa:

Cod: Selectaţi tot

<?php
if(!isset($_SESSION)) session_start();

//define a tocken available 600 seconds
$tocken = time();
if(!isset($_SESSION['tocken']) || $_SESSION['tocken']<($tocken-600)) $_SESSION['tocken'] = $tocken;
?>
//the rest of your php/html code

Adds the php tocken into a hidden field in the form that is used in ajax
<form id="setari" action="" method="POST">
<input type="hidden" id="tocken" name="tocken" value="<?php echo $_SESSION['tocken']; ?>"/>
...
</form>

<script>
//get and pass the tocken in your data in jquery/ajax
//...
url: 'actiuni/setari/parola.php,
type: 'post',
data: { id: $('#id').val(), tocken: $('#tocken').val() }
//...
</script>

Iar in fisierele la care accesul e permis, si sunt accesate cu ajax, de exemplu in "parola.php", verifici si executi codul doar daca tocken-ul e transmis si e valid.

Cod: Selectaţi tot

<?php
if(!isset($_SESSION)) session_start();

//check the tocken available 600 seconds
if(isset($_SESSION['tocken']) && isset($_POST['tocken']) && $_SESSION['tocken']==$_POST['tocken'] && $_SESSION['tocken']>=(time()-600)){
  //add the php code you want to execute
}
else echo 'Not valid request';

Stefan
Iti multumesc mult, acum totul functioneaza bine!

Subiecte similare