Mysql_real_escape_string, spriječavanje duple akcije

Naslov teme skoro sve kaže…i odmah da spriječim ponude za preparing mysql statements…ne pitam to :smile:

Znači, ako se kojim slučajem desi da se dva puta pozove mysql_real_escape_string na isti string, dobit ćemo dupli escape navodnika.

E sad mene zanima, što sve odrađuje mysql_real_escape_string(), …radi escape navodnika i dali još što?

Što fali kad bi recimo umjesto te metode koristili vlastiti regExp koji će paziti da ne udari dva puta po istom mjestu?

Konkretno ovako nešto:

function mres($string)
	{
	$string=preg_replace("/([^\\\\])'/", "$1\'", $string);
	$string=preg_replace('/([^\\\\])"/', '$1\"', $string);
	return $string;
	}

po benchu čak ne zaostaje za mysql_real_escape_string(), …samo mi nije baš najjasnije dali se još što dešava unutar mysql_real_escape_string() ??

Jesi pokušao pogledati u službeni manual prije nego pitaš?

http://php.net/manual/en/function.mysql-real-escape-string.php

mysql_real_escape_string() calls MySQL’s library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, , ', " and \x1a.

Obratiti pažnju:

Warning This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0.

U pravu si…
iako sam googlao how to prevent double escape…itd, nisam se sjetio da bi manual rekao što se dešava unutar funkcije xd.
S druge strane, ovako u temi možda saznam elegantnije konstruiran regExp i svašta nešto bi moglo izroditi…nikad neznaš u kojem smjeru će rasprava krenuti. (Iako zapravo znaš, netko će te napasti iz nekog razloga xd)

Nisi našao rezultata jer takvo što nitko na svijetu neće pitati što ti pitaš. Iz dva razloga:

  1. velika većina će koristiti PDO i neće morati razmišljati niti sekunde o tome
  2. napisao si u prvom postu “ako se kojim slučajem desi da se dva puta pozove mysql_real_escape_string” -> kako misliš “ako se kojim slučajem”? Valjda razumiješ kod koji pišeš.

Zapravo su pitali :slight_smile: …ne se lako razbacivati s tim rječima “niko na svijetu” …

Nije sve u razumjevanju coda,

  1. a što recimo ako postoji vjerovatnost da ti iz nekog api-a stignu escapani stringovi
  2. što ako popravljaš kaos za nekim, i želiš ovakve stvari eliminirati na prvu najjednostavniju ruku
  3. općenito, treba uvijek balansirati omjer uloženog dobivenog. U nekim rijetkim slučajevima se stvari bitno pojednostavljuju ako svjesno dopustiš da se escape desi na dva mjesta.
  4. preeliminacija problema. Zlatno pravilo: uvjek postoji još jedan bug. Onaj tko misli da ga njegov code nema, laže ili sebe ili druge…ili još nije ni radio.
    Jedno vrijeme je dnevnih.hr osvanuo sa tako višestruko escapanim stringovima na komentarima…samo se umnožavalo :slight_smile:

Moze primjer?

Prvo bi’ posumnj’o na neku pretumbaciju sa cache servisom.

  1. Znaš čitati dokumentaciju API-ja? Ako nema dokumentacije, ili pak formati koje vraća jako često variraju a nikako to nije naglašeno u samom responseu, zašto bi uopće koristio tako loš API?
  2. Ne razumijem?
  3. Ne razumijem?
  4. Ne razumijem?

Odi na StackOverflow ili neku veću zajednicu od ove, pa postavi isto pitanje.

Imamo ulaz u određeni segment programa i na samom ulazu escapamo sve user inpute, kako bi se dalje mogle variable neometano koristiti.

E sad, tamo postoje metoda1,metoda2, metoda3 itd.

Metoda1 - pohranjuje userov input u bazu.
Metoda2 -pohranjuje također podatke u bazu, ali ponekad ti podaci stižu od usera, a …ponekada joj podatke dostavljaju metoda3 ili metoda 4 ili metoda N …koje ih čitaju negdje iz baze.

Znači, metoda2 mora raditi opet escape za podatke koji joj stižu od metoda3, 4 …N.

Opcije su:
-escapat podatke na izlazu kod metode3, 4 , N …ali onda moramo escejpat podatke na N mjesta.
-escepat podatke na ulazu metode2, …samo ako je poziv došao iz metode 3, 4, N …to uvodi dodatni parametar i nepotrebno podiže kompleksnost tamo di ne treba kad…
-možemo escepat podatke na ulazu u metodi2 sa escaperom koji pazi da neće napraviti dupli posao, kako podaci od user inputa nebi bili dva puta escepani.

-i opcija je koristiti preparing mysql statements, kojeg sam eliminirao u pitanju.

Pa pitaju ljudi, ne kužim što si htio time reći. Ja volim čuti kako domaći ljudi razmišljaju :slight_smile:

Arhitektura iz pakla.

(Mada je tesko bez konkretnog koda uvidjeti na sta to lici,) prebaciti posao metode 2 na metodu 1.

Plus, vec pominjani OOP pristup i/ili neki od FW-a.

To sve znači da imaš veliki design problem.