Autor Zpráva
Nailen
Profil
Dobrý večer,

řeším následující problém. Mám v databázi záznamy. Ty vypisuji do tabulky. Každý záznam v tabulce bude mít na konci řádku ikonku pro editaci a křížek pro smazání.
Pod tabulkou je formulář pro přidání nového řádku do tabulky. Formulář vypadá následovně:

<form name='add_to_db' action='".$_SERVER['PHP_SELF']."' method='post'>
...
<input type='submit' value='Přidat' class='submit' />          
</form>          

V rámci jedné stránky tedy vypisuji data i přidávám nové.
Editovat a mazat bych chtěl také v rámci této stránky. Potřebuji poradit jak mám napsat odkazy (předat parametry) pro ikony edit a delete. V odkazu budu předávat id řádku který chci mazat/editovat.

Ještě mě napadlo, že by nemuselo být špatné při kliknutí na ikonu, aby vyskočilo potvrzovací dialogové okno. Je to dobrý nápad?
Poradí mi někdo jak sestavit odkaz pro toto dialogové okno a následné potvrzení, aby se načetla ta samá stránka a provedla danou volbu?
Jak provést samotnou editaci, nebo smazání to už zvládnu.

Děkuji za rady.
Taps
Profil
Nailen:
Object moved
Kajman
Profil
Pokud budete dělat mazání, dejte si např. do url i bezpečnostní token, abyste nemazal řádky, když navštívíte stránku, kde je obrázek se stejnou url, jakou hodláte mazat.

Navíc můžete udělat javascriptem dotaz a pak zrušit kliknutí na odkaz a poslat ajax požadavek metodou POST a případě úspěchu jen řádek v DOM smazat a nemusíte načítat celou stránku. Pokud nebude javasript funkční a půjdete GET požadavkem na smazání nebo nebude vyplněn token, referer atp., může tam být teprve html formulář s POST metodou, kde se doplní chybějící token a musíte potvrdit, že opravdu záznam chcete smazat.

cs.wikipedia.org/wiki/Cross-site_request_forgery
Nailen
Profil
Kajman:


Děkuji za nasměrování, ale budu potřebovat další radu.

Potvrzení editace řeším tedy takto:

<a href="' . $_SERVER['PHP_SELF']. '?id=10&token=123456789&action=edit" onclick="return confirm(\'Opravdu chcete editovat ?\')">

A teď řeším přidání toho tokenu do databáze. Používám tuto funkci:

function add_token_to_db($token) 
{
  global $mysqli,$db_table_prefix;
    $a = time() + 3600;
    $stmt = $mysqli->prepare("INSERT INTO ".$db_table_prefix."auth_tokens (user_id, token, validity)
    VALUES
    (
      ?, ?, ?
    )");
    $stmt->bind_param("sss", $loggedInUserID, $token, $a); 
    $stmt->execute();
    $stmt->close();    
}

Nějak mi to ale nefunguje a do databáze se nic nezapisuje. Stejně napsanou funkcí vkládám jiné záznamy do DB a to mi funguje, takže nechápu proč ten token se mi neukládá.Skript nevykazuje žádnou chybu, kterou by vypsal.
Poradí mi někdo, jestli lze do funkce napsat nějaký příkaz, který vypíše, proč k zápisu do DB nedojde?
Výpis chyb na serveru mám zapnutý, protože, když v zápise udělám nějakou syntaktickou chybu, tak to napíše.

tabulka v DB vypadá takto:

CREATE TABLE `uc_auth_tokens` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `token` varchar(10) NOT NULL,
  `validity` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Kajman
Profil
Zkuste nastavit u sloupce id autoincrement.
Nailen
Profil
Kajman:

Dobrý den, toto nastavené mám, jen se to při exportu tabulky nezobrazilo.
Nailen
Profil
Kajman:

Tak problém s ukládáním databáze vyřešen. Pomohla mi tato funkce: printf("Error: %s.\n", $stmt->error);
Zjistil jsem, že nemám naplněnou proměnou $loggedInUserID

Ještě se tedy zeptám, jestli jsem pochopil správně celou problematiku.

Pokud uživatel přijde na stránku, kde může editovat nebo mazat, tak vygeneruji token. Ten uložím do databáze. Dám mu platnost třeba hodinu. Pokud uživatel klikne na ikonu editace, tak zavolám tu stejnou stránku s parametry. Pomocí GET ty parametry naštu do proměnných a pokud pro daného uživatele bude v DB existovat stejný platný token, tak provedu akci. Po akci token z DB smažu.

Chápu to dobře?
Díky
Kajman
Profil
Pokud budete používat https, tak by se snad token mohl používat i pro více akcí a není ho potřeba mazat. Můžete pak z jedné stránky rozkliknout více tabů a půjdou editovat všechny.

Tedy nový token bude mít platnost např. dvě hodiny. Při zobrazení editační stránky, použite starý token, který je alespoň ještě hodinu planý nebo vygenerujete nový. Z db smažete jen ty tokeny, kterým již vypršela platnost - stačí třeba jednou denně. Navíc smažete všechny při odhlášení daného uživatele.

V adresáři administrace nebo u editačních url bych zvážil zákaz předávání refereru na jiné stránky
Referrer-Policy

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: