PHP Centeri avaleht Skriptikogu Küsimuste-vastuste leht Teadete vaatamine ja saatmine Foorum - koht küsimiseks Otsingumootor Siit saad infot meie kohta

Kasutajanimi:  
  Parool: 
  Registreeri!   Unustasid salasõna?

 Skriptid (427) 

 Bannerisüsteemid
 E-kaardid
 E-maili saatmine
 E-poed
 Failihaldus
 Flash ja PHP
 Foorumid
 Jututoad
 Kalendrid
 Kalkulaatorid
 Kellad
 Klikilugejad
 Kommentaarid
 Külalisteraamatud
 Küsitlused
 Lehe turvamine
 Lingikogud
 Mängud
 Otsingusüsteemid
 Pildid ja PHP
 Shoutboxid
 Sisuhaldussüsteemid
 Statistika
 Suunamine
 Templeidisüsteemid
 Testid
 Uudised
 Uudistelistid
 Varia


 Otsing 

 

 Utiliidid 

 Kes on kus
 Kasutajate info
 Küsitlused
 PHP manuaal
 Õpetused
 Jututuba
 Lingikogu
 Lemmikskriptid


 Self-extracting PHP-kood
Autor: laurik
Pühapäev, 21. september 2003 16:58
Self-extracting PHP-kood

PHP skriptid koosnevad reeglina lihttekstist. Kuid koodi sisse on võimalik pikkida ka pilte jt binaarandmeid.

BINAARANDMED PHP KOODIS.

Binaarandmete lisamiseks PHP-skripti tuleb need andmed teisendada kujule, kus 256 ASCII sümboli asemel oleks kasutatud ainult nähtavaid märke st numbreid ja tähti. Sellise teisenduse teeb funktsioon base64_encode(). Vastupidise muundamise - kodeeritud andmed tagasi allikmaterjaliks - sooritab base64_decode().

Kodeerimine võib toimuda selliselt:

PHP kood:


$file2encode 'c:/img/php.gif';

echo
'<textarea cols=80 rows=10>' .
chunk_splitbase64_encodeimplode''file$file2encode ) ) ) ) .
'</textarea>';



Tulemusena saadud märgipuru on ca kolmandiku võrra mahukam esialgsest failipikkusest:

Koodijupp:

R0lGODlheAAeALMAAAQCBPz+/PwCBACCFXAI+F/BkUR2GAAAHuywsAMCVACkAgCBAAEU5wCUFgBP
sACCVCH5BAAAAAAALAAAAAB4AB4AAwT/MMhJq7046827/2AojmRpnmiqckDrumssr289d3WuW3bV
T7ogjCK8sYRB3ks5BCJ3xCRHQK1mqlTNExptOr2BbS6FLVfK5ovU12K22eB1l4y2Supp+G+uB7j9
XXtffUtXeIeIhG9wf42BhYyPkBaIlYeSi3yPjl+CEnFyZ5ajWJiAkZt9iqean6EUpLECpmqZYlyv
YZm6XJSyo7RMpludk4PDhr+Jw0XFt6fPoL2+ynV/YsxIzsTIGtVotdHZzbzPq6wY33bX3KnuruLd
G+oZufXG5ej24WMd1VrTNngStI/dLm+yBAYECCbfqg/k/JE60s/DQGMFz4UARtETw4MEQhdiiOih
kkWRI/GFrNjR4xQ8EFHyQ+cwGI6MyUrFZNmSEzyXM/F9yHOSp8KGK4EaETUrBM53P/XJXEq1qtWr
WGVEAAA7



Andmete väljastamiseks tuleb saadud märgijada omistada mingile muutujale ning siis peale base64_decode() kasutamist ekraanile kuvada. Enne väljatrükki võiks header() funktsiooniga saata ka failitüübi, kuid praktika on näidanud, et enamik brausereid teevad levinumad failitüübid ise kindlaks.

Kodeeritud andmete väljastamiseks tuleks kasutada taolist moodust:

PHP kood:


// väljastab vastava identifikaatoriga pildi
function ShowImg($id) {
$images array(
"R0lGODlhUAAPALMAAP///++iCYmOeal0BGZmZv4rBOopBtAkBVpDC7QeBH4kFZ8cBokYBWMRBS4T
DQwICSH5BAQUAP8ALAAAAABQAA8AAAT/kMhJq704680n+GAojmRpnmgqAc+zFMfjHMbiOIrTBnwf
AIKgcEgsGo9II2DVYhgOjUZhwUg0FICbY+D7Jb/gcHFJYD0YhYIhkbg9bQ5Gw4Hg8oDivH7MfKTT
bQ8NBwyECWlQN1x4QSCNjR9CjgKTeJOUkV9kLFJqCTRPBnIGf2k1N4yUQ5aPqpKPrK6xSJsOC6QJ
L38JBjcHpWkND6mVkIyVmZaZsporaGkLnWlyLYKkpqir2qrH20Cs3a60Kw5/DA+HiNUsDryIDcTe
rcix9cvjZQ+/BQwODdf8BLXI4q8QvD0I92yyBsMJm10HEjnIkmVYwothFrpA9AuHgY/RGhQ8ySED
QSqMKIlsSsGypcuXJDrInEmzpoUIADs="
);

// siia võiks lisada "ei leitud faili" pildi...
if (!isset($images[$id])) {
return 
NULL;
}

//header('Content-type: image/gif');
print base64_decode($images[$id]);
die();
}

// juhul kui img on numbrilise väärtusega käivitub pildikuvamisfunktsioon
if (is_numeric($_GET['img']))
{
ShowImg($_GET['img']);
}

// väljastatakse 5 pilti
for ($i=0;$i<5;$i++)
print 
'<img src="'.$_SERVER['PHP_SELF'].'?img=0">';



$images massiivi saab lisada täiendavaid pilte. Kui kasutatakse erinevaid failitüüpe, siis tuleks teha mitmemõõtmeline massiiv, kus iga faili juures on peale failisisu ka antud faili MIME tüüp (*NIX süsteemides on paljud MIME tüübid toodud failis /etc/mime.types, vt ka Apache kataloogis "conf/" faili mime.types).

Ülaltoodud viisil toimub ka teiste failide (nt ZIP või PDF) manustamine.

Ja ka PHP-koodi ennast on võimalik binaarandmeteks teisendada (seda moodust ma kuskil mujal varem kohanud ei ole) :

Esiteks skriptijupp, mis moodustab PHP-koodist binaarsodi:

PHP kood:


// heredoc tekstis tuleb dollarimärgid varjestada
// muidu asendatakse need vastavate muutuja väärtustega
$data = <<<php_source
for (\$i=0;\$i<10;\$i++)
{
print "<li>hello world ";
}
php_source;

$encodedGzData chunk_split(base64_encode(gzdeflate($data9)));
print 
'<textarea cols=80 rows=10>'.$encodedGzData.'</textarea>';



Nagu koodijupist näha, tihendati andmed enne mime-kodeeringut gzip-meetodil kokku! (kui serveril puudub gzip-tugi siis tuleks toodud skriptilõikudest kaotada gzdeflate() ja gzinflate() korraldused).

Väljastamine käib nii:

PHP kood:


$data "S8svUtBQybQ1sFbJtDEEkdraCpq8XNW8XJwFRZl5JQpKNjmZdhmpOTn5CuX5RTkpCkrWvFy1AA==";
eval(
gzinflate(base64_decode($data)));



Kui poleks eelnevat koodilõiku siis oleks ilmselt üsna keeruline mõistada, mida see täpselt teeb

Kus selliseid lahendusi kasutada? Ilmselt väiksemates rakendustes, kus esmatähtis on skripti kompaktsus. Ülaltoodud viisil PHP-koodi "krüptimisel" sügavam mõte puudub, kuna selle sisu on väga lihtsalt tuvastatav.

--
Lauri Kasvandik, mail



Avaleht   -    Skriptikogu   -    Teated   -    Foorum   -    Reklaam   -    Tagasiside   -    Kasutamise reeglid

© Copyright 2002-2019 PHP Center. Kõik õigused reserveeritud.