Internet Info, s.r.o. Lupa Root Měšec Podnikatel DigiZone Slunečnice Vitalianew Bomba Navrcholu Weblogy Jagg Woko Dobrý web Computer.cz SK: MojeLinky

Hlavní navigace

PHP pro experty: bezpečnost

Programujete v PHP bezpečně a efektivně? Nebo považujete PHP za nedokonalý jazyk, který je nebezpečný již z principu? Pokud se chcete přesvědčit o tom, že v PHP lze programovat čistě a bezpečně, čtěte dále.

Úvod

K napsání tohoto článku/seriálu mě vedl jeden hlavní důvod, zkušenost s různými programátory v PHP. Ačkoliv jsem kdysi (bohužel) mylně předpokládal, že programovat v PHP umí každý druhý, ani jsem netušil, jak jsem se mýlil. PHP je totiž jazyk, který vychází z Perlu, čímž si z něj odnáší jak výhody, tak i nevýhody. A tou největší nevýhodou PHP je to, že vám umožní dělat věci, které jsou nejenom problematické a neefektivní, ale taktéž velmi nebezpečné.

Právě díky těmto vlastnostem PHP odsuzuje mnoho profesionálních vývojářů, kteří si myslí, že v PHP nelze programovat čistě a bezproblémově. Pro všechny tyto vývojáře i jiné bych rád připravil sérii článků, jež se bude do podrobnosti zaobírat těmi nejzáludnějšími věcmi a funkcemi jazyka. Jež vám ukáže možnosti, jak věci řešit elegantně a správně bez zbytečných problémů.

Bezpečné používání include/require

Nebezpečné a neošetřené vkládání souborů do skriptů v PHP není doménou jen naprostých laiků, ale bohužel i pokročilejších programátorů. Zde ukážu názornou a velmi známou ukázku chybně napsaného šablonovacího systému v PHP:

include "header.php";
include $_GET['page'];
include "footer.php"; 

Předešlý příklad je relativně dobře známý a obsahuje až příliš mnoho zřejmých bezpečnostních problémů. Pokud například zadáme adresu skript.php?page=/etc/passwd, skript nám může vypsat soubor se jmény a hesly uživatelů (samozřejmě pouze pokud PHP neběží v tzv. safe mode a má příslušná oprávnění).

Uvedených chyb si všimnou většinou pokročilejší uživatelé PHP, ale profesionálové najdou chyb mnohem více. Například použití dvojitých uvozovek není nutné, a tím se zbytečně zvyšuje hardwarová náročnost aplikace. Místo dvojitých uvozovek bychom v případě, že vkládáme nijak neformátovaný text, měli zásadně používat uvozovky jednoduché. Dalším, tentokrát již bezpečnostním problémem je použití nesprávné funkce pro vkládání obsahu souboru. Podle mých zkušeností jen málo programátorů v PHP zná rozdíl mezi funkcemi require a include. Jak si sami můžete v dokumentaci k PHP přečíst, funkce require při neúspěchu vrací závažnou (fatal) chybu, jež ukončí běh skriptu, na rozdíl od funkce include jež hlásí pouze varování. Pokud je tedy soubor pro běh skriptu nezbytný, zásadně byste měli používat funkci require.

Ale přestaňme se točit okolo „horké kaše“ a podívejme se na zásadní změny ve skriptu, které bychom měli provést.

  1. Ošetřit vstup $_GET['page'] před vložením zákařného kódu
  2. Ošetřit vstup $_GET['page'] před vložením neexistující stránky
  3. Opravit drobné kódovací chyby

1. Ošetření vstupu před zadáním nepovolených znaků

Pro ošetření vstupu před nepovolenými znaky se velmi často používají regulární výrazy. Jejich výhoda tkví v naprosté univerzálnosti použití pro ošetření libovolného vstupu. Zde si ukážeme malý příklad správného ošetření vstupu:

