Zabezpečení htmlspecialchars na galerii – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zabezpečení htmlspecialchars na galerii – PHP – Fórum – Programujte.comZabezpečení htmlspecialchars na galerii – PHP – Fórum – Programujte.com

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Laser Game Ostrava

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
TyNikdy0
Duch
8. 9. 2020   #1
-
0
-

Dobrý den, chtěl bych sdílet svůj problém.

Vytvořil jsem si galerii s mysql abych mohl dělat alba - hostingová služba mě poslala email, že adresa která adresuje na album je nebezpečná ../galerie.php?album=1. V galerie.php mám htmlspecialchars($_GET['album'] který následně vyselektuje pomoci ..WHERE album=1 obrázky z databáze a zobrazí je.

Nezná prosím někdo nějaký ošetření ?

Mimochodem projekt funguje cca. rok a půl a zatím jsem nezaznamenal nějaký útok a to stránka 40k unikátních návštěvníků.

Děkuji

Nahlásit jako SPAM
IP: 2a02:8308:b08a:400:c5bd:bdd9:191f:e8ea...–
gna
~ Anonymní uživatel
1215 příspěvků
9. 9. 2020   #2
-
+1
-
Zajímavé
Kit +

Funkce htmlspecialchars konvertuje znaky, které maji v HTML speciální význam na odpovídající HTML entity. Třeba < na &lt;. Takže je určená na vkládání dat do HTML a nemá nic společného s SQL.

Na ruční escapování SQL zapomeň a použij Prepared Statements, které to vyřeší.

Nahlásit jako SPAM
IP: 213.211.51.–
Kit+14
Guru
9. 9. 2020   #3
-
0
-

#1 TyNikdy
Zatím na tebe nikdo nezaútočil, protože pro nikoho ten web nebyl zajímavý.

MySQLi: Pro stringy použij funkci mysqli_real_escape_string(), pro čísla stačí přetypovat na (int).

PDO: Pro stringy metodu quote() - vkládá i apostrofy; čísla přetypovat na (int).

Nejlepším řešením je však použití prepared statements.

Nahlásit jako SPAM
IP: 46.135.1.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Řešení
peter
~ Anonymní uživatel
3621 příspěvků
10. 9. 2020   #4
-
0
-
Vyřešeno Nejlepší odpověď

Viz kluci, motas to.

1. htmlspecialchars - je funkce, ktera ve stringu prevede znaky, ktere by html zobrazil jako html kod, jedna se o tagove znacky vetsi a mensi, uvozovky jednoduche, dvojite, ampersand. Popis najdes v manualu, php.net/htmlspecialchars . Zalezi, jake pouzijes parametry. A pouziva se to k tomu, aby ti to nerozhodilo html kod. 

Example #1 htmlspecialchars() example

<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
?>

<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo '<pre>'.$new.'</pre>';
echo '<span title="'.$new.'">Toto je span a v title je text escapovany pomoci htmlspecialchars</span>';

echo '<input value="'.$new.'">';
?>

Ano, lze to pouzit jako bezpecnostni opatreni proti hackovani, kdyz se nemuzes spolehnout na to, ze je vystup $new v poradku. Napriklad, kdyz ti tam neco vklada uzivatel.

2. Pokud ziskavas text od uzivatele, tak jej ziskavas jako napr $_GET['album'] . Ale, hacke vyrobi program, ktery ti odesle v vlastni data, napriklad: " 

$album = "1 OR 1=1";
$query = "SELECT * FROM albumy WHERE album=" . $album;

SELECT * FROM albumy WHERE album=
SELECT * FROM albumy WHERE album=1 OR 1=1
-- a tento sql prikaz ti zobrazi celou tabulku albumy, protoze 1=1 je true
--  za vsech okolnosti
SELECT * FROM albumy WHERE album=1 OR (TRUNCATE albumy)
-- a tento prikaz ti smaze albumy
SELECT * FROM albumy WHERE album=1 OR (TRUNCATE users)
-- a tento prikaz ti smaze vsechny uzivatele, pokud tam mas tabulku users

Tak, proti tomu se lze branit tak, ze data od uzivatele vyfiltrujes. A take nez je predas do sql prikazu. V tomto pripade by stacilo

$album = $_GET['album'];
$album = (int) $album; // prevede na integer
$album = $album * 1; // nebo to prevedes na cislo, integer nebo float

A kdyz to posilas do sql, tak bys mel hodnotu escapovat i pro sql. Pokud do prikazu vkladas cislo, tak odstranit z hodnoty znaky, ktere cisla nebo desetinna carka, nejsou. Pokud ji pouzivas jako string, tak nahradit vsechny uvozovky, A pokud ji pouzivas jako key, tak nahradit vsechny zpetne uvozovky. K tomu jsou php/sql prikazy podle typu databaze.

SELECT * FROM albumy WHERE album=1 -- cislo
SELECT * FROM albumy WHERE album_name='fotky' -- string
SELECT * FROM albumy WHERE album_name='fo'tky' -- string, ktery obsahuje apostrof a tim narusuje sql prikaz, chyba!
SELECT * FROM albumy WHERE album_name='fotky' -- sql nazev album_name
SELECT * FROM albumy WHERE `album_name`='fotky' -- sql nazev album_name se zpetnymi apostrofy, spravneji zapsany
SELECT * FROM albumy WHERE `albu`m_name`='fotky' -- sql nazev album_name se zpetnym apostrofem uprostred, chyba!

$album_name = "albu`m_name" -- kdyz ti to uzivatel nebo hacker posle takhle, tak ti sql prikaz skonci chybou
"SELECT * FROM albumy WHERE `". $album_name ."`='fotky'
SELECT * FROM albumy WHERE `albu`m_name`='fotky'

3. url php/html
 

$album = $_GET['album']; // 1
$url   = '../galerie.php?album='.$album;

header("Location: ".$url); 
// ted si nejsem jisty, zda to udela spravne, ale pravdepodobne bude ignorovat ../
header("Location: http://localhost/meet2eat/".$url);
// tohle presmeruje na adresu http://localhost/galerie.php?…, coz muze byt chyba, hacker se dostal mimo povolenou strukturu, takze bys mu nemel dovolit zadavat adresu s ../ na zacatku nebo ../../../ uprostred adresy

echo '<a href="'.$url.'">odkaz</a>';
// <a href="../galerie.php?album=1">odkaz</a>  // $album = 1
// <a href="../galerie.php?album="</a><a href="seznam.cz">odkaz</a>  // $album = "</a><a href="seznam.cz
// uzivateli se zobrazi <a></a><a href="seznam.cz">odkaz</a>
// takze, kliknutim na odkaz se dostane na jinou stranku

echo '<a href="'.htmlspecialcharcs($url).'">odkaz</a>';
// <a href="../galerie.php?album="&lt;/a&gt;&lt;a href="seznam.cz">odkaz</a>  // $album = "</a><a href="seznam.cz
// to je lepsi, nenarusi se html kod, adresa je spravne, ikdyz nic nezobrazi

$album = $_GET['album'];
$album = urlencode($album); // hodnova pro url pouziva pro escapovani funkci
 urlencode, ktera odstranuje z hodnoty znaky, ktere tam nemaji byt
$url   = '../galerie.php?album='.$album;

pr: 
$album = "0&userid=2";
$url   = '../galerie.php?album='.$album;
../galerie.php?album=0&userid=2 // tak to treba je take chybna adresa pro odkaz, kdyz nepouzijes urlencode
Nahlásit jako SPAM
IP: 90.176.141.–
Kit+14
Guru
10. 9. 2020   #5
-
0
-

#4 peter
 

$album = $_GET['album'];
$album = (int) $album;
$album = $album * 1;

Tak tohle označuji za recyklaci proměnných, kterou zásadně nedělám. Těch důvodů je víc, ale taková recyklace paradoxně plýtvá pamětí i výkonem. 

$dirtAlbum = $_GET['album'];
$album = (int) $dirtAlbum;

Ovšem v uvedeném případě se přímo nabízí ještě jednodušší řešení 

$album = (int) $_GET['album'];
Nahlásit jako SPAM
IP: 46.135.1.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
3621 příspěvků
11. 9. 2020   #6
-
0
-

Jasne. Ja ted pouzivam v praci system s vlastni validaci, kde reknu jakeho typu je promenna pro sql, html, validaci a jake podminky ma splnit a pak uz si to resi funkce. Takze plytvam uplne vsim :) A casto potrebuji nastavit nejake min. a max. hodnoty, treba pro strankovani nebo pro seznamy, ciselniky, abych se s tim pak nemusel drbat v dalsich funkcich a overovat, zda key existuje v array.

 

Nahlásit jako SPAM
IP: 90.176.141.–
Kit+14
Guru
11. 9. 2020   #7
-
0
-

#6 peter
Pro takové komplikované proměnné používám samossamostatné třídy. Tady nejde o plýtvání, ale o udržeudržení zdravého rozumu, což je při recrecyklaci proměnných poněkud obobtížné.

Nahlásit jako SPAM
IP: 46.135.75.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 19 hostů

Podobná vlákna

Script na obrazkovou galerii — založil megaset

Include - zabezpečení — založil RolandN

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032020 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý