Diskuze: Expirace linku v emailu
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 37 zpráv z 37.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Úplně první co mě napadlo:
v databízi maš nějaký token, čas expirace, a jestli byl jíž použit tedy něco v tomhle smyslu
token, expire, used
gh324hj2g3hj42jh3j4 02.02.2018 17:00 false
ptom jen porovnáváš čas z databáze s aktualním čase + jestli byl použit
pseudocode nejak tak:
IF actualDate > expire OR used == true THEN
redirect 403
ELSE
....
SET USED TO TRUE
END IF
Ahoj,
řešil bych to vytvořením tabulky v DB o sloupcích string, expire.
String bude vygenerovaný řetězec a expire čas platnosti.
Kliknutím na odkaz ověříš platnost, pokud bude souhlasit, provedeš potvrzení, pokud bude čas překročen, tak se potvrzení neprovede, v obou případech řádek vždy smažeš.
Potom bych ještě eventem řešil (např. každou minutu) mazání prošlých řetězců.
Hmm.. inspiroval jsi mě ale zkouším to trochu jinak. Při vyplnění formuláře se mi generuje automaticky link který se odesílá na email a ten směruje na potvrzovací stránku, zároveň se tenhle link zapíše do databáze. Ten link se skládá ze jména,emailu,poznámky atd. V případě uživatel na ten link klikne, ověří se jestli v databázi existuje tento link a zároveň email tohoto uživatele na jednom řádku. Pokud ano, tak se znovu nezapíše a vyhodí hlášku že již je registrován. Pokud ne, tak do řádku s linkem UPDATEtnou všechny údaje o uživateli.. to je ale zatím jen teoretická část.. zatím jsem se zasekl na tom ověření
E: Respektive jsem se zasekl na tom updatu.. nějak mi to nebere.. nemohu najít žádnou variantu která by mi pomohla. Je mi jasný že tam je nějaká blbost co nevidím..
}
else
{
DB::update('UPDATE MyTable SET', array(
'jmeno' => $jmeno,
'email' => $meil,
'telefon' => $telefon,
'Poznamka' => $mess,
), 'WHERE email = ?', $meil);
echo '<div id="myModal" class="modal3">.....;
Ano
S takhle jak to je napsané to hodí chybu
Fatal error: Uncaught Exception: Dangerous identifier in SQL query in
/www/doc/www.mujweb.com/www/forms/form/Db.php:173 Stack trace: #0
/www/doc/www.mujweb.com/www/forms/form/Db.php(133):
Db::checkIdentifiers(Array) #1
/www/doc/www.mujweb.com/www/forms/form/potvrzeni.php(62):
Db::update('UPDATE MyTable S...', Array, 'WHERE email = ?',
''.stroblhonza@s...') #2 {main} thrown in
/www/doc/www.mujweb.com/www/forms/form/Db.php on line 173
Jen tak mimo, za poznámkou už by asi čárka být neměla ne ?
Co takhle ?
DB::update('UPDATE MyTable SET jmeno = ?, email = ?, telefon = ?, poznamka = ? WHERE email = ?', $jmeno, $meil, $telefon, $mess, $meil);
Ano neměla, díky!
Myslel jsem že tvůj příklad už bude fungovat avšak bohužel.
Warning: array_keys() expects parameter 1 to be array, string given in /www/doc/www.mujweb.com/www/forms/form/Db.php on line 132
Fatal error: Uncaught Error: Unsupported operand types in /www/doc/www.mujweb.com/www/forms/form/Db.php:133 Stack trace: #0 /www/doc/www.mujweb.com/www/forms/form/potvrzeni.php(53): Db::update('UPDATE STROJE S...', .Dan Landa., .KEU., .stroblhonza@s...', ''.72133540., .adsd., .., ''.Plastik\xC3\xA1\xC5\x99sk...', ''.M\xC4\x9B\xC5\x99ic\xC3\xAD tec...', ''.stroblhonza@s...') #1 {main} thrown in /www/doc/www.mujweb.com/www/forms/form/Db.php on line 133
To tvoje předchozí řešení asi bude lepší, dle chyby se očekává pole, takže ten můj příklad je úplně špatně.
zkusil bych udělat pole z těch hodnot a to dosadit přes ? do dotazu
$myArray = [
'jmeno' => $jmeno,
'email' => $meil,
'telefon' => $telefon,
'Poznamka' => $mess
];
DB::update('UPDATE MyTable SET ? WHERE email = ?', $myArray, $meil);
neměl by ten db::update být jeden stringový dotaz ? ty tam máš kousek dotazu, pole hodnot, pokračování dotazu... to mi přijde celkem divné.
Jaký Db.php použiváš? Vlastní nebo ten co je tady ze sítě?
Protože tohle:
DB::update('UPDATE MyTable SET jmeno = ?, email = ?, telefon = ?, poznamka = ? WHERE email = ?', $jmeno, $meil, $telefon, $mess, $meil);
By mělo být správně: viz. https://www.itnetwork.cz/…php-tutorial pokud použiváš Db.php tady ze sítě a neupravoval jsi ho. Pokud je to vlastní, tak ho sem hoď.
Také si myslím že by to mělo být správné... Ano používám zde ze sítě.
ten string mě také napadl ale když ho použiji tak to hodí tuto chybu " Fatal error: Uncaught Exception: Dangerous identifier in SQL query ...."
Tady hodím celý kód, třeba tam tu blbost někdo najde
<?php
require('Db.php');
Db::connect('localhost', 'xxx', 'xxx', 'xxx');
$cislo = $_GET['cislo'];
$stroj = $_GET['stroj'];
$mess = $_GET["zprava"];
$telefon = $_GET["telefon"];
$firma = $_GET["firma"];
$meil = $_GET["email"];
$jmeno = $_GET["jmeno"];
$souhlas1 = "";
$souhlas1 = $_GET["souhlas1"];
$souhlas2 = "";
$souhlas2 = $_GET["souhlas2"];
$souhlas3 = "";
$souhlas3 = $_GET["souhlas3"];
$link = "http://www.mujweb.com/forms/stroje/potvrzeni.php?stroj='.$stroj.'&jmeno='.$jmeno.'&email='.$meil.'&firma='.$firma.'&telefon='.$telefon.'&zprava='.$mess.'&souhlas1='.$souhlas1.'&souhlas2='.$souhlas2.'&souhlas3='.$souhlas3.'&cislo='.$cislo.'";
$data=Db::querySingle('SELECT COUNT(*) FROM MyTable WHERE email="" OR email IS NULL');
if(($data > 10)){
echo '<div id="myModal" class="modal3">
<div class="modal-content">
<div class="cont">
<h1>Tento email je již u nás k odběru novinek přihlášen!</h1>
<button onclick="click(); window.close()" class="button">Zavřít stránku</button>
</div>
</div>
</div>';
}
else
{
$myArray = [
'jmeno' => $jmeno,
'firma' => $firma,
'email' => $meil,
'telefon' => $telefon,
'Poznamka' => $mess,
'Souhlas1' => $souhlas1,
'Souhlas2' => $souhlas2,
'Souhlas3' => $souhlas3
];
DB::update('UPDATE MyTable SET ? WHERE email = ?', $myArray, $meil);
echo '<div id="myModal" class="modal3">
<div class="modal-content">
<div class="cont">
<h1>Byl(a) jste úspěšně přihlášen(a) k odběru novinek!</h1>
<button onclick="click(); window.close()" class="button">Zavřít stránku</button>
</div>
</div>
</div>';
}
?>
Už vím. Zkus
DB::query('UPDATE MyTable SET jmeno = ?, email = ?, telefon = ?, poznamka = ? WHERE email = ?', $jmeno, $meil, $telefon, $mess, $meil);
Pokud bys chtěl použit DB::update tak by to mělo asi vypadat nějak tak:
DB::update('MyTable', $myArray, 'WHERE email = [email protected]');
//Nezkoušel jsem to, vycházím z toho co je napsáno v Db.php
Panebože, omg! Víš co? Víš co? To se ti to hledá viď? Až si založíš vlastní církev tak ji začnu vyznávat
Já jsem původně používal query ale nefungovalo mi to z nějakého důvodu, tak jsem zkusil update (nyní jsem to zkoušel poprvé) Já v tom DB viděl rovněž tento styl ale právě jsem to moc nechápal ale už asi tuším. Díky moc
Ještě s tím Db:update mě napadlo tohle:
Db::update('MyTable', $myArray, 'WHERE email = ?', array('[email protected]'));
Jedno z těchto dvou snad musí fungovat
Hm... tak sice už to neháže chybu, tváří se to funkčně ale nefunguje to Nějak to nemluví s databází.. například zde.
$meil = $_GET["email"];
$data=Db::querySingle('SELECT COUNT(*) FROM MyTable WHERE email= ?', $meil);
if(($data > 1)){
Když toto použiji a vím že proměnná $meil je mujmail@seznam.cz a že v té databázi je nyní dokonce 2x tak to pořád reaguje jako kdyby tam vůbec nebyla.. dokonce si to nechám vypsat a háže mi to hodnotu 0. Ale když to zaměním za
$meil = $_GET["email"];
$data=Db::querySingle('SELECT COUNT(*) FROM MyTable WHERE email="[email protected]"';
if(($data > 1)){
Tak to šlape O.o nemůže to mít nějakou souvislost že to bere proměnnou z linku?
E: Hm.. tak jsem to ověřil a proměnou z linku si to bere správně. Tady už pomůže asi jen zapnout a vypnout.
Je to možné, protože email z linku asi vypadá nějak takhle: mujmail%40seznam.cz
Zkus
$meil = urldecode($_GET["email"])
Hele tím to nakonec nebude, jednak jsem si i nejdřív tu proměnou vypsal a napsalo se to správně a ikdyž použiji ten prefix to jsi napsal tak je to pořád stejné
Hmm..
Vypada to ale správně...
Zkus
možná odebrat tu mezeru u =.
A přidat LIMIT 1.
$data=Db::querySingle('SELECT COUNT(*) FROM MyTable WHERE email=? LIMIT 1', $meil);
Takže.. chyba opět trošku jinde to tvé i to mé je správně včetně tohoto
$data=Db::queryAll('SELECT COUNT(*) FROM MyTableWHERE email="'. $meil .'"');
Ale musí tam být to queryAll
Ty jo, tak ani to ne. To se sice trochu změnilo ale když si pak tu proměnou data vypíšu tak mi to hodí Array
Přemýšlím že to ve finále musím stejně upravit, ale toto mi nefunguje
$data=Db::queryAll('SELECT * FROM MyTableWHERE jmeno="'. $jmeno.'" AND email="'. $meil .'"');
echo("$data");
Potřebuji aby se mi vypsalo kolik se v tabulce nachází záznamů který obsahují dané jméno a email dohromady. Avšak mi to místo hodnoty píše "Array".
zkus to singlequery bez count(). Jestli ti to vrati treba ID.
...to je prostě de***ita, že tu není možnost editovat příspěvěk(po 5 vteřinách??)
Zkus ještě
Db::query('SELECT COUNT(*) FROM MyTable WHERE email=? LIMIT 1', $meil);
Protože v $data máš pole hodnot, ne jednu hodnotu.
mušíš dát
echo("$data['jmeno']");
nebo
$data=Db::queryAll('SELECT count(id) as pocet FROM MyTableWHERE jmeno="'. $jmeno.'" AND email="'. $meil .'"');
echo("$data['pocet']");
sakra pitomá editace....
Protože v $data máš pole hodnot, ne jednu hodnotu.
mušíš dát
echo("$data['jmeno']");
nebo
$data=Db::queryAll('SELECT count(id) as pocet FROM MyTableWHERE jmeno="'. $jmeno.'" AND email="'. $meil .'"');
echo("$data['pocet']");
Tohle dává smysl.. ale echo("$data['pocet']"); mi nevypíše vůbec nic.
Pod tu prvni cast prispevku
...to je prostě de***ita, že tu není možnost editovat příspěvěk(po 5 vteřinách??)
bych klidne hodil podpis ...
Prečo to riešiš takto ja naozaj nerozumiem je tu 100000 kvalitných článkov od naozaj skvelých programátorov a ty si aj tak ideš cestou zmätku a bordelu.
Pri zápise použi blok try catch a na stĺpec s emailom hoď uniqe. Niečo v zmysle:
try{
/*Insert do DB*/
}catch (UniqeException $exception){
throw new 'Uživateľ s vašim emailom už existuje'
}
Ušetríš si N riadkov 1 zbytočnú query na DB.
$link = "http://www.mujweb.com/forms/stroje/potvrzeni.php?stroj='.$stroj.'&jmeno='.$jmeno.'&email='.$meil.'&firma='.$firma.'&telefon='.$telefon.'&zprava='.$mess.'&souhlas1='.$souhlas1.'&souhlas2='.$souhlas2.'&souhlas3='.$souhlas3.'&cislo='.$cislo.'";
Skús si pozrieť ako funguje
$link = 'lorem'
$link .= 'impsum'
K tvojmu problému dump na $_GET a pomaly si dumpuj každý riadok a kontroluj či vracia to čo vraciať má.
Používej dosazování do dotazů.
tohle
$data=Db::queryAll('SELECT count(id) as pocet FROM MyTableWHERE jmeno="'. $jmeno.'" AND email="'. $meil .'"');
smrdí SQL Injection
Používám, zde jsem to na chvilku vyhodil aby se mi nestalo že chyba bude
v čárce a zbytek bude správně
Nicméně jsem asi přišel na to kde je chyba.. když si vypíšu proměnou
$meil tak mi to napíše '.mujmail@seznam.cz.'
A to je ono.. ono to pak vyhledává i ty znaky vedle.. teď bádám jak se toho
zbavit.
Tohle:
$link = "http://www.mujweb.com/forms/stroje/potvrzeni.php?stroj='.$stroj.'&jmeno='.$jmeno.'&email='.$meil.'&firma='.$firma.'&telefon='.$telefon.'&zprava='.$mess.'&souhlas1='.$souhlas1.'&souhlas2='.$souhlas2.'&souhlas3='.$souhlas3.'&cislo='.$cislo.'";
změn na něco takovýhleho:
$link = "http://www.mujweb.com/forms/stroje/potvrzeni.php?stroj='$stroj'&jmeno='$jmeno'&email='$meil'&firma='$firma'&telefon='$telefon'&zprava='$mess'&souhlas1='$souhlas1'&souhlas2='$souhlas2'&souhlas3='$souhlas3'&cislo='$cislo'";
No to brzo jsis dumpnul tuto promennoi. Tech tecek jsem si vsimnul uz na zacatku
Zobrazeno 37 zpráv z 37.