Autor Zpráva
blazej44800
Profil
Ahojte
Používam jedne triedu na zabezpečenie vstupov a výstupov pre PHP a chcel by som, aby ste sa na ňu pozreli či tam je všetko čo by asi malo byť, prípadne niekomu pomôže:

class safe
{
  final static function SQLString($s)
    {
        $s = trim($s);
        $s = str_replace("'","''",$s);
        $s = str_replace("\\","\\\\",$s);
        return "'" . $s . "'";
    }
  final static function SQLInt($int)
  {
    if(is_numeric($int))
    {
      return $int;
    }
    else
    {
      return false;
    }
  }
  
  final static function input($s)
  {
      $s = trim(strip_tags($s));    
      if (get_magic_quotes_gpc())
      {
          $s = stripslashes($s);
      }
      $s = mysql_real_escape_string($s);    
      return $s;
  }
  
  final static function intval($int) 
  {
    $int = str_replace(",", ".", $int);
    if (is_numeric($int)) {
      return $int;
    } else {
      return false;
    }
  }
  
  final static function html($s)
  {    
      $s = mysql_real_escape_string(trim($s));    
      return $s;
  }
     
  final static function output($s)
  {
     return htmlspecialchars(stripslashes(trim($s)));
  }
}
Jan Tvrdík
Profil
blazej44800:
Je to blbost a nemá to hlavu a patu :)
blazej44800
Profil
Prečo to je blbosť? Ty ako ošetruješ vstupy užívateľov pre sql injection a pod.?
Joker
Profil
blazej44800:
Prečo to je blbosť?
No nic ve zlém, ale napsat šest kratičkých metod tak, že ani jedna nefunguje správně a přitom snad každá obsahuje jinou chybu, to je docela výkon.

Krom toho ke každé z nich existuje ekvivalentní vestavěná funkčnost PHP a je docela pochybné je dávat dohromady do jedné třídy.
blazej44800
Profil
Práve preto som to tu dal: aké chyby napríklad?
Tori
Profil
blazej44800:
Něco se týká jedné konkrétní databáze, něco HTML vstupu / možná i výstupu. Ty metody mají společné jen to, že dostanou řetězec a nějakým způsobem ho pozmění. Podle stejné logiky byste tam mohl přidat i převodník z MySQL datetime na lidsky čitelný řetězec nebo přepočet měn. Chápu sice tu ideu mít všechny filtry na jednom místě, ale stejně nejspíš časem dojdete k objektovému návrhu aplikace a potom každá z těch metod bude patřit do úplně jiného objektu. Takže je asi lepší to rozlišovat hned (a nechtít parkovat v jedné garáži tirák, jaguára, i matchboxovou fordku).
Joker
Profil
blazej44800:
Práve preto som to tu dal: aké chyby napríklad?
Dobře, uvidíme, jestli se z toho vyvine něco smysluplného.
Tak začneme takhle: Pro každou z těch metod prosím o popis, co je její účel a jakým způsobem funguje.
blazej44800
Profil
SQLString - ošetruje SQL príkazy pred SQL injection
SQLInt - otestuje, či je hodnota premennej číslo
input - ošetrí vstup od užíateľa, pripraví pre vkladanie do SQL príkazov
intval - zmení desatinnú čiarku na bodku a otestuje či sa jedná o číslo
html - ošetrí výstup z databázy pre vloženie do stránky
output - ošetrí výstup z databázy pre vloženie do stránky a zamietne HTML kódy
Jan Tvrdík
Profil
blazej44800:
Pojďme si postupně ty funkce projít, ať ti je jasné, proč jsou to blbosti.

1) SQLString
řádek 5: nesmysl, funkce trim nemá nic společného s obranou vůči SQL injection
řádek 6 a 7: nesmysl, na escapování slouží funkce mysqli_real_escape_string (případně jiné podle použité databáze a knihovny pro komunikaci s ní)
řádek 8: dejme tomu

2) SQLInt
řádek 16: funkce is_numeric je dost benevolentní, nejsem si zdaleka jist, zda databáze je benevolentní identickým způsobem
řádek 18: proč vracet zrovna false?

3) input
řádek 14: funkci strip_tags nelze použít pro bezpečné odstranění HTML značek, trim nemá logiku
řádek 29: a vida, tady funkci mysql_real_escape_string máš, tak k čemu je pak funkce SQLString?

4) intval
název identický jako vestavěná funkce intval, ale dělá něco úplně jiného

5) html
nesmyslný název; proč na rozdíl od funkce input nerespektuje nastavené magic quotes?

6) output
Proč to trimuješ na výstupu, když jsi to trimoval i na vstupu?
Proč odstraňuješ lomítka, ty při výstupu vůbec nevadí. Spíš tam budou omylem, protože máš chybně navržené ty ostatní funkce


Jo a přečti si phpfashion.com/escapovani-definitivni-prirucka.
Joker
Profil
Dobře, tak poznámky k tomu, celkově:
• Viz už výše, každá z těch metod vlastně znovuvynalézá kolo, .
• Jak zmiňuje Tori, metody jsou do třídy seskupené podle špatného klíče: Třída má seskupovat různé operace nad stejným druhem dat, ne podobné operace nad různými druhy dat.
• Neexistuje ani nějaký jednotný způsob, kterým by ty metody pracovaly. Nevěřil bych, že tu třídu dělal jeden člověk (respektive věřil bych, že to vytvořil jeden člověk, který si chtěl dát různé příklady špatného kódu na jedno místo). Třeba jedna metoda třídy obsahuje jakýsi pokus se řídit nastavením magic_quotes_gpc. Žádná jiná se tím neřídí. Nebo za jediné logické vysvětlení metody SQLString považuji, že její autor nezná funkci mysql_real_escape_string. Jenže v jiných metodách se ta funkce používá.

A k těm metodám:

blazej44800:
SQLString - ošetruje SQL príkazy pred SQL injection
I když místo SQL příkazů dám řetězce, tak to nedělá. Jednak neescapuje všechny potenciálně nebečné věci, ale jen zpětná lomítka a apostrofy, jednak odstraňuje i neškodné znaky (dělá trim) a jednak přidává kolem řetězce apostrofy.

SQLInt - otestuje, či je hodnota premennej číslo
…a pak vrátí řetězec, číslo nebo boolean. Navíc za celé číslo považuje i třeba "3.1415926535" nebo "0xBADF00D".
K čemu je to dobré?

input - ošetrí vstup od užíateľa, pripraví pre vkladanie do SQL príkazov
Takže rozdíl mezi účelem metody SQLString a metody input spočívá v čem?

intval - zmení desatinnú čiarku na bodku a otestuje či sa jedná o číslo
Aha, budiž, něco na ten způsob opravdu dělá.
Otázka je, k čemu je to dobré.

html - ošetrí výstup z databázy pre vloženie do stránky
Tak to rozhodně nedělá, právě naopak, udělá trim a pak escapuje řetězec pro databázi.

output - ošetrí výstup z databázy pre vloženie do stránky a zamietne HTML kódy
Takže výstupem z databáze nemůže být HTML?
A proč zároveň dělá trim a ještě požírá zpětná lomítka?
blazej44800
Profil
Ok čiže táto trieda je asi nanič. :) vďaka za rady, hádam sa z nich poučím

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: