Egy PHP app -ban az SQL parancsok automatikusan generalodnak, a fuggveny ami ezeket generalja mindenkepp beszurja a "`" ( backtick ) karaktert a megfelelo helyekre - ezen nem is szeretnek valtoztatni, annak ellenere, hogy csak nehany esetben van tenylegesen ra szukseg. Ezzel az a gond, hogy a string ami a ket "`" kozott van, a PHP shell_exec -el probalja futtani. Ket megoldast ismerek erre a gondra, de egyik sem jo: kiszedni a backtick karaktert ( gond lesz olyankor amikor az oszlop neve pl. "order" ), a masik pedig letiltani a shell_exec -et ( ez ket okbol sem felel meg: egyreszt szukseg van ra, masfelol pedig a PHP mindenkepp parancskent ertelmezi, meg ha nem is futtatja le ).
Atnyalaztam a fel internetet ( lehet, hogy a rossz felet :) ), de nem talatam konkret megoldast erre a problemara ( talan a safe_mode, de az mar az 5.3 -as PHP -ben is deprecated volt, az 5.4 -ben ki is szedtek ).
Otlet? Koszonom!
----------------
En neztem el a dolgokat, nem tunt fel, hogy egy adott helyen idezojel helyett backtick -et hasznaltam. Amennyiben a backtick idezojelek kozott van ( " vagy ' ), akkor nem shell parancskent lesz ertelmezve.
Pelda:
$files = "`dir`"; echo $files; // `dir`
$files = '`dir`'; echo $files; // `dir`
$files = `dir`; echo $files; // kiadja a listát
(c) BehringerZoltan
- 5136 megtekintés
Hozzászólások
Van valami okod a shell exec-re? Mert én tuti nem úgy csinálnám, ha ott a php akkor a query-t is lefuttathatná simán.
- A hozzászóláshoz be kell jelentkezni
Mint mondtam, ha letiltom, akkor sem segit sokat, mert teleszemeteli a logot ( PHP Warning: shell_exec() has been disabled for security reasons in ... ), tehat nem ezen van a lenyeg.
A query lefut, nincs ezzel gond, a problema ott kezdodik, hogy ha xdebug -al performance benchmark -ot keszitek, akkor kiderul, hogy a program futasi idejenek 30-40% -at a query string feldolgozasaval! tolti.
- A hozzászóláshoz be kell jelentkezni
Most már végképp nem értelek.
- A hozzászóláshoz be kell jelentkezni
Szerintem a topicban levo kerdest nem ertetted.
Szoval: ha neked van ilyesmid: $query_string = "SELECT FROM `clients` WHERE `name` LIKE '%pityuka%'"; akkor a PHP azt ami a "`" kozott van ( = clients ) ugy ertelmezi, hogy az egy shell parancs es meghivja a shell_exec -et. Ha engedelyezve van lefut mint shell parancs, ha pedig nincs, akkor dob egy warning -ot, hogy a shell_exec le van tiltva. Tehat a "Van valami okod a shell exec-re?" kerdesednek semmi ertelme. Vagy nem olvastad el figyelmesen amit a topicban irtam, vagy nem fejeztem ki magam tul jol.
- A hozzászóláshoz be kell jelentkezni
" helyett ' nem segít?
- A hozzászóláshoz be kell jelentkezni
Nem, pont fordítva! Dupla " -ben nem értelmezi a backtick-et.
- A hozzászóláshoz be kell jelentkezni
Hm. Rég volt. :)
- A hozzászóláshoz be kell jelentkezni
A változókat viszont értelmezi, azzal keverted szvsz. echo "Szép estét $name"; kiírja a nevet. Míg: echo 'Szép estét '.$name; forma működik csak.
- A hozzászóláshoz be kell jelentkezni
Nagyjából... csak nem PHP, hanem bash... szóval a shellből emlékeztem ilyesmire, csak az nem maradt meg, hogy a PHP csak a változókat hajlandó behelyettesíteni.
- A hozzászóláshoz be kell jelentkezni
Pontosítanom kell, most kipróbáltam, egyszeres idézőjelben sem értelmezi a backtick-et.
$files = "`dir`"; echo $files; // `dir`
$files = '`dir`'; echo $files; // `dir`
$files = `dir`; echo $files; // kiadja a listát
- A hozzászóláshoz be kell jelentkezni
Igen, itt volt a kutya elasva.
Nem tul hosszu a query generalo fuggveny ( 1000+ sor korul ), de annyi a ",',` benne, hogy nem tunt fel, hogy egy adott helyen " vagy ' helyett ` hasznaltam. Kicsit felhuztam magam, es ahelyett hogy a te peldad kiprobalasaval kezdtem volna, egybol nekiugortam a Google -nek.
- A hozzászóláshoz be kell jelentkezni
Valóban a kérdést nem értettem :)
Ugyanis előfordult már a praxisomban linux shell-ből indított php script mysql abuzálással, és mysql-ben rendszeresen használok backtick-et, de ilyen helyzettel még nem találkoztam.
De úgy látom már megoldódott a dolog, most már a problémát is értem.
- A hozzászóláshoz be kell jelentkezni
Valamit rosszul csinálsz mert pl. ilyen kódrészlet minden gond nélkül működik.
$this->DBase->put
(
"UPDATE `persons` SET `status`=? WHERE `id`=?","si",
array($param['status'],$param['id'])
);
- A hozzászóláshoz be kell jelentkezni
$ cat index.php
<?php
var_dump(mysql_query('select `id`'));
var_dump(mysql_query("select `id`"));
kimenete:
$ php index.php
bool(false)
bool(false)
hol a baj?
t
- A hozzászóláshoz be kell jelentkezni
Szerintem itt a baj:
select `id`
- A hozzászóláshoz be kell jelentkezni
en ertem a kerdest, de mint lathatod, a fenti kodban ez nem okoz gondot. (php 5.5.x, production beallitasok)
ellenben:
$ cat index.php
<?php
var_dump(mysql_query('select `id`'));
var_dump(mysql_query("select `id`"));
echo `id`;
kimenete:
$ php index.php
bool(false)
bool(false)
uid=1000(tibyke) gid=1000(tibyke) groups=1000(tibyke),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),125(sambashare)
t
t
- A hozzászóláshoz be kell jelentkezni
Én úgy látom nem érted.
Szerinted ennek... select `id` ...mi lesz az eredménye?
- A hozzászóláshoz be kell jelentkezni
nyilvan semmi, de akkor itt van rendes tartalommal:
kod:
$ cat index.php
<?php
$c = mysql_connect('localhost', 'root') or die(mysql_error());
print_r(mysql_fetch_assoc(mysql_query('select `id` from test.hupper limit 1', $c))) or die(mysql_error($c));
print_r(mysql_fetch_assoc(mysql_query("select `id` from test.hupper limit 1", $c))) or die(mysql_error($c));
kimenet:
$ php index.php
Array
(
[id] => 5
)
Array
(
[id] => 5
)
t
- A hozzászóláshoz be kell jelentkezni
Most mi a kérdés?
Kicsit fentebb példákkal magyarárzták hogyan működik: http://hup.hu/node/132599#comment-1735082
Bővebben:
Ez 'select `id`' egy mysql kifejezés ami szintaxis hibára fog futni mert nincs megadva melyik táblából vegye az `id` értékeket.
Ennek megfelelően a mysql_query visszatérési értéke FALSE lesz.
Amit Te szeretnél az valami ilyesmi:
"select '" . `id` . "'"
- A hozzászóláshoz be kell jelentkezni
Az alábbi két hívás bármely beállíttással warningmentesen működik, és nem futtat külső parancsot:
<?php
var_dump(mysql_query('SELECT `id`'));
var_dump(mysql_query("SELECT \`id\`"));
- A hozzászóláshoz be kell jelentkezni