Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Expirace linku v emailu

Aktivity
Avatar
Jan Štrobl
Člen
Avatar
Jan Štrobl:8.2.2018 10:34

Zdravím,

bádám nad tím, jak vytvořit link s expirací. Konkrétně mi jde o následující situaci.

Uživatel se například zaregistruje -> po vyplnění formuláře se mu na email odešle nějaký vítací email s potvrzovacím linkem, jakmile on teprve klikne na odkaz tak se vše zapíše do DB. Já ale potřebuji, aby ten link bylo možné použít pouze jednou, popřípadě aby po například půl hodině link vypršel a uživatele hodil na předpřipravenou "Error page". Účelem je aby se uživatel do databáze nezapsal dvakrát a vyhnout se té variantě, kdy se ověří jestli už uživatel náhodou v tabulce není a v takovém případě ho nezapsat.

Nedokázal jsem najít řešení jak udělat link pouze na jedno použití, tudíž přemýšlím nad variantou časového omezení linku.
Šlo by aby formulář vygeneroval link který se odešle uživateli na email, ten link by v sobě měl proměnou expirace která by udávala čas a datum vytvoření + například 1 hodina.Tudíž by v linku, který se vytvořil například 8.2.2018 ve 14:00 byla hodnota 8.2.2018,15:00 a jakmile by uživatel kliknul na link, přesměruje ho to na formulář, který si zjistí jestli tento datum už byl

if (
$aktualni_cas > $_GET["cas_expirace"]){
echo ("Již je příliš pozdě");}
else ... zapsání do DB...

Teď si nejspíš říkáte na co se tedy ptám, no.. hold mi to psaním tohoto dotazu docvaklo. I přesto chci dotaz zveřejni třeba pro ostatní popřípadě bych zde mohl dostat odpověď ohledně linku na jedno použití.

 
Odpovědět
8.2.2018 10:34
Avatar
Neaktivní uživatel:8.2.2018 10:57

Ú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
Editováno 8.2.2018 10:58
Nahoru Odpovědět
8.2.2018 10:57
Neaktivní uživatelský účet
Avatar
Odpovídá na Jan Štrobl
Uživatel sítě :8.2.2018 17:36

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ů.

Nahoru Odpovědět
8.2.2018 17:36
Chybami se člověk učí, běžte se učit jinam!
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na Neaktivní uživatel
Jan Štrobl:28.2.2018 8:23

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,poz­ná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í :D

 
Nahoru Odpovědět
28.2.2018 8:23
Avatar
Jan Štrobl
Člen
Avatar
Jan Štrobl:28.2.2018 9:01

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">.....;
 
Nahoru Odpovědět
28.2.2018 9:01
Avatar
nekukej
Člen
Avatar
Odpovídá na Jan Štrobl
nekukej:28.2.2018 9:36

Proměnná

$meil

je správně?

 
Nahoru Odpovědět
28.2.2018 9:36
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na nekukej
Jan Štrobl:28.2.2018 9:43

Ano :) :D

S takhle jak to je napsané to hodí chybu
Fatal error: Uncaught Exception: Dangerous identifier in SQL query in /www/doc/www.muj­web.com/www/for­ms/form/Db.php:173 Stack trace: #0 /www/doc/www.muj­web.com/www/for­ms/form/Db.php(133): Db::checkIden­tifiers(Array) #1 /www/doc/www.muj­web.com/www/for­ms/form/potvrze­ni.php(62): Db::update('UPDATE MyTable S...', Array, 'WHERE email = ?', ''.stroblhonza@s­...') #2 {main} thrown in /www/doc/www.muj­web.com/www/for­ms/form/Db.php on line 173

Editováno 28.2.2018 9:46
 
Nahoru Odpovědět
28.2.2018 9:43
Avatar
dez1nd
Člen
Avatar
Odpovídá na Jan Štrobl
dez1nd:28.2.2018 10:25

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);
Editováno 28.2.2018 10:25
 
Nahoru Odpovědět
28.2.2018 10:25
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na dez1nd
Jan Štrobl:28.2.2018 10:41

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.muj­web.com/www/for­ms/form/Db.php on line 132

Fatal error: Uncaught Error: Unsupported operand types in /www/doc/www.muj­web.com/www/for­ms/form/Db.php:133 Stack trace: #0 /www/doc/www.muj­web.com/www/for­ms/form/potvrze­ni.php(53): Db::update('UPDATE STROJE S...', .Dan Landa., .KEU., .stroblhonza@s...', ''.72133540., .adsd., .., ''.Plastik\xC3\xA1\­xC5\x99sk...', ''.M\xC4\x9B\x­C5\x99ic\xC3\xAD tec...', ''.stroblhonza@s­...') #1 {main} thrown in /www/doc/www.muj­web.com/www/for­ms/form/Db.php on line 133

 
Nahoru Odpovědět
28.2.2018 10:41
Avatar
dez1nd
Člen
Avatar
Odpovídá na Jan Štrobl
dez1nd:28.2.2018 11:38

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ě.

 
Nahoru Odpovědět
28.2.2018 11:38
Avatar
dez1nd
Člen
Avatar
Odpovídá na dez1nd
dez1nd:28.2.2018 11:45

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);
Editováno 28.2.2018 11:46
 
Nahoru Odpovědět
28.2.2018 11:45
Avatar
dez1nd
Člen
Avatar
Odpovídá na dez1nd
dez1nd:28.2.2018 11:47

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é.

 
Nahoru Odpovědět
28.2.2018 11:47
Avatar
Odpovídá na Jan Štrobl
Neaktivní uživatel:28.2.2018 12:47

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ď.

