Diskuze: Nelze vložit do databáze - Fatal error
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 6 zpráv z 6.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.


Nedělám v PHP, ale podle mě máš "obráceně" podmínku, protože
uživatele bys měl vkládat pokud neexistuje.
A ty závorky za tím VALUES bych taky vyhodil
Db::query('INSERT INTO uzivatelinfo (uzivatel, luckynum, vek, tel) VALUES ($uzivatel, $luckynum, $vek, $tel)');
Teď jsem si všiml, že toho uživatele vkládáš do jiné tabulky, pak je ta podmínka asi dobře...
Error: Call to a member function execute() on bool in D:\xampp\htdocs\Web\Db.php:61
To znamena, ze na nekterem radku predtim provedes neco spatne. Vznikne v promene hodnota boolean. A ta neni kompatibilni s funkci na aktualnim radku. Funkce ocekavala treba sql-resource typ a ne boolean.
$uzivatel = $_GET['uzivatel_id'];
Db::querySingle("SELECT uzivatel_id FROM uzivatele WHERE uzivatel_id = {$uzivatel}");
Tohle budu delat, ze jsem jako vubec nevidel nebo by se mi desem a hruzou
zjezili vsechny vlasy a nekolik dni bych nespal 
1. Hele, kdyz prebiras data od ouzivatele, musis provest jejich kontrolu!
Nesmis je primo pouzit do sql prikazu. zkus si tam do kolonky uzivatel
vlozit:
"1 OR 1=1"
Co se stane ted? Prihlasi mne na prvniho uzivatele z tabulky uzivatel.
Co se stane pak? Prvni radek z tabulky obvykle byva superadmin. Co by se pak asi
mohlo stat, ze?
2. Do sql prikazu nemuzes davat ani zkontrolovana data jen tak. Ja na to
pouzivam funkci escapeSql, ktera to resi jinou funkci. Netusim vsak, jake
prikazy sql se volaji z tve class Db.php, takze ti nemuzu poradit, co s tim.
Napr by to vypadalo takto
function escapeSqlValue($value) {return mysql_real_escape_string($value);}
Db::querySingle("SELECT uzivatel_id FROM uzivatele WHERE uzivatel_id = ".escapeSqlValue($uzivatel)."");
3. Sql rozlisuje mezi tim, kdy mu zadavas string a integer. Muze a nemusi to udelat totez.
SELECT uzivatel_id FROM uzivatele WHERE uzivatel_id=123
SELECT uzivatel_id FROM uzivatele WHERE uzivatel_id='123'
Hack, pokud neosetris vstup uzivatele vypada takto
"1 OR 1=1" nebo
"1' OR '1'='1"
SELECT uzivatel_id FROM uzivatele WHERE uzivatel_id=1 OR 1=1
SELECT uzivatel_id FROM uzivatele WHERE uzivatel_id='1' OR '1'='1'
Jo, a mozna by ti pomohlo, kdyby sis zobrazil sql prikaz, ktery se pokousis podstrcit databazi. Treba pomoci echo $query nebo var_dump($query) ve funkci Db::querySingle
Zdravím, tak jsem se dočetl, že kvůli bezpečnosti se tam také dávají
místo proměnnýho otazníky a až pak proměnné, což nechápu proč když
tam tu proměnnou dosadim stejně potom místo toho otazníku, ale najednou to
funguje 
if($existuje) {
Db::query('INSERT INTO uzivatelinfo (uzivatel, luckynum, vek, tel) VALUES (?, ?,
?, ?)', $uzivatel, $luckynum, $vek, $tel);
}
Jinak s tím hackem díky za tip! Zkusím to nějak ověřit a zamezit tomu.
Je to preto aby si zabránil tzv. SQL injections, pretože ak by ti niekto napr. ako telefón zadal celý tento string "123); DROP TABLE uzivatelinfo; --" tak by z tvojho kódu vznikli dva príkazy
INSERT INTO uzivatelinfo (uzivatel, luckynum, vek, tel) VALUES (1, 3, 24, 123);
DROP TABLE uzivatelinfo; --)'
čím by ti vymazal celú tabuľku.
Keď to spravíš tým druhým spôsobom, že použiješ prepared statements sa query najprv skompiluje s tým, že namiesto zadaných dát od užívateľa sú ? a následne pred vykonaním sa tieto otázniky nahradia tým čo zadal čiže už nie je čas na to, že by sa query skompilovala ako dva príkazy.
Pekné príklady rôznych útokov si môžeš pozrieť tu
A niečo o prepared statements tu a tu
Zobrazeno 6 zpráv z 6.