Biztonságos programozás perl

Hogyan kerülhető el a tompított felhasználói változók egy shell hívásakor exec () és a system ()?

A Perl, futtathat egy külső program különböző módokon. Akkor meg a kimenetet külső programok használatával fordított aposztróffal:

Meg tudja nyitni „alagút” (cső) a program:

open (SORT "| / usr / bin / rendez | / usr / bin / uniq");

Meg lehet futtatni egy külső program, és várja a végén a teljesítményt system ():

rendszer „/ usr / bin / sort

vagy elindíthatja a külső programok nélkül visszatérnek vezérlés exec ():

exec „/ usr / bin / sort

Mindezek a kifejezések veszélyesek, ha használja az adatokat a felhasználó által megadott, amely tartalmazhat metakaraktereket. A system () és exec () van egy szintaktikai funkció, amely lehetővé teszi, hogy futtatni egy külső program közvetlenül, anélkül, hogy az operációs rendszer shell. Ha paraméterátadás a külső program, ami nem a húr, lista, Perl nem shell meta-karaktereket, és nem okoz nemkívánatos mellékhatásokat. Például:

Akkor használja ezt a funkciót, hogy nyissa ki az alagúton, anélkül, hogy a héj. Calling nyitott egy mágikus szimbólumok sorozatát | -, ha fut egy példánya Perl és nyisson meg egy alagút (cső) a másolatot. Leányvállalat másolatát Perl akkor azonnal elindul a külső programok használatával argumentumlistában az exec ().

open (SORT "| -") || exec "/ usr / bin / rendezés", $ uservariable;

míg $ line (@lines)

Print Rendezés $ sor, "\ n";

Olvasni az alagút-szerű módszert lehet használni anélkül, hogy a héj, a sorrendben - |:

open (grep, "- |") || exec "/ usr / bin / grep" $ userpattern, $ filename;

print "mérkőzés: $ _";

Ezek a formák open (), amely mindig használni azokban az esetekben, amikor egy másik helyzetben használná átirányított nyitott (vezetékes nyitva).

Még több trükkös funkció lehetővé teszi, hogy végre a külső programok és becsapják őket, hogy a saját nevét. Ez hasznos programok, amelyek tevékenysége függ név segítségével futnak.

rendszer $ nastoyaschee_imya "lozhnoe_imya", "arg1", "item2"

rendszer $ shell "-sh", "- NORC"

Ez a példa elindítja a sh - shell az operációs rendszer - a „SH” nevet, arra kényszerítve őt, hogy járjon interaktívan. Zamette, hogy ez a program nevét kell tárolni egy változó, és a változó nevét, és a lista elején nincs értelme érveket.

Mi lehet írni ezt a parancsot tömörebb:

Mi az a „teszt átvihetőséget” (mellékíz ellenőrzése) Perl? Hogyan lehet engedélyezni őket?

Mint láttuk, az egyik leggyakoribb probléma, ha a biztonsági programozás CGI - átadása a shell OS felhasználói változók ellenőrzés nélkül. Perl biztosít egy mechanizmust, hogy ellenőrizze a „fertőzőképesség”, amely nem teszi lehetővé, hogy erre. Bármely változó, amely proinitsiirovana kívül eső adatokat a program (beleértve az adatokat a környezet, a standard input és a parancssor) tekinthető a „ragályos”, és többé nem lehet használni a programon kívül. A fertőzés terjedését. Ha használja a szennyezett változó értéket rendelni a másik változó, a második változó is okozott. A fertőzött változók nem előhívásához használt eval (), system (), exec () vagy vezetékes open (). Ha megpróbálja ezt, Perl leáll, és figyelmeztetést jelenít meg. Perl is megtagadják a munkát, ha megpróbálja hívni egy külső program, amely nem kifejezetten az értéket a PATH.

A 4-es verzió Perl nyelv magában foglalja annak ellenőrzését egy speciális változata a tolmács az úgynevezett „taintperl”:

Az 5-ös verzió - használja a -T zászló, amikor a tolmács indításakor

Az alábbiakban ismertetjük a „szennyezett” (untaint) változókat.

OK, már tartalmazza ellenőrzését fertőzőképesség, ahogy javasolta. Most a script végződik az üzenettel: „A bizonytalan $ ENV sorban XX” minden kezdet!

Még ha nem bízik a PATH környezeti változó, amikor fut a külső programok, fennáll a lehetősége, ami egy külső program. Ezért minden esetben tartalmaznia kell egy ilyen sort elején a szkript, ha használja mellékíz ellenőrzések:

Szerkesztése úgy, hogy felsorolni a könyvtárat, ahol keresni szeretne. Vklyuyaenii ötlet az aktuális könyvtár ( „”) A PATH változó egy rossz ötlet.

Mivel a „szerek (untaint) változó?

Leveszem metakaraktereket a változó, de Perl még mindig azt hiszi, hogy ő fertőzött!

Lásd a fenti választ. Az egyetlen módja annak, hogy fertőtlenítse a változó - használja a wildcard keresést.

Nem biztonságos keresési művelet $ ize =

Gyakran a probléma egy Perl CGI script, hogy a felhasználó számára, hogy egy listát a kulcsszavakat, és használja őket egy keresési művelet, hogy megtalálják a maszkot a megfelelő fájlnevek (vagy valami - valami ilyesmi). Ez önmagában nem veszélyes. Veszélyes optimalizálás, ami néhány Perl program használja, hogy gyorsítsák fel a keresést. Ha egy változót a keresési művelet, a kifejezés össze, valahányszor a művelet. Annak elkerülése érdekében, újrafordítás, elfoglal az időt, akkor egy különleges zászlót - o, ami vezet az a tény, hogy a kifejezés kell összeállítani csak egyszer:

Most azonban, Perl figyelmen kívül hagy minden változás a változó, ami vezet helytelen működése ilyen ciklus:

foreach $ user_pattern (@user_patterns)

nyomtatni, ha m / $ user_pattern / o;

Kerülő ezt a problémát, a programozók, az írás Perl, gyakran használják ezt a trükköt:

foreach $ user_pattern (@user_patterns)

nyomtatni, ha m / \ Q $ user_pattern \ E / o;

Saját CGI script többre van szüksége, a kiváltságokat, mint ez egyre nobody felhasználó. Hogyan tudom megváltoztatni a felhasználói azonosítót?

Tudod, hogy egy script fut a jogosultságokat a tulajdonos beállításával a biteket s:

Adhat neki a jogot, hogy a csoport, amelyhez tartozik a tulajdonos, amelyben az s bit a csoport területén:

Azonban sok Unix rendszerek tartalmaznak egy kiskapu, amely lehetővé teszi, hogy az ilyen hacker szkripteket. Ez csak a scriptek, hanem összeállított programokat. Az ilyen rendszerekben a kísérletet futtathatja a Perl, melyek voltak kiállítva s bit, azt eredményezi, egy hibaüzenet a részét Perl.

Ezekről a rendszerekről, akkor két lehetősége van:

Azt is rögzíti a kernel, hogy megakadályozzák a telepítés ezen bit a script fájlokat. Perl mindazonáltal helyesen azonosítani ezeket a biteket, és állítsa be a felhasználói azonosítót. További információ a található a Perl gyik:

Tudod, hogy a forgatókönyvet a shell, napmsannuyu C. Általában ez így néz ki:

Összeállítása után a program, vystavte s bit. A programot végrehajtani, hogy a tulajdonos a jogok futtatni a Perl értelmező és végrehajtja a script fájlban szereplő „foo.pl”.

Ezen felül, akkor lehet futtatni a szerver maga a felhasználó elegendő jogosultsággal végezze el a szükséges intézkedéseket. Ha használja a CERN szerver, akkor azt a lehetőséget, hogy fut a szerver különböző jogokat a különböző szkriptek. Lásd. A CERN dokumentáció további információkat.

Kapcsolódó cikkek