Nahoru Odpovědět
28.2.2018 12:47
Neaktivní uživatelský účet
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na Neaktivní uživatel
Jan Štrobl:28.2.2018 13:10

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 ...."

 
Nahoru Odpovědět
28.2.2018 13:10
Avatar
Jan Štrobl
Člen
Avatar
Jan Štrobl:28.2.2018 13:32

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>';
      }
?>
 
Nahoru Odpovědět
28.2.2018 13:32
Avatar
Neaktivní uživatel:28.2.2018 13:35

Už vím. Zkus

DB::query('UPDATE MyTable SET jmeno = ?, email = ?, telefon = ?, poznamka = ? WHERE email = ?', $jmeno, $meil, $telefon, $mess, $meil);
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
28.2.2018 13:35
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:28.2.2018 13:39

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

Editováno 28.2.2018 13:39
Nahoru Odpovědět
28.2.2018 13:39
Neaktivní uživatelský účet
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na Neaktivní uživatel
Jan Štrobl:28.2.2018 13:43

Panebože, omg! Víš co? Víš co? To se ti to hledá viď? :D Až si založíš vlastní církev tak ji začnu vyznávat :D

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 :-)

 
Nahoru Odpovědět
28.2.2018 13:43
Avatar
Odpovídá na Jan Štrobl
Neaktivní uživatel:28.2.2018 13:48

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 :D

Editováno 28.2.2018 13:49
Nahoru Odpovědět
28.2.2018 13:48
Neaktivní uživatelský účet
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na Neaktivní uživatel
Jan Štrobl:28.2.2018 15:04

Hm... tak sice už to neháže chybu, tváří se to funkčně ale nefunguje to :D 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.

Editováno 28.2.2018 15:06
 
Nahoru Odpovědět
28.2.2018 15:04
Avatar
Odpovídá na Jan Štrobl
Neaktivní uživatel:1.3.2018 0:06

Je to možné, protože email z linku asi vypadá nějak takhle: mujmail%40seznam.cz

Zkus

$meil = urldecode($_GET["email"])
Nahoru Odpovědět
1.3.2018 0:06
Neaktivní uživatelský účet
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na Neaktivní uživatel
Jan Štrobl:1.3.2018 8:55

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é :-)

 
Nahoru Odpovědět
1.3.2018 8:55
Avatar
Neaktivní uživatel:1.3.2018 9:29

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);
Editováno 1.3.2018 9:29
Nahoru Odpovědět
1.3.2018 9:29
Neaktivní uživatelský účet
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na Neaktivní uživatel
Jan Štrobl:1.3.2018 9:41

Takže.. chyba opět trošku jinde :D 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 :D

 
Nahoru Odpovědět
1.3.2018 9:41
Avatar
Jan Štrobl
Člen
Avatar
Jan Štrobl:1.3.2018 10:06

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 :D

 
Nahoru Odpovědět
1.3.2018 10:06
Avatar
Jan Štrobl
Člen
Avatar
Jan Štrobl:1.3.2018 10:29

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".

 
Nahoru Odpovědět
1.3.2018 10:29
Avatar
Neaktivní uživatel:1.3.2018 11:04

zkus to singlequery bez count(). Jestli ti to vrati treba ID.

Editováno 1.3.2018 11:05
Nahoru Odpovědět
1.3.2018 11:04
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:1.3.2018 11:11

...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);
Editováno 1.3.2018 11:11
Nahoru Odpovědět
1.3.2018 11:11
Neaktivní uživatelský účet
Avatar
dez1nd
Člen
Avatar
Odpovídá na Jan Štrobl
dez1nd:1.3.2018 11:53

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']");
Editováno 1.3.2018 11:56
 
Nahoru Odpovědět
1.3.2018 11:53
Avatar
dez1nd
Člen
Avatar
Odpovídá na dez1nd
dez1nd:1.3.2018 11:57

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']");
 
Nahoru Odpovědět
1.3.2018 11:57
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na dez1nd
Jan Štrobl:1.3.2018 12:37

Tohle dává smysl.. ale echo("$data['po­cet']"); mi nevypíše vůbec nic.

 
Nahoru Odpovědět
1.3.2018 12:37
Avatar
Odpovídá na Neaktivní uživatel
Michal Haňáček:1.3.2018 13:27

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 ...

Editováno 1.3.2018 13:28
Nahoru Odpovědět
1.3.2018 13:27
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
Odpovídá na Jan Štrobl
Dominik Gavrecký:1.3.2018 13:49

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á.

Editováno 1.3.2018 13:51
Nahoru Odpovědět
1.3.2018 13:49
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
dez1nd
Člen
Avatar
Odpovídá na Jan Štrobl
dez1nd:1.3.2018 13:56

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

 
Nahoru Odpovědět
1.3.2018 13:56
Avatar
Jan Štrobl
Člen
Avatar
Odpovídá na dez1nd
Jan Štrobl:2.3.2018 14:48

Používám, zde jsem to na chvilku vyhodil aby se mi nestalo že chyba bude v čárce a zbytek bude správně :D
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@sez­nam.cz.'
A to je ono.. ono to pak vyhledává i ty znaky vedle.. teď bádám jak se toho zbavit.

 
Nahoru Odpovědět
2.3.2018 14:48
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Jan Štrobl
Ondřej Štorc:2.3.2018 15:14

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'";
Nahoru Odpovědět
2.3.2018 15:14
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
dez1nd
Člen
Avatar
Odpovídá na Jan Štrobl
dez1nd:3.3.2018 12:38

No to brzo jsis dumpnul tuto promennoi. Tech tecek jsem si vsimnul uz na zacatku :)

 
Nahoru Odpovědět
3.3.2018 12:38
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 37 zpráv z 37.