Tento blog s vypnutým magic_quotes_gpc

Školení, která pořádám

Tento blog jsem začal psát v době, kdy byla konfigurační direktiva magic_quotes_gpc na většině hostingů zapnutá a řada programátorů o její existenci ani nevěděla. Proto jsem ukázky kódu psal s jejím zohledněním.

Doba nicméně pokročila a direktiva se v PHP 5.3 stane zastaralou a v PHP 6 bude odstraněna zcela. Sice existuje způsob, jak ji emulovat, ale už se dá označit za přežitou. Protože pokročila i znalost programátorů, rozhodl jsem se všechny ukázky kódu předělat tak, aby předpokládaly vypnutí této direktivy.

Je možné, že mi někde něco uniklo, takže pokud byste v článku na tomto serveru narazili na kód, který s vypnutým magic_quotes_gpc správně nefunguje, tak mi prosím dejte vědět např. přes diskusi u tohoto článku.

Jakub Vrána, Ze zákulisí, 15.5.2009, diskuse: 16 (nové: 0)

Diskuse

Martin:

Tak i Vrána nakonec prozřel. Ale trvalo to, co? :)

ikona v6ak:

Pokud jde o Jakubovy názory, tak podle některých komentářů již mnohem dříve si nemyslel, že magic_quotes_gpc je dobré, ale nechtěl přepisovat celý blog ani mít to půl na půl.

Ginnex:

No, dělat bych se s tím nechtěl :)

Tomas:

A v cem spociva zmena? V pridani addslashes? To je vtip?

ikona Jakub Vrána OpenID:

Změna spočívá v odstranění stripslashes() a přidání addslashes(). Vtip to není, protože příklady používají MySQL databázi, ve které poskytuje addslashes() plnohodnotnou ochranu (s běžně používanými kódováními jako cp1250, latin2 nebo utf8).

Tomas:

Ale kde je napsano, ze tady je UTF8? Jakube, je cas si priznat, ze pro vetsinu tech 15letych script kiddies, kteri sem chodi, jsi autorita. A jako autorita je ucis naprosto nevhodny postup. Addslashes nejsou vhodnou ochranou a oni by to meli vedet. Nestaci, ze "to vetsinou staci".

ikona Jakub Vrána OpenID:

Neexistuje kódování používané s češtinou nebo angličtinou, které by způsobilo jakýkoliv problém. Problém by byl třeba s kódováním Shift-JIS, které asi čtenáři tohoto blogu používat nebudou. Pro klid duše jsem tuto informaci ale doplnil do patičky.

Navíc co je podle tebe ten bezpečný způsob? Jistě si myslíš, že mysql_real_escape_string(), ten ale pracuje s kódováním nastaveným přes mysql_set_charset(), které je k dispozici až od PHP 5.2.3 a MySQL 5.0.7, takže ve starších verzích kódování taky nerespektuje. Kódování nastavené přes SET CHARACTER SET nebo SET NAMES, což používá většina lidí, tato funkce nezohledňuje. Takže bych to stejně musel vysvětlit a to už raději omezím sadu podporovaných kódování (což je ve starších verzích stejně potřeba).

ikona Miloslav Ponkrác:

Přidávám se k tomu, že addslashes a podobné prasečiny není nic, co by se do MySQL dalo doporučovat. Možná to teď funguje. Ale klidně si zamořte kód, ale proboha neučte to!

Pro MySQL je třeba používat funkce určené na MySQL. Nebo si v krajním případě napsat speciální funkci, která bude určená jen pro MySQL, jako jsem si třeba já napsal v Pythonu, kde žádná escape funkce není.

I v PHP manuálu jasně píší, protože se našlo plno „chytráků“, kteří takhle prasí:

It's highly recommeneded to use DBMS specific escape function (e.g. mysqli_real_escape_string() for MySQL or pg_escape_string() for PostgreSQL), but if the DBMS you're using does't have an escape function and the DBMS uses \ to escape special chars, you can use this function.

ikona david@grudl.com:

Stačí zavolat SET sql_mode='NO_BACKSLASH_ESCAPES' a rozdíl v bezpečnosti mezi addslashes() a mysql_real_escape_string() je fatální i pro český jazyk ;)

ikona Jakub Vrána OpenID:

Konečně pádný argument. Skripty jsem předělal tak, aby místo addslashes() používaly mysql_real_escape_string() a do patičky jsem přidal informaci o mysql_set_charset().

I ostatním diskutujícím děkuji za péči.

ikona v6ak:

Jaký má teď smysl zmínka o magic_quotes_sybase? Jen historický?
Jinak mysql_real_escape_string bez parametru spojení použije poslední použité? Bylo by to logické, ale nikde jsem o tom nic nenašel...

ikona Jakub Vrána OpenID:

Díky za upozornění, napadlo mě to v noci nezávisle na tobě :-) a magic_quotes_sybase jsem odstranil. Funkce mysql_real_escape_string() bez druhého parametru použije poslední otevřené připojení, jak je uvedeno na http://php.net/mysql_real_escape_string.

Tomáš:

Ahoj programátoři,
jak se praví na úvodní stránce: "Weblog o elegantním programování v PHP pro mírně pokročilé". To podle mě znamená, že mírně pokročilý programátor bude brát zde uvedené kusy kódu jako příklad a ne jako hotovou věc. Pozná, co se má ošetřit a jakým způsobem. Pokud by se měl kód v příkladech maximálně optimalizovat, byla by hlavní myšlenka zatemněna zbytečnými kusy kódu. Proto mi tedy přijde zbytečné vše ošetřovat, stačí to napsat do patičky stránky informaci, že jsou kusy kódu brány jako příklad a případné "rejpalské" komentáře o tom, že je kód děravý mazat.

Tomas:

Nadpis je sice pekny, ale realita je naprosto jina. Muzeme si tu myslet, ze Jakub pise blog pro mirne pokrocile, ale budeme jen zit ve vlastni bubline, odtrzeni od toho, co je pravdou. Jakub hlavne uci 15lete deti a uci je spatne techniky. Smirte se s tim.

Dnesni PHP skriptovani uz moc neni o vymysleni prevratnych myslenek. Je hlavne o vyuzivani uz stokrat vymysleneho. Proto vetsina lidi, co jsem videl, bere priklady pomoci copy & paste. A tak to dopada. Bezpecnost kodu je proste podle mne vzdy prioritou.

Tomáš:

To je podle mě dost špatný přístup. Myslím, že většina čtenářů blogu pana Vrány má rozum, než aby používali kód, kterému nerozumí, ale hlavně že funguje. Když skoro všechno je zde jako příklad, tak se s tím musí počítat. Ale uvidíme, jak to dopadne.

gdx:

z casti mas pravdu, ak sa jedna o uzivatelov typu copy && paste, ale treba vyzdvihnut kvalitu blogu a ta je na profesionalnej urovni a splna normu "Weblog o elegantním programování v PHP pro mírně pokročilé"

uvital by som anketu s otazkami priamo na navstevnikov ci robia copy && paste alebo nie, ja rozhodne medzi nich nepatrim - preto som na Jakubovej strane

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.