Ano, MySQL dokáže technicky bezpečně uložit jakýkoli typ textu. To znamená, že MySQL uloží text tak, jak je, a vrátí jej znovu bez ztráty jakýchkoli dat.
Mysql se neliší mezi obsahem textu, takže nezáleží na tom, zda se jedná o HTML, CSS, JS kód nebo poslední e-mail vašich přátel.
Pokud však text vypíšete později, měli byste se postarat o to, aby nedošlo k nežádoucímu vložení kódu poté, co jste stáhli data z mysql. Ale to ve skutečnosti s MySQL nesouvisí.
Aby bylo sql bezpečnější, předejte popisovač databáze na mysql_real_escape_string
nebo ještě lépe použijte MySQLi
a/nebo CHOP
a připravená prohlášení.
Váš kód
Váš kód vypadá, že se hodně snažíte něčemu zabránit, ale nakonec se ukáže, že je docela zbytečný:
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data= strip_tags($data);
$data = mysql_real_escape_string($data);
return $data;}
Před zpracováním data normalizujte
Nejprve byste měli změnit pozici kontroly pro get_magic_quotes_gpc
normalizovat data, na kterých funkce pracuje. Bylo by ještě lepší, kdyby se na to vaše aplikace nespoléhala, ale pouze popírala práci, pokud je tato možnost povolena - zde naleznete důležité informace
pokud vám záleží na bezpečnosti.
Ale pro bezpečnost vašeho zveřejněného kódu nejprve normalizujme vstupní hodnotu funkce, než ji dále zpracujeme. To se provede přesunutím zaškrtnutí do horní části funkce.
function filter($data)
{
// normalize $data because of get_magic_quotes_gpc
$dataNeedsStripSlashes = get_magic_quotes_gpc();
if ($dataNeedsStripSlashes)
{
$data = stripslashes($data);
}
// normalize $data because of whitespace on beginning and end
$data = trim($data);
// strip tags
$data = strip_tags($data);
// replace characters with their HTML entitites
$data = htmlentities($data);
// mysql escape string
$data = mysql_real_escape_string($data);
return $data;
}
V této upravené funkci byly magické uvozovky (které byste neměli používat) přesunuty na její začátek. To zajišťuje, že bez ohledu na to, zda je tato možnost zapnutá nebo vypnutá, data budou vždy zpracována stejně. Vaše funkce tak neučinila, vytvořila by různé výsledky pro stejná předaná data. Takže to bylo opraveno.
Další problémy s vaší funkcí
I funkce nyní vypadá lépe, stále má mnoho problémů. Není například jasné, co funkce vlastně dělá. Dělá mnoho věcí najednou a některé z nich jsou protichůdné:
- Odstraní značky HTML, což je znak, že
$data
by neměl obsahovat HTML - Potom však převedete text
$data
skutečně obsahovat entity HTML.
Jaká by tedy měla být data? HTML nebo ne? Nezavádí větší zabezpečení, pokud se věci stanou nejasnými, protože to prospěje tomu, že se do vašeho programu objeví chyby a nakonec dokonce projdou vašimi bezpečnostními opatřeními.
Měli byste tedy kód zahodit a zvážit následující:
- Pokud je vstup do vaší aplikace neplatný, nefiltrujte jej. Místo toho zabraňte dalšímu použití neplatného vstupu. Takže potřebujete funkci pro ověření vstupu, než ji použijete.
- Neměňte data jen proto, že si myslíte to by mohlo udělat něco bezpečnějšího. Místo toho změňte a zakódujte data tam, kde je to potřeba a vhodné.
- Zajistěte, aby vaše aplikace fungovala pouze s vypnutými magickými uvozovkami. Spoléhat se na tuto funkci je velmi nedoporučuje. A pak už to není potřeba ve vašem kódu kontrolovat.
- Chcete-li něco bezpečně uložit do databáze, před použitím pouze v dotazu data escapujte. Ne na jiném místě vaší aplikace. K tomu použijte Připravené výpisy.
- Pokud jsou data platná, není třeba je před vložením do databáze přetahovat. Při výstupu na webovou stránku jej však musíte správně zakódovat . A pouze tam aplikace ví, v jakém kódování to musí být. Při vkládání dat do databáze to nepoznáte.
Takže pokud chcete, aby byl váš kód bezpečnější, není to o házení hromady funkcí na některá data, protože si myslíte, že souvisí se zabezpečením. Díky tomu svůj software nezlepšíte, ale snížíte jeho zabezpečení.
- Nikdy nedůvěřujte uživatelským datům.
- Ujistěte se, že jsou data ve formátu, ve kterém je potřebujete před zpracováním .
- Používejte správný nástroj pro práci na správném místě.
- Nikdy nepoužívejte nástroje na hádání. Získejte místo toho znalosti, které se vyplatí nejen z hlediska bezpečnosti.