$mypage=eregi_replace('[^0-9a-z\-\_]', '', $_GET['page']; 

tip: Pokud vám stačí vkládat jako parametr číslo, doporučuji místo složitých regulárních výrazů používat jednoduché přetypování jako $mypage = (int) $_GET['page']; , které zajistí, že proměnná $mypage bude vždy obsahovat pouze číslo

Jak vidíte, výše vstup ošetřuji tak, že jakékoliv nealfanumerické znaky odstraním. Abych ovšem mohl do skriptu vložit jiný soubor, je ještě třeba znát nejenom jeho jméno, ale i plnou cestu k němu. Používání relativních odkazů nedoporučuji.

$mypage=eregi_replace('[^0-9a-z\-\_]', '', $_GET['page']; $mypage=dirname(__FILE__) . DIRECTORY_SEPARATOR . 'pages' . DIRECTORY_SEPARATOR . $mypage . '.html';

Předešlý kód ukazuje správné ošetření získání jména souboru ke stránce ./pages/home.html. Pokud se například podíváte pozorněji, zjistíte, že místo lomítka používám konstantu DIRECTORY_SEPARATOR, která obstarává přechod mezi systémy unix a win32, kde se používají odlišná lomítka. Budete se pravděpodobně velice divit, ale mnoho programátorů právě na tomto místě zbytečně chybuje.

2. Výsledný skript

A zase vracíme k obvyklé chybě mnoha programátorů – při vkládání dat od uživatele nestačí jen ověřit to, jestli neobsahují nebezpečný kód, ale i to, zda jsou pravdivá. Za největší hloupost považuji spoléhání se na to, že vyžadovaná stránka existuje. Pokud tomu totiž tak není, skript jistě vrátí nějakou chybovou hlášku (popřípadě dojde k zastavení jeho vykonávání), což koliduje s tím, co by mělo nastat. Jestliže stránka neexistuje, měli byste přinejmenším odkázat na úvodní stránku, popřípadě zaslat uživateli hlášení 404: Not Found. Jednoduché ověření existence stránky a také konečný a funkční kód vidíte níže:

require 'header.php';
$mypage=eregi_replace('[^0-9a-z\-\_]', '', $_GET['page'];
$mypage=dirname(__FILE__) . DIRECTORY_SEPARATOR . 'pages' . DIRECTORY_SEPARATOR . $mypage . '.html';
if(file_exists($mypage)){
  require $mypage;
} else {
  // error_log("This file doesn't exist: $mypage\n", 3, FILE_ERROR);  // případné zaznamenání chyb
  require dirname(__FILE__) . DIRECTORY_SEPARATOR . 'pages' . DIRECTORY_SEPARATOR . 'index.html';
}
require 'footer.php'; 

3. Co si zapamatujte

  • vždy ověřujte všechny vstupy od uživatele
  • místo include raději používejte require, vyhnete se tak nepředvídatelným situacím, kdy se skript chová v případě neexistence souboru jinak, než bylo požadováno
  • neúspěšné pokusy o nalezení souboru zaznamenávejte do logu
  • pokud přijímáte od uživatele číslo, vždy jej přetypujte  (int) $cislo
  • místo lomítek používejte konstantu DIRECTORY_SEPARATOR
  • tam, kde nejsou potřeba dvojité uvozovky, používejte jednoduché

Přetypování

Jak už jsem se výše zmínil, nejsnadnějším způsobem při vstupu čísla je přetypování proměnné na typ int. Ovšem neupozornil jsem vás na potenciální problém, který může přetypování způsobit, podívejte se na skript níže:

$cislo = (int) $_GET['cislo'];
if($cislo == 'ahoj'){
echo 'ok';
} 

I když je to zdánlivě nelogické, skript vypíše text „ok“, protože řetězec ‚ahoj‘ se před porovnáním přetypuje také na číslo, tedy 0 == 0, a to platí. Dejte si tedy pozor na to, že v podmínkách se při porovnání řetězce a čísla (int) automaticky konvertuje řetězec a nikoli číslo.

Další informace naleznete na těchto stránkách – www.php.net/lan­guage.types

Vkládání SQL kódu

Při dotazech SQL bývá častým problémem fakt, že do dotazů jsou dávána data přímo od uživatelů. Ukážu vám následující jednoduchý příklad opravdu velmi špatně položeného SQL dotazu:

"SELECT $_GET['what'] FROM users WHERE nick = '$_GET['nick']';" 

Pokud zavoláme tento odkaz:

skript.php?what=name&id=nick 

dostaneme jako výstup jméno uživatele podle jeho přezdívky. Nastává tu ovšem otázka, co se stane, pokud skript zavoláme takto:

skript.php?what=password&id=nick
skript.php?what=name&id=nick`; DROP users; 

První příklad vám ve všech databázích vypíše heslo uživatele, druhý příklad vám umožní zahodit celou tabulku uživatelů. Pro ochranu vstupu dat od uživatelů byste měli minimálně vždy pevně formulovat data, která má databáze vrátit (umožnit uživatelům vybrat sloupec tabulky, která obsahuje hesla, například není příliš moudré) a všechny vstupy ošetřovat proti uvozovkám, středníkům apod. Prvnímu příkladu nelze nijak obecně předcházet, jedinou obranou je dobrá kontrola kódu a inteligence programátora, u druhého příkladu je možné dovolit vkládat do databáze pouze alfanumerické znaky, například takto:

function sql($thing) {  if (is_array($thing)) {   $escaped = array();   foreach ($thing as $key => $value) {     $escaped[$key] = $this->sql($value);   }   return $escaped;  }  return mysql_real_escape_string($thing); }

Předchozí příklad komplexně zpracuje pole se všemi předanými výrazy a umožní jej vložit přímo do SQL. Například můžete použít tento fígl: $dbdata = sql($_POST);

Další informace naleznete na těchto stránkách – www.php.net/mys­ql_escape_string

Kradení výsledků SQL

Tato technika není moc známá ani moc rozšířená, ale přesto by stálo za to o ní alespoň trochu pohovořit. Pokud používáte tento typ dotazů:

SELECT * FROM users 

Vystavujete se riziku, že uživateli může později z nějaké proměnné získat nejenom jména uživatelů, ale i jejich hesla. Proto byste neměli používat vícenásobné výběry, ale pouze přesné dotazy, například:

SELECT username FROM users 

Tímto kódem nejenom zvýšíte bezpečnost vašeho skriptu, ale i zvýšíte rychlost jeho provádění, protože z databáze vybíráte pouze ta data, jež jsou pro běh skriptu nezbytná.

Dobré zvyky při úpravách v SQL

Při testování mého PHP kódu se i dříve stávalo, že jsem omylem vymazal celou tabulku údajů. Není to ostatně ani příliš obtížné, stačí jen špatně definovat podmínku, a je smazáno vše, ostatně podívejte se na krásný příklad níže:

DELETE FROM users; 

Tento dotaz vám smaže všechny záznamy v tabulce users pouze díky tomu, že jste například vaší funkci zapomněli předat podmínku. Není to nic zvláštního, a ač se to teď nezdá, takovéto chyby v kódu nastávají. Proto vždy, pokud mažete jeden řádek, se limitujte na jeden řádek, například takto

DELETE FROM users LIMIT 1; 

Takto ani při špatně postaveném SQL dotazu nemůžete ztratit všechna data. Je více než na pováženou limitovat veškeré SQL dotazy nějakým omezením, a to i v případech, kdy provádíte například příkaz SELECT či UPDATE. Mnohdy byste totiž jinak mohli svou neopatrností způsobit zbytečně velké škody.

Zamaskování PHP

Velmi oblíbenou a také účinnou metodou je zamaskování jména skriptů i jeho proměnných v URL pomocí modulu serveru Apache – mod_rewrite. Změnu přípony souborů z .php  na .html provedeme přidáním těchto řádků do souboru httpd.conf.

LoadModule rewrite_module modules/mod_rewrite.so
Rewriteengine on
Rewriterule (.+).html$ $1.php 

Jak jste si všimli, modul mod_rewrite nahrazuje žádané URL pomocí regulárních výrazů. Zde uvedený příklad je pouze minimální ukázkou možností tohoto velmi silného nástroje, o němž se v dalších dílech určitě zmíníme podrobněji.

Samozřejmě existuje i druhá možnost, a to přiřazení možnosti vykonávání souborům .html, například takto:

AddType application/x-httpd-php .phtml .php3 .php .html 

Tato možnost má však zásadní nevýhodu v tom, že obvykle platí pro celý server a znepřehledňuje kompletně organizaci skriptů. Není pak totiž možné určit, které soubory jsou statické, a které dynamické.

Další informace naleznete na těchto stránkách – www.php.net/se­curity.hiding

Co vás čeká příště

Pokud se vám tento seriál po technické stránce zamlouvá, můžete čekat jeho pokračování – ostatně o jeho kvalitách se můžete vyjádřit v diskusním fóru. V pokračování bych měl zájem podívat se na administraci webových aplikací pomocí zrychleného vývoje aplikací. Bavit bychom se měli především o napojení na produkty MS Access či Dadabik, které jsou k tomuto účelu nejvhodnější.

Školení: SQL pro začátečníky

Akademie Root
  • k čemu nám slouží databáze
  • organizace dat v tabulkách
  • základní příkazy pro obsluhu databáze
  • využití příkladů v praktických ukázkách

Detailní informace o kurzu...

Ohodnoťte jako ve škole:
Průměrná známka 3,44

Přehled názorů

Závažné chyby ve článku
Jaroslav Šeděnka 12. 8. 2004 00:40
├ 
Re: Závažné chyby ve článku
Martin Čížek 12. 8. 2004 07:47
│
└ 
Re: Závažné chyby ve článku
Jaroslav Šeděnka 12. 8. 2004 08:29
│
 
├ 
Re: Závažné chyby ve článku
jirka 12. 8. 2004 09:12
│
 
├ 
Re: Závažné chyby ve článku
Satano 12. 8. 2004 11:07
│
 
│
└ 
Re: Závažné chyby ve článku
Martin Čížek 12. 8. 2004 13:26
│
 
│
 
├ 
Re: Závažné chyby ve článku
Satano 19. 8. 2004 12:17
│
 
│
 
└ 
Re: Závažné chyby ve článku
Noname 5. 1. 09:30
│
 
├ 
Re: Závažné chyby ve článku
Martin Čížek 12. 8. 2004 13:32
│
 
└ 
A preco by to neslo? [WAS:Závažné chyby ve článku]
Janci 12. 8. 2004 16:17
│
 
 
├ 
Re: A preco by to neslo? [WAS:Závažné chyby ve článku]
Janci 12. 8. 2004 16:22
│
 
 
│
└ 
Re: Este raz a naposledy
Janci 12. 8. 2004 16:24
│
 
 
│
 
└ 
Re: Este raz a naposledy
Jaroslav Šeděnka 12. 8. 2004 21:26
│
 
 
│
 
 
└ 
Re: Este raz a naposledy
Janci 12. 8. 2004 23:20
│
 
 
│
 
 
 
└ 
Re: Este raz a naposledy
majo 18. 8. 2004 20:07
│
 
 
│
 
 
 
 
└ 
Re: Este raz a naposledy
anonymní uživatel 19. 8. 2004 09:03
│
 
 
└ 
Re: A preco by to neslo? [WAS:Závažné chyby ve člá
Jaroslav Šeděnka 12. 8. 2004 21:24
│
 
 
 
└ 
Re: A preco by to neslo? [WAS:Závažné chyby ve člá
Janci 12. 8. 2004 23:25
└ 
Re: Závažné chyby ve článku
Vermin 12. 8. 2004 12:54
 
└ 
Re: Závažné chyby ve článku
Ritchie 12. 8. 2004 13:26
 
 
├ 
Re: Závažné chyby ve článku
Jakub 12. 8. 2004 13:37
 
 
└ 
Re: Závažné chyby ve článku
Vermin 12. 8. 2004 13:57
bez titulku
univerz 12. 8. 2004 00:57
Ruzne poznamky
Ondřej Válek 12. 8. 2004 01:49
├ 
Re: Ruzne poznamky
yacht 12. 8. 2004 08:32
│
└ 
Snovy pocitac
BoodOk 12. 8. 2004 09:26
│
 
└ 
Re: Snovy pocitac
check 12. 8. 2004 14:48
├ 
Re: Ruzne poznamky
Janci 12. 8. 2004 16:28
└ 
Re: Ruzne poznamky
STEFi 10. 1. 2005 07:59
$DIRECTORY_SEPARATOR
N/A 12. 8. 2004 07:30
├ 
Re: $DIRECTORY_SEPARATOR
Martin Koníček (autor) 12. 8. 2004 10:02
│
└ 
Re: $DIRECTORY_SEPARATOR
Jirka Wolny 12. 8. 2004 14:19
│
 
├ 
chybna XP ???
dejf 12. 8. 2004 16:39
│
 
└ 
Re: $DIRECTORY_SEPARATOR
zajdee 13. 8. 2004 07:11
│
 
 
└ 
Re: $DIRECTORY_SEPARATOR
Petr Baláš 13. 8. 2004 17:29
└ 
Re: $DIRECTORY_SEPARATOR
Janci 12. 8. 2004 16:30
Konečně příklady z praxe
Josef 12. 8. 2004 07:32
OWASP, OWASP....
Ivo Hanuška 12. 8. 2004 07:38
Clanek se mi libil
Tomáš Šimek 12. 8. 2004 08:00
Přetypování při porovnání
Martin Čížek 12. 8. 2004 08:03
└ 
Re: Přetypování při porovnání
Bundik 12. 8. 2004 08:44
 
├ 
Re: Přetypování při porovnání
nondescript 12. 8. 2004 08:59
 
│
├ 
Re: Přetypování při porovnání
Bundik 12. 8. 2004 09:21
 
│
└ 
Re: Přetypování při porovnání
jkt 12. 8. 2004 12:56
 
├ 
Re: Přetypování při porovnání
lnx 12. 8. 2004 09:52
 
│
├ 
Re: Přetypování při porovnání
Tux 12. 8. 2004 10:06
 
│
└ 
Re: Přetypování při porovnání
Bundik 12. 8. 2004 10:36
 
│
 
└ 
Re: Přetypování při porovnání
Satano 12. 8. 2004 11:05
 
│
 
 
├ 
Re: Přetypování při porovnání
Marek Paška 12. 8. 2004 12:01
 
│
 
 
└ 
Re: Přetypování při porovnání
kciii 12. 8. 2004 12:03
 
│
 
 
 
└ 
Re: Přetypování při porovnání
Tux 12. 8. 2004 15:35
 
│
 
 
 
 
└ 
Re: Přetypování při porovnání
Mormegil 12. 8. 2004 17:51
 
├ 
Re: Přetypování při porovnání
Jakub 12. 8. 2004 13:39
 
│
└ 
Re: Přetypování při porovnání
dejf 12. 8. 2004 16:44
 
├ 
Re: Přetypování při porovnání
Martin Čížek 12. 8. 2004 13:56
 
└ 
Re: Přetypování při porovnání
Janci 12. 8. 2004 17:08
 
 
└ 
Re: Přetypování při porovnání ... chybka
kinghowa 22. 8. 2004 17:59
require/include
yacht 12. 8. 2004 08:18
└ 
Re: require/include
Martin Koníček (autor) 12. 8. 2004 10:11
 
└ 
Re: require/include
Bundik 12. 8. 2004 10:47
 
 
└ 
Re: require/include
Vermin 12. 8. 2004 13:04
 
 
 
├ 
Re: require/include
Ritchie 12. 8. 2004 13:39
 
 
 
└ 
Re: require/include
yacht 12. 8. 2004 13:47
 
 
 
 
└ 
Re: require/include
dejf 12. 8. 2004 17:00
skvele
PhaX 12. 8. 2004 08:21
hardwarová náročnost aplikace
KokoZ 12. 8. 2004 09:23
└ 
Re: hardwarová náročnost aplikace
Tux 12. 8. 2004 14:11
 
└ 
Re: hardwarová náročnost aplikace
Janci 12. 8. 2004 17:21
 
 
├ 
Re: hardwarová náročnost aplikace
caracho 13. 8. 2004 08:43
 
 
│
└ 
Re: hardwarová náročnost aplikace
tracy 4. 3. 2006 15:07
 
 
└ 
Re: hardwarová náročnost aplikaceRe: hardwarová náročnost aplikace
dgx 29. 9. 2006 02:24
I když je to zdánlivě nelogické,.... jo to je ;)
michal_sjx 12. 8. 2004 09:41
└ 
Re: I když je to zdánlivě nelogické,.... jo to je ;)
Behemoth 12. 8. 2004 09:48
 
└ 
Re: I když je to zdánlivě nelogické,.... jo to je
michal_sjx 12. 8. 2004 10:17
 
 
└ 
Re: I když je to zdánlivě nelogické,.... jo to je
Behemoth 12. 8. 2004 10:28
 
 
 
├ 
Re: I když je to zdánlivě nelogické,.... jo to je
Jakub 12. 8. 2004 13:43
 
 
 
├ 
Re: I když je to zdánlivě nelogické,.... jo to je
michal_sjx 13. 8. 2004 09:26
 
 
 
│
├ 
Re: I když je to zdánlivě nelogické,.... jo to je
jiri 13. 8. 2004 12:43
 
 
 
│
│
└ 
Re: I když je to zdánlivě nelogické,.... jo to je
michal_sjx 13. 8. 2004 19:54
 
 
 
│
└ 
Re: I když je to zdánlivě nelogické,.... jo to je
petra 16. 8. 2004 13:59
 
 
 
└ 
Re: I když je to zdánlivě nelogické,.... jo to je
anonymní uživatel 19. 8. 2004 09:48
Pokracovani se vyplati...
Martin 12. 8. 2004 09:52
└ 
Re: Pokracovani se vyplati...
php-zacatecnik 13. 8. 2004 11:10
rychlost ereg_* fcii
miso 12. 8. 2004 10:20
├ 
Re: rychlost ereg_* fcii
Ondřej Surý 12. 8. 2004 11:57
│
└ 
Re: rychlost ereg_* fcii
caracho 13. 8. 2004 08:47
└ 
Re: rychlost ereg_* fcii
:D 6. 8. 2005 10:38
Reseni je tak jednoduche...
Arcao 12. 8. 2004 11:16
├ 
Re: Reseni je tak jednoduche...
yacht 12. 8. 2004 11:29
├ 
Re: Reseni je tak jednoduche...
p 12. 8. 2004 11:32
│
└ 
Re: Reseni je tak jednoduche...
Janci 12. 8. 2004 17:31
│
 
├ 
Re: Reseni je tak jednoduche...
p 13. 8. 2004 10:39
│
 
└ 
Re: Reseni je tak jednoduche...
kavol 14. 8. 2004 10:25
├ 
Re: Reseni je tak jednoduche...
tdc 12. 8. 2004 12:29
├ 
Re: Reseni je tak jednoduche...
ales 12. 8. 2004 13:26
│
└ 
Re: Reseni je tak jednoduche...
p 12. 8. 2004 16:07
│
 
├ 
Re: Reseni je tak jednoduche...
ales 13. 8. 2004 07:24
│
 
│
└ 
Re: Reseni je tak jednoduche...
michal_sjx 13. 8. 2004 09:31
│
 
│
 
└ 
Re: Reseni je tak jednoduche...
ales 13. 8. 2004 09:45
│
 
│
 
 
└ 
Re: Reseni je tak jednoduche...
hkmaly 13. 8. 2004 15:38
│
 
└ 
Re: Reseni je tak jednoduche...
Floyd 10. 9. 2004 12:44
└ 
Re: Reseni je tak jednoduche...
Vermin 12. 8. 2004 13:51
 
└ 
Re: Reseni je tak jednoduche...
MaReK Olšavský 12. 8. 2004 16:53
 
 
└ 
Re: Reseni je tak jednoduche...
Janci 12. 8. 2004 17:39
pekny clanek - nekamenujte detaily
Roman 12. 8. 2004 11:50
no nevim...
jkt 12. 8. 2004 13:30
├ 
Re: no nevim...
jiri 12. 8. 2004 14:13
├ 
Re: no nevim...
junix 12. 8. 2004 14:41
└ 
Re: no nevim...
Martin Koníček (autor) 12. 8. 2004 14:45
 
├ 
Re: no nevim...
dejf 12. 8. 2004 16:59
 
└ 
Re: no nevim...
ales 13. 8. 2004 08:30
Doplnění
Ritchie 12. 8. 2004 14:03
└ 
Re: Doplnění
jiri 12. 8. 2004 14:29
 
└ 
Re: Doplnění
Alobal 12. 8. 2004 15:50
 
 
├ 
Re: Doplnění
Dave 12. 8. 2004 16:44
 
 
│
├ 
Re: Doplnění
. 12. 8. 2004 17:35
 
 
│
└ 
Re: Doplnění
. 12. 8. 2004 20:04
 
 
└ 
Re: Doplnění
Solvina 12. 8. 2004 18:09
 
 
 
├ 
Re: Doplnění
Martin Koníček 13. 8. 2004 08:28
 
 
 
└ 
Re: Doplnění
hkmaly 13. 8. 2004 15:52
Pomucka
Petr Boura 12. 8. 2004 16:08
└ 
Re: Pomucka
Dave 12. 8. 2004 16:54
 
└ 
Re: Pomucka
Dave 12. 8. 2004 17:13
 
 
└ 
Re: Pomucka
hkmaly 13. 8. 2004 15:57
 
 
 
└ 
Re: Pomucka
Dave 15. 8. 2004 22:25
nepresnost u prikladu $cislo == 'ahoj'
gooff 12. 8. 2004 16:20
och ten nadpis
daniel 12. 8. 2004 17:19
└ 
Re: och ten nadpis
Martin Koníček 12. 8. 2004 17:31
 
└ 
Re: och ten nadpis
Vermin 12. 8. 2004 17:54
hesla v /etc/passwd???
Michal Kubeček 12. 8. 2004 21:36
├ 
Re: hesla v /etc/passwd???
jiri 12. 8. 2004 22:38
│
└ 
Re: hesla v /etc/passwd???
Michal Kubeček 12. 8. 2004 23:39
│
 
└ 
Re: hesla v /etc/passwd???
Michal Kubeček 12. 8. 2004 23:41
└ 
Re: hesla v /etc/passwd???
ari 3. 8. 2005 11:22
Je to chyba nebo ne?
ondra 14. 8. 2004 20:49
├ 
Re: Je to chyba nebo ne?
oik 15. 8. 2004 14:08
├ 
Re: Je to chyba nebo ne?
Dave 15. 8. 2004 22:31
│
└ 
Re: Je to chyba nebo ne?
ondra 16. 8. 2004 00:56
└ 
Re: Je to chyba nebo ne?
PeTa 18. 4. 2006 11:04
Dobrý blábol o regulárních výrazech !!!
muthafucka 17. 8. 2004 16:45
btw pouziti uvozovek a apostrofu
muthafucka 17. 8. 2004 16:54
dva dotazy offtopic
Pavel 18. 8. 2004 10:12
└ 
Re: dva dotazy offtopic
jkt 20. 8. 2004 16:54
SQL script injection :-))))
Michal Aichinger 26. 8. 2004 22:07
└ 
Re: SQL script injection :-))))
onovy 1. 9. 2004 22:21
Funkce
JM 29. 8. 2004 22:08
Ošetření přístupu k souborům
Pavel 20. 11. 2004 19:49
       
Zasílat nově přidané příspěvky e-mailem