[Tutorial PHP]Verificarea site-ului pentru detectarea fisier

#1
Nume Tutorial:Verificarea site-ului pentru detectarea fisierelor modificate
Descriere:Verificarea site-ului pentru detectarea fisierelor modificate
Download:Nu necesita
Autor:Anonim
Sursa (Link-ul oficial):
tutorialeonline
Propria parere:Util.
Tutorialul:
Recent discutam pe forum-urile de specialitate despre atacurile de pe servere şi viruşii care intră în paginile site-urilor scrise cu cod de proastă calitate.
Soluţia în aceste cazuri e rescrierea site-ului cu un cod de calitate şi atenţie mare la securitatea site-ului. Problema apare însă dacă nu ştii că paginile site-ului au fost modificate de către un virus sau un exploit şi tu crezi că totul e în regulă când de fapt nu e. Ei, în urma discuţiilor mi-a venit ideea să scriu un cod care să indexeze toate fişierele unui site şi să genereze chei hash pentru fiecare fişier în parte. Pentru cine nu ştie, o cheie de tip hash sha e o cheie unică alocată unui fişier sau unui text, iar orice modificare adusă acelui fişier sau acelui text face ca acea cheie să nu mai corespundă. Astfel, având cheile hash sha pentru fiecare fişier de pe site, pot verifica uşor prin comparare dacă unul din ele a fost modificat.
Mai jos am scris un cod care scanează toate fişierele şi directoarele din locaţia specificată şi generează o listă cu fişierele găsite şi cheia pentru ele pe care o salvează într-o bază de date. Am folosit ca bază de date MySQL deşi se poate utiliza cu orice alt tip de bază de date cu mici modificări, chiar şi csv sau xml.
Atenţie! Acest script se adresează celor cu care au cunoştinţe medii sau avansate despre programarea php, altfel e posibil să nu înţelegeţi mare lucru din studierea codului.
Pentru început setăm funcţiile necesare. Astfel avem nevoie de o funcţie recursivă care să citească directoarele şi fişierele de pe server, am denumit funcţia read_dir()
Apoi mai avem o funcţie care setează informaţiile despre fiecare fişier în parte cum ar fi calea, numele, cheia hash sha, dimensiunea fişierului şi data ultimei modificări, am denumit funcţia set_hash(). Deoarece pot exista o mulţime de directoare şi subdirectoare pe un site funcţia read_dir() va returna o mulţime de array în array şi am zis să simplific puţin şi să am totul într-un singur array ordonat frumos astfel că am creat încă o funcţie pentru acest lucru numită ordonare_lista()
Deoarece lucrez cu array-uri multiple, mă folosesc pentru ordonarea listei de o funcţie internă php şi anume array_walk_recursive() dar această funcţie nu este disponibilă decât începând de la versiunea 5.x de php. Pentru a putea face scriptul să fie funcţional şi pe versiuni mai vechi, am creat o funcţie cu acelaşi nume, pe care trebuie să o folosiţi pe serverele cu php 4.x
Pentru lucrul cu baza de date, avem 2 funcţii principale, una pentru salvarea informaţiilor despre fiecare fişier şi una pentru citirea datelor salvate în baza de date, pentru a putea face comparaţia cu cele existente. Aceste funcţii le-am plasat într-o semiclasă (am vrut să păstrez compatibilitatea cu versiunile mai vechi de php).
Funcţiile se numesc save_hash() respectiv read_hash()
Pentru generarea tabelului în baza de date puteţi folosi următorul cod în phpmyadmin:

Cod: Selectaţi tot

CREATE TABLE file_hash (
   hash VARCHAR(255) NULL,
   name VARCHAR(50) NULL,
   path VARCHAR(255) NULL,
   size INTEGER UNSIGNED NULL,
   mtime INTEGER UNSIGNED NULL,
   UNIQUE INDEX campuri_unice(name, path)
)
TYPE=InnoDB;
Nu am creat un index numeric deoarece nu avem nevoie, în schimb cele două câmpuri name şi path sunt setate ca fiind index de tip unic, pentru a nu permite salvarea unui fişier de 2 ori în baza de date (dacă aveţi acelaşi nume de fişier în 2 directoare diferite de pe server, fiind calea diferită către fiecare, se va considera că sunt fişiere diferite deci informaţiile despre fişiere vor fi salvate chiar dacă au acelaşi nume, nu vor avea aceeaşi cale).
Dar ajunge cu teoria, vă invit să descărcaţi scriptul de aici iar dacă aveţi nelămuriri vă aştept pe forum pentru discuţii. Singura rugămite este să păstraţi intacte informaţiile despre autor, indiferent dacă modificaţi codul sau îl folosiţi aşa cum este, din respect pentru ore de muncă depuse pentru scrierea codului şi conceperea algoritmului.
Înainte de a rula scriptul, asiguraţi-vă că:
- aţi creat o bază de date cu tabela specificată mai sus
- aţi configurat fişierul config.php corespunzător (în special partea de conectare la mysql)
- aţi dezarhivat fişierele în radăcina root de pe serverul web (dacă le puneţi în altă parte nu se vor indexa decât subdirectoarele din locul unde aţi rulat scriptul)

Dacă aţi respectat toate cerinţele de mai sus, scriptul ar trebui să funcţioneze fără probleme.
Alte probleme care ar putea apărea ar fi următoarele:
- nu se poate crea tabelul în baza de date -> soluţia e să îl creaţi manual din phpmyadmin, specificând cele 2 câmpuri name şi path cu chei index unic
- apar erori la indexare -> cel mai probabil aveţi pe server fişiere pe care scriptul nu le poate citi. Soluţia ar fi ori să schimbaţi CHMOD-ul la acele fişiere ca să poată fi citite de către script, ori să le adăugaţi în funcţia read_dir() ca fişiere ignorate la indexare.
- apar erori la indexare şi în baza de date nu se salvează nici o cheie hash sha1 -> verificaţi dacă pe server este activă funcţia php sha1_file() fără ea nu se pot genera chei. O soluţie alternativă ar fi să folosiţi funcţia md5() înlocuind în script funcţia.
N-am cerut la nimeni niciodata,
Chiar de-a fost sa rabd, in viata mea.
Am dat totul fara nici o plata,
Nevoind nimic sa mi se dea.

@Virgil Carianopol
Vezi-ti de treaba si retine:
"E treaba ta sa spui ce vrei si sa nu conteze pentru nimeni".

@Kazi Ploae

Înapoi la “Tutoriale PHP”

Cine este conectat

Utilizatori răsfoind acest forum: Niciun utilizator înregistrat și 1 vizitator

cron