Brisanje foldera – PHP

php-logoOvo je funkcija koja briše zadati folder, kao i sve njegove podfoldere i fajlove. Kad je pozivate potrebno je samo da navedete putanju do foldere kao i njegovo ime. Npr. Rmdir(putanja/folder).

 

 

[c]
function Rmdir($path) {

$origipath = $path;

$handler = opendir($path);

while (true) {

$item = readdir($handler);

if ($item == "." or $item == "..") {

continue;

} elseif (gettype($item) == "boolean") {

closedir($handler);

if (!@rmdir($path)) {

return false;

}

if ($path == $origipath) {

break;

}

$path = substr($path, 0, strrpos($path, "/"));

$handler = opendir($path);

} elseif (is_dir($path."/".$item)) {

closedir($handler);

$path = $path."/".$item;

$handler = opendir($path);

} else {

unlink($path."/".$item);

}

}

return true;

}
[/c]

Kreirajte Zip fajl uz pomoć PHP-a

Pravljenje .ZIP arhive uz pomoć PHPa je jednako prosto kao pravljenje zip arhive na desktopu. Ugrađena PHP-ova ZIP klasa omogućava nam ovu funkcionalnost! Ispod se nalazi kod jednostavne create_zip funkcije koju možete koristiti na vašim projektima.

[c]/* funkcija koja kreira zip fajl */
function create_zip($files = array(),$destination = ”,$overwrite = false) {
//ako zip fajl vec postoji i overwrite je false, vratio false
if(file_exists($destination) && !$overwrite) { return false; }
//promjenjive
$valid_files = array();
//ukoliko su proslijedjeni fajlovi…
if(is_array($files)) {
//prodji kroz listu fajlova
foreach($files as $file) {
//uvjeravamo se da fajl postoji
if(file_exists($file)) {
$valid_files[] = $file;
}
}
}
//ako su fajlovi ok…
if(count($valid_files)) {
//kreiramo arhivu
$zip = new ZipArchive();
if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
return false;
}
//dodajemo fajlove
foreach($valid_files as $file) {
$zip->addFile($file,$file);
}
//debug
//echo ‘zip arhiva sadrzi ‘,$zip->numFiles,’ fajlova sa statusom ‘,$zip->status;

//zatvaramo zip fajl – kraj!
$zip->close();

//provjeravamo da li je fajl upisan
return file_exists($destination);
}
else
{
return false;
}
}
[/c]

Upotreba

[c]$fajlovi_za_zipovanje = array(
‘images/1.jpg’,
‘images/2.jpg’,
‘images/5.jpg’,
‘nekifolder/ringo.gif’,
‘wordowfajl.doc’,
‘josjedan.doc’
);
//Ako je rezultat funkcije true sve je proslo ok, a ako je false kreiranje zip fajla nije uspjelo
$rezultat = create_zip($files_to_zip,’neka-arhiva.zip’);[/c]

PHP Security Tools

Najefikasniji način da osigurate Vašu PHP aplikaciju je pažljivo kodiranje i stalni nadzor aplikacije, međutim postoji par alata koji vam taj posao mogu znatno olakšati i brže vam ukazati na moguće ranjive tačke vašeg koda. Evo nekih alata koji vam mogu biti od koristi:

– PhpSecInfo

PHP Security Post Image

Ovaj skript radi pod PHP okruženjem, i što je najbolje od svega, nudi sugestije za ispravljanje nađenih propusta. Dostupan je pod “New BSD” licencom, i uvijek traže nove PHP developere za pomoć na razvijanju ovog odličnog alata.

PHP Security Post Image

Download PhpSecInfo.

– PHP Security Scanner

Ovaj alat će skenirati Vaš PHP kod tražeći sigurnosne propuste, a može skenirati i čitav direktorijum.  PHP Security Scanner posjeduje koristan korisnički interfejs (UI) koji omogućava bolji pregled problema, podržava i “wild card search” za bolje filtriranje i pronačaženje fajlova ili direktorijuma koje treba provjeriti.

Download PHP Security Scanner

– Spike PHP Security Audit Tool

