PHP MySQL backtick -> shell_exec [megoldva]

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

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.

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.

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.

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.

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.

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'])
);

$ 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

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

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

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` . "'"

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\`"));