Autor | Zpráva | ||
---|---|---|---|
peter_r Profil |
#1 · Zasláno: 29. 7. 2020, 08:48:18
ahojte, viem že je to primitívna otázka, a určite si poviete že sú to základy, ale som absolútny amatér, o php a databázy sa len otieram, ale dúfam že sa niekto nájde, čo mi helfne
mám menu: <a href="firma_1.php">Firma 1</a><br> <a href="firma_2.php">Firma 2</a><br> <a href="firma_3.php">Firma 3</a><br> a po kliknutí mi má vytiahnuť z tabuľky vyrobky všetky položky, ktoré majú v stĺpci firma text napr. firma 1 Asi by som to mal urobiť nejako takto SELECT * FROM vyrobky WHERE firma LIKE ? ale v menu asi musím nejako zadefinovať, čo má hľadať čiže skúšal som dať <a href="firma_1.php" name="firma 1" >Firma 1</a> ale potom neviem čo dať v selecte doteraz som to mal urobené tak, že na každú firmu mám vytvorený súbor zoznam_firma1.php a v ňom je SELECT * FROM vyrobky WHERE firma="firma 1" lenže tých firiem mi pribúda a na každú firmu mať samostaný súbor je už veľa Ďakujem |
||
blaaablaaa Profil |
#2 · Zasláno: 29. 7. 2020, 09:02:50
peter_r:
Řeší se to většinou nějak takto: V odkazu budeš mít firma.php?id=1
Soubor firma.php pak bude měnit svůj obsah podle proměnné $_GET['id']
A dotaz do db pak může vypadat takto: $query = 'SELECT * FROM vyrobky WHERE firma='.(int)$_GET['id']; //pripadne nejaka databazova vrstva, ktera vyresi ochranu proti sql injection za tebe |
||
Keeehi Profil |
#3 · Zasláno: 29. 7. 2020, 09:03:32
<a href="firma.php?jmeno=firma_1">Firma 1</a> <a href="firma.php?jmeno=firma_2">Firma 2</a> if (isset($_GET["jmeno"]) { $condition = ' WHERE firma="'.$mysqli->real_escape_string($_GET["jmeno"]).'"' } else { $condition = ""; } $result = $mysqli->query('SELECT * FROM vyrobky' . $condition); |
||
peter_r Profil |
#4 · Zasláno: 29. 7. 2020, 09:09:39
ďakujem vám, vyskúšam obidva, potom dám vedieť, aspoň sa zase niečomu podučím
|
||
blaaablaaa Profil |
#5 · Zasláno: 29. 7. 2020, 09:29:50
peter_r:
Oba jsou obdobné - já předávám id jako číslo, Keeehi jako string (zachovává současnou podobu db). Keeehiho verze navíc počítá s absencí parametru jmeno, v tu chvíli zobrazí výrobky všech firem. |
||
peter_r Profil |
cez ID to robiť nemôžem, lebo pri v tabuľke v stĺpci firma už mám textové názvy firiem, musel by som to prerobiť
skúšam tú Keeehiho verziu ale nedarí sa mi tam zakomponovať tú podmienku mám to tam takto: $vysledok = Db::queryAll(' SELECT * FROM vyrobky WHERE firma="firma1"'); podarilo sa mi to dať bez podmienky a už to funguje, ďakujem $vysledok = Db::queryAll(' SELECT * FROM vyrobky WHERE firma="'.($_GET["menof"]).'"); |
||
Serg Profil |
#7 · Zasláno: 29. 7. 2020, 11:39:14
peter_r:
$vysledok = Db::queryAll(' SELECT * FROM vyrobky WHERE firma="'.($_GET["menof"]).'"); Pozor na SQL injection. To proto blaaablaaa použil přetypování na int a Keeehi real_escape_string() .
Sice mě zrovna nenapadá jaký konkrtně útok by se dal použít, protože klasické vypsání všech záznamů přidáním starého známého " OR 1 = 1 by asi žádnému útočníkovi užitečné moc nebylo. Možná by mohlo být trochu nebezpečné kdyby na tom místě použil EXISTS a subquery, nějak tam propašoval LOAD INTO OUTFILE pokud to bude povolené, nebo UNION ALL. Každopádně myslet na zabezpečení je dobré už od začátku, i když s programováním třeba jen začínáš.
|
||
Jakub J._ Profil * |
#8 · Zasláno: 29. 7. 2020, 11:44:32
Reaguji na peter_ra a Serga:
Stačí navštívit odkaz firma.php?menof=%22%3B%20DELETE%20FROM%20vyrobky%3B%20-- a rázem je celá tabulka výrobků smazaná.
|
||
Kajman Profil |
#9 · Zasláno: 29. 7. 2020, 11:45:51
Serg:
Ano, správný union dokáže vytáhnout data i z jiných tabulek. peter_r: Podívejte se na bindování proměnných v databázové vrstvě, kterou používáte. |
||
Keeehi Profil |
#10 · Zasláno: 29. 7. 2020, 11:50:49
Serg:
Co by se v tomto případě dalo použít je určitě to UNION ALL. firma.php?menof=" UNION ALL SELECT username, password FROM users -- - Jakub J.: Spíš ne. I když je možnost jak spustit více dotazů z jednoho stringu které tam jsou oddělené středníkem, tak většinou to tak nefunguje. |
||
Serg Profil |
#11 · Zasláno: 29. 7. 2020, 12:19:06
Ta Db třída vypadá že je z článku o databázi v php z itnetworks, jestli to tak opravdu je, tak by stačilo napsat:
$menof = $_GET["menof"]; $vysledok = Db::queryAll('SELECT * FROM vyrobky WHERE firma = ?', $menof); Použije se "prepared statement" a ten řetězec se databázi předá jako parametr, takže ta už bude vědět že to nemá zpracovávat jako část dotazu a nebude to tedy nebezpečné. |
||
peter_r Profil |
#12 · Zasláno: 29. 7. 2020, 14:20:28
ďakujem, viem že treba dbať na bezpečnosť, ale toto mám na vnútropodnikovej sieti a tu vedia ledva ovláda prácu s pc :)
ešte tam potrebujem zoradiť výsledky podľa abecedy a stále mi vyhadzuje chybu, čo tam mám zle? $menof = $_GET["menof"]; $vysledok = Db::queryAll('SELECT * FROM vyrobky WHERE firma = ?', $menof ' ORDER BY nazov'); |
||
blaaablaaa Profil |
#13 · Zasláno: 29. 7. 2020, 14:22:48
queryAll nejspíš očekává jako první parametr string s dotazem a pak n parametrů, kde n = počet neznámých v dotazu :)
$vysledok = Db::queryAll('SELECT * FROM vyrobky WHERE firma = ? ORDER BY nazov', $menof); |
||
Keeehi Profil |
#14 · Zasláno: 29. 7. 2020, 14:46:15
peter_r:
„toto mám na vnútropodnikovej sieti a tu vedia ledva ovláda prácu s pc :)“ Jasně, a do vnitropodnikové sítě se nikdy žádný útočník dostat nemůže, že? Na tomhle ztroskotalo už spousta firem. |
||
Časová prodleva: 4 roky
|
0