Spike PHP Security Audit Tool je open source rješenje za analizu PHP koda. On će naći sigurnosne propuste u vašoj aplikaciji, tako da ih možete ispraviti tokom razvoja iste.

PHP Security Post Image

Download Spike PHP Security Audit Tool

Instalacija Apache, PHP, MySQL na vašem računaru

Odmah da kažem koga mrzi instalirati sve posebno i traži brzo rješenje najbolje je da ne čita dalje nego da preuzme neka od “Sve u jednom” rješenja koja će vam instalirati php, mysql i apache na računar. Neka od tih “rješenja” su WampServer ili XAMPP

Za ostale  potrebni su nam sledeći fajlovi :

apache 2.2.11

http://apache.deathculture.net/httpd/binaries/win32/apache_2.2.11-win32-x86-no_ssl.msi

PHP 5.2.10

http://yu2.php.net/distributions/php-5.2.10-Win32.zip

MySql 5.1.36

http://gd.tuwien.ac.at/db/mysql/Downloads/MySQL-5.1/mysql-5.1.36-win32.msi

Ovo je primjer mog računara :

default lokacija apache servera je

“c:\program files\apache group\apache2\” i u daljem tekst ću je nazivati “\apache\” . Isto tako važi i za php i mysql kome su default lokacije “c:\php” koju nazivam sa \php\, “c:\mysql\” koju nazivam sa \mysql\, isto tako ja sam koristio da mi je apache www folder (gde stoji sajt ) u “c:\www\“.

1.APACHE

Sama instalacija je trivijalna i ne treba je posebno objašnjavati, ostavite sve defaultne opcije prilikom instalacije. Poslije instalacije trebalo bi da se u tray icon bar -u (kod sata) pojavi apache SERVICE MONITOR sa kojim će se lako kontrolisati tj start-ćovati i stop -irati tada će apache biti instaliran kao service i svaki put kad restartujemo kompjuter i on će se pokrenuti.

Apache monitor
Apache monitor

2.PHP

Sadržaj arhive php-5.2.10-Win32.zip otpakovati u “C:\php\“. Unutra se nalazi fajl koji se zove php.ini-dist koga  treba prekopirati u “C:\windows\” folder i preimenovati ga u php.ini. Otvoriti php.ini sa omiljenim editorom, naći stavke: doc_root =, extension_dir = i extension=php_gd2.dll te ih prepraviti  da izgledaju ovako:

doc_root = “c:/www/”

extension_dir = “C:/php/extensions”

– treba skinuti znak  ;  ispred extension=php_gd2.dll

1.APACHE

zatim se vratiti na APACHE SERVER i otvoriti http.conf u c:\program files\apache group\apache2\conf\ folderu (ili Start->Program files->Apache HTTP Server… ->Configure Apache Server->Edit the Apache httpd.conf Configuration File)  i dodati mu sledeće linije na kraju :

ScriptAlias /php/ “C:/php/”
Action application/x-httpd-php “/php/php.exe”
AddType application/x-httpd-php .php

odmah prepraviti i :
DocumentRoot “C:/www”

i odmah ispod liniju :

zatim :
UserDir “My Documents/www”

i veoma važnu liniju DirectoryIndex , da izgleda ovako :

DirectoryIndex index.html index.html.var index.php index.phtml index.php3

posle ovoga apache je spreman treba napraviti folder u c:\ koji se zove www i treba restartovati apache iz SERVICE MONITORA ili restartovati računar.

TEST

napraviti fajl sa imenom index.php i u njega staviti

[c] <?php phpinfo(); ?>
[/c]

zatim pokrenuti firefox, operu ili šta već koristite i zahtjevati stranicu http://localhost

Ako je dosad sve prošlo u redu vidjećete rezultat funkcije phpinfo(), odnosno detaljan izvještaj o trenutnoj konfiguraciji php-a.

Rezultat funkcije phpinfo(); u browseru
Rezultat funkcije phpinfo(); u browseru

3. MYSQL

nema puno pametovanja oko mysql-a, next, next next, sve default opcije i odabrati root password na kraju. Ne bi bilo loše da skinuti phpMyAdmin i sa njime mijenjati mysql tabele.

Funkcija za provjeru email adrese

web-form_protectedEvo jedne veoma korisne funkcije kada radite sa email adresama koje unose Vaši korisnici pa stoga nikad nijesmo sigurni na sta ćemo naići u email polju. Inače sve ama bas SVE sto se unosi preko web formi pogotovo u janom dijelu sajta morate provjeriti. Javascript skripte za provjeru su korisne (sa stanovišta – user friendly interfejsa) ali ni izbliza dovoljne jer se lako zaobilaze od strane zlonamjernih korisnika. Sve bitne, ma uostalom sve podatke morate provjeriti i na serverskoj strani.

Funkcija ispod provjerava validnost email adrese i od ostalih koje “kruže” okolo razlikuje se po korišćenju DNS lookups za MX i A zapise (ovo mislim da radi samo na Linux/Unix serverima pa ako je vaš hosting na windows serverima ili ovaj skript testirate lokalno na vašoj windows mašini zakomentirajte ove linije koda) i po tome što neke skripre koje koriste sledeće regularne izraze:

“^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)
↪*(\.[a-z]{2,3})$”
Ovaj regularni izraz dozvoljava samo donju liniju (_) srednju liniju (-) mala slova i brojeve a ne dozvoljava sasvim regularne znakove kao sto su kosa crta(/), znak jednakosti (=), uzvičnik (!) i procenat (%). Ovaj izraz takođe zahtjeva da domen najvišeg nivoa (.com, .me, .net) ima dva ili tri slova izostavljajući email adrese koje završavaju sa .info, .travel itd.

“^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$”
Ovaj regularni izraz ima iste greske kao i prethodni kada su u pitanju specijalni karakteri. Dozvoljava top level domene sa vise od dva ili tri slova ali zato neke kao sto su example..com smatra ispravnim a oni to nijesu.

Fajl validEmail.php

[code language=”php”]
<?php
/**
Validate an email address.
Provide email address (raw input)
Returns true if the email address has the email
address format and the domain exists.
*/
function validEmail($email)
{
$isValid = true;
$atIndex = strrpos($email, &quot;@&quot;);
if (is_bool($atIndex) &amp;&amp; !$atIndex)
{
$isValid = false;
}
else
{
$domain = substr($email, $atIndex+1);
$local = substr($email, 0, $atIndex);
$localLen = strlen($local);
$domainLen = strlen($domain);
if ($localLen < 1 || $localLen > 64)
{
// local part length exceeded
$isValid = false;
}
else if ($domainLen < 1 || $domainLen > 255)
{
// domain part length exceeded
$isValid = false;
}
else if ($local[0] == ‘.’ || $local[$localLen-1] == ‘.’)
{
// local part starts or ends with ‘.’
$isValid = false;
}
else if (preg_match(‘/\\.\\./’, $local))
{
// local part has two consecutive dots
$isValid = false;
}
else if (!preg_match(‘/^[A-Za-z0-9\\-\\.]+$/’, $domain))
{
// character not valid in domain part
$isValid = false;
}
else if (preg_match(‘/\\.\\./’, $domain))
{
// domain part has two consecutive dots
$isValid = false;
}
else if
(!preg_match(‘/^(\\\\.|[A-Za-z0-9!#%&amp;`_=\\/$\’*+?^{}|~.-])+$/’,
str_replace(&quot;\\\\&quot;,&quot;&quot;,$local)))
{
// character not valid in local part unless
// local part is quoted
if (!preg_match(‘/^&quot;(\\\\&quot;|[^&quot;])+&quot;$/’,
str_replace(&quot;\\\\&quot;,&quot;&quot;,$local)))
{
$isValid = false;
}
}
if ($isValid &amp;&amp; !(checkdnsrr($domain,&quot;MX&quot;) ||
↪checkdnsrr($domain,&quot;A&quot;)))
{
// domain not found in DNS
$isValid = false;
}
}
return $isValid;
}
?>
[/code]

Primjena

[code language=”php”]

<?php
require(‘validEmail.php’);

if(validEmail($email)) {

// adresa je u redu i moze se koristiti

}

else {

//adresa nije u redu i shodno tome kod koji obavjestava korisnika ili sta vec treba

}

[/code]

Osigurajte Vaše forme za unos

Sigurnost je jako važna tema danas na web-u. Osigurati bezbjednost neke stranice je izuzetno važno za bilo koju web aplikaciju. U stvari, neki web developeri potrose i do 70% svog vremena na osiguravanje svojih aplikacija. Jedna od najvažnijih stvari koje moramo osigurati su forme za unos tj. interakciju sa korisnikom. Ispod se nalazi php klasa koja služi za sprečavanje XSS (Cross-site scripting) i Cross-site request forgery napada na  forme za unos.

Zašto ovo sve radimo?

Evo jednog primjera.
Korisnik, prijavljen na Vašu web stranicu, posjeti neku drugu “neprijateljski raspoloženu” web lokaciju  tokom sesije. Ova stranica će biti u mogućnosti poslati POST podatke  do Vaše web lokacije – na primjer koristeći  AJAX.  Budući da je korisnik prijavljen na Vašim stranicama, s druge web lokacije će također biti u mogućnosti poslati POST zahtjev na  obrasce koji su dostupni tek nakon prijave na vašem sajtu a nijesu dodatno zaštićene.

Kod je podijeljen u dva fajla formkey.class.php i fajla u kojem se u stavri nalazi nasa forma koju želimo da zaštitimo. Kod je sam po sebi dobro iskomentarisan tako da mislim da nema potrebe za nekim detaljnijim objasnjenjima.

Preuzeto sa sajta http://net.tutsplus.com/

Kod klase formkey.class.php

[code language=”php”]
<?php
class formKey
{
//Ovdje drzimo generisani form key
private $formKey;

//Here we store the old form key (more info at step 4)
private $old_formKey;

//The constructor stores the form key (if one excists) in our class variable
function __construct()
{
//We need the previous key so we store it
if(isset($_SESSION[‘form_key’]))
{
$this->old_formKey = $_SESSION[‘form_key’];
}
}

//Function to generate the form key
private function generateKey()
{
//Get the IP-address of the user
$ip = $_SERVER[‘REMOTE_ADDR’];

//We use mt_rand() instead of rand() because it is better for generating random numbers.
//We use ‘true’ to get a longer string.
//See http://www.php.net/mt_rand for a precise description of the function and more examples.
$uniqid = uniqid(mt_rand(), true);

//Return the hash
return md5($ip . $uniqid);
}

//Function to output the form key
public function outputKey()
{
//Generate the key and store it inside the class
$this->formKey = $this->generateKey();
//Store the form key in the session
$_SESSION[‘form_key’] = $this->formKey;

//Output the form key
echo "<input type=’hidden’ name=’form_key’ id=’form_key’ value=’".$this->formKey."’ />";
}

//Function that validated the form key POST data
public function validate()
{
//We use the old formKey and not the new generated version
if($_POST[‘form_key’] == $this->old_formKey)
{
//The key is valid, return true.
return true;
}
else
{
//The key is invalid, return false.
return false;
}
}
}
?>
[/code]

I kod same stranice forme. Normalno prilagodite je svojim potrebama.

[code language=”php”]
<?php
//Start the session
session_start();
//Require the class
require(‘formkey.class.php’);
//Start the class
$formKey = new formKey();

$error = ‘No error’;

//Is request?
if($_SERVER[‘REQUEST_METHOD’] == ‘post’)
{
//Validate the form key
if(!isset($_POST[‘form_key’]) || !$formKey->validate())
{
//Form key is invalid, show an error
$error = ‘Form key error!’;
}
else
{
//Do the rest of your validation here
$error = ‘No form key error!’;
}
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>Securing forms with form keys</title>
</head>
<body>
<div><?php if($error) { echo($error); } ?>
<form action="" method="post">
<dl>
<?php $formKey->outputKey(); ?>

<dt><label for="username">Username:</label></dt>
<dd><input type="text" name="username" id="username" /></dd>
<dt><label for="username">Password:</label></dt>
<dd><input type="password" name="password" id="password" /></dd>
<dt></dt>
<dd><input type="submit" value="Submit" /></dd>
<dl>
</form>
</body>
</html>
[/code]