Javascript předání ID záznamu pro smazání – JavaScript, AJAX, jQuery – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Javascript předání ID záznamu pro smazání – JavaScript, AJAX, jQuery – Fórum – Programujte.comJavascript předání ID záznamu pro smazání – JavaScript, AJAX, jQuery – Fórum – Programujte.com

 

fix
~ Anonymní uživatel
182 příspěvků
12. 4. 2018   #1
-
0
-

Ahoj všem,

dělám první takovou větší aplikaci a prosím někoho zkušenějšího, který by mi poradil, jak umožnit uživateli smazat záznam z DB, aby to nešlo zneužít a zároveň to bylo jednoduché řešení pro amatéra jako jsem já. :-)

Protože ve stávající fázi jak to mám, tak jakýkoliv uživatel může přistoupit k smazat.php?id=<sem může zadat jakékoliv ID a smaže cizí záznam>, což není zrovna ideální. Kontrola zda na tu stránku má uživatel přístup by musela být na úplně každé stránce a to mi přijde moc složité. Tak to mám tak, že kontrola obsahu, který je dostupný je jen na hlavní stránce pro tabulku se záznamy a každému se zobrazují v tabulce jen ty záznamy, které se jim zobrazovat mají a u každého záznamu mají ikonku, viz níže.

Díky moc všem za rady.

Moje HTML:

$nestedData[] = '<div style="display: inline-block;width: 100%;text-align:center;">
            <i class="pe-7s-trash clickable" onclick="deleteFunction('.$row["id"].')" ></i>
</div>';

Moje JS:

function deleteFunction(id) {
            if (confirm("Opravdu chcete tento záznam smazat?") == true) {
                varURI = 'smazat.php?id='+id.toString();
                window.location.href=varURI
            } else {}
 }

Moje PHP smazat.php:

<?php

session_start();
if($_SESSION['login']!=""){

if (isset($_GET['id'])) {
    $id = $_GET['id'];
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    $sql = "DELETE FROM zavady WHERE id=$id";

.....

?>
Nahlásit jako SPAM
IP: 92.240.177.–
gna
~ Anonymní uživatel
1891 příspěvků
12. 4. 2018   #2
-
0
-

Netuším, jak máš ta práva řešená, ale je nesmysl, že by bylo složité před operací zkontrolovat, jestli ji uživatel smí provést.

Taky bacha na to, že v tom id může být mimo id cizího záznamu i cokoliv jiného, co úplně změní ten sql příkaz. To se dnes řeší pomocí prepared statements.

$stmt = $mysqli->prepare("DELETE FROM zavady WHERE id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
Nahlásit jako SPAM
IP: 213.211.51.–
fix
~ Anonymní uživatel
182 příspěvků
13. 4. 2018   #3
-
0
-

#2 gna

Nedokážu to pochopit ani z php.net :-) Resp tuším, jak to funguje a myslím, že to v mém případě použít nelze, páč ten soubor smazat.php?id=id je pro všechny přihlášené uživatele stejný.

Já to potřebuji omezit už na úrovni toho tlačítka, aby ID šlo poslat jen tím tlačítkem nikoliv pomocí GET.

Toto mi tedy vyhovuje, akorát potřebuji, aby to fungovalo jinak než přes zneužitelné editovatelné GET.

function deleteFunction(id) {
            if (confirm("Opravdu chcete tento záznam smazat?") == true) {
                varURI = 'smazat.php?id='+id.toString();
                window.location.href=varURI
            } else {}
 }
Nahlásit jako SPAM
IP: 92.240.177.–
MilanL+1
Grafoman
13. 4. 2018   #4
-
0
-

#3 fix
práva na práci s db bys měl řešit na straně serveru nikoli klienta.

v případě, že generuješ tabulku záznamů pro klienta mělo by jít i podle podmínky na práva zobrazovat mazací control (tlašítko, zaškrtnutí apod), jen u povolených záznamů.

Nahlásit jako SPAM
IP: 91.139.9.–
fix
~ Anonymní uživatel
182 příspěvků
13. 4. 2018   #5
-
0
-

#4 MilanL

Jo tak to mám, zobrazují se správným uživatelům správné záznamy a správná tlačítka.

Problém se spíš v tom php souboru.

Tedy dotaz položím srozumitelněji: Jak pomocí tlačítka s onClick zavolat PHp pro smazání záznamu aniž by se ten php  soubor dal zavolat i bez tlačítka? A zároveň abych to nemusel řešit nějak složitě pomocí generování nějakých tokenů apod. Tím myslím, předat tím onclick ID tak nějak jako POST metodou než GET, aby potom nikdo nemohl používat parametry v URL typu smazat.php?id=$id

Nahlásit jako SPAM
IP: 92.240.177.–
gna
~ Anonymní uživatel
1891 příspěvků
13. 4. 2018   #6
-
0
-

Do POSTu to můžeš dát, ale jde o to, že všechna data jsou editovatelná a na straně serveru je vždycky musíš nějak zkontrolovat.

A když už tam máš nějaký systém práv, podle kterého určuješ záznamy k zobrazení, tak musí jít stejně zkontrolovat jestli uživatel chce mazat něco mimo to, co může.

Nahlásit jako SPAM
IP: 213.211.51.–
fix
~ Anonymní uživatel
182 příspěvků
13. 4. 2018   #7
-
0
-

#6 gna

Myslím že chápu, chceš mi říct, že jakákoliv snaha o to aby se PHP zavolalo pomocí JS tlačítka je špatně, vždycky to může klient obejít nějakou editací lokálního zdrojového kódu a proto není jiná cesta než udělat kontrolu i ve všech PHP souborech. Jestli to dobře, chápu, tak tedy nemám radost, dalo mi práci vychytat to, aby se tlačítko zobrazovalo jen komu se zobrazovat má a teď ještě na strane serveru kontrola, to abych se naučil OOP :-(  Nebo si udělám nějaký univerzální kod a použiji include(); :-D Děkuji za vysvětlení, udělám tedy i kontrolu oprávnění přímo ve všem PHP souborech, který pristupují k databázi.

Nahlásit jako SPAM
IP: 92.240.177.–
peter
~ Anonymní uživatel
4016 příspěvků
13. 4. 2018   #8
-
0
-

Mas divne dotazy. Zkusim ti objasnit, jak to funguje, jak se to obvykle dela, bez vetsiho zabezpeceni.

- Ty si pohlidas v php kodu, treba pomoci session, zda je uzivatel prihlasen, overis si jeho loginy ze session, pripadne nejake session id. (To je jeden include radek na externi php soubor, ktery ho pri spatnem loginu presmeruje na logovaci stranku, treba. Takze nic sloziteho, pokud ten kod uz pouzivas jinde.)
- Pak mu dovolis normalne spustit smazani. Je jedno, zda pres get, ale lepe pres post.
- Neni problem, paranoidne zkontrolovat prava pred kazdym sql dotazem, resp. tvoji funkci. A tez se dela odpojeni po ukonceni sql dotazu, ihned. Preberes data pres fetch a odpojis. Po te data treba zobrazujes nebo zpracovavas dal.

Samozrejme, ted jde spustit treba 10x smazat. To se da vyresit presmerovanim na jinou stranku pomoci header.
Cili, ten mazaci kod budes mit treba smaz.php, form action=smaz.php. A smaz.php ho pres header vrati na puvodni stranku, treba index.php. Tu stranku si muzes taky odeslat formularem, odkazem.
K presmerovani pripojis do adresy treba parametr, ktery uzivateli vypise chybu nebo, ze akce probehla v poradku.
Pokud se jedna o hackera a spusti ti tam neco 10x, tak s tim mnoho nenadelas. Ale 10x nesmaze radek z db, protoze radky maji sve autoincrement id, obvykle, a takove tam existuje jen 1x. Jenom ti hacker trochu zatizi server.
Samozrejme se da vyuzit toho, ze se uzivatel neodhlasil, odesel od pc a spustit tam nejake dalsi kody. Ale s tim ty mnoho neudelas, session je platne, nemuzes vedet, ze tam uz nesedi puvodni uzivatel.

Mno, co se tyce sql. K sql se pripojujes z php kodu na sveho univerzalniho uzivatele, treba fix_www / heslo. Ten je univerzalni pro kazdeho uzivatele webu. Ty tedy hlidanim prav v php musis zabezpecit, aby se tedy nespustil zadny sql dotaz, pokud uzivatele radne neoveris.
Tady je moznost, pokud to hosting umozni, udelat si nad databazi vic uzivatelu. A pak se muzes k sql pripojovat ruznymi uzivateli s ruznymi sql pravy. Ale to se obvykle neda, obvykle mas 1 usera (free db hostingy). Ale ta moznost je, na localhostu nebo lepsim hostingu.
Muzes pak nastavit prava treba fix_quest, ktery si smi prohlizet treba jen nektere tabulky a at posila jake chce prikaxy pres php, tak sql ho nepusti k tem ostatnim. Takze, pokud to jde a vis, co delas, rozhodne doporucuji. Jenze, stale to zavisi na tom, jak dobre poresis prava pres php, aby te quest nzziskal nekde admin prava. Dobre reseni je obvykle pracne. Tys zadal jednoduche, bohuzel.

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:38...–
fix
~ Anonymní uživatel
182 příspěvků
13. 4. 2018   #9
-
0
-

#8 peter
Panečku, ty jsi se rozepsal, díky za vysvětlení hned si to jdu přečíst.

Mas divne dotazy. Zkusim ti objasnit, jak to funguje, jak se to obvykle dela, bez vetsiho zabezpeceni.

- Ty si pohlidas v php kodu, treba pomoci session, zda je uzivatel prihlasen, overis si jeho loginy ze session, pripadne nejake session id. (To je jeden include radek na externi php soubor, ktery ho pri spatnem loginu presmeruje na logovaci stranku, treba. Takze nic sloziteho, pokud ten kod uz pouzivas jinde.)

Ano, tak to mám
- Pak mu dovolis normalne spustit smazani. Je jedno, zda pres get, ale lepe pres post.

Ano, tak to mám
- Neni problem, paranoidne zkontrolovat prava pred kazdym sql dotazem, resp. tvoji funkci. A tez se dela odpojeni po ukonceni sql dotazu, ihned. Preberes data pres fetch a odpojis. Po te data treba zobrazujes nebo zpracovavas dal.

Ano, tak to mám, vlastně nemám, ukončuji dotaz nějak takhle $conn->close(); a na konci souboru, přestože, těch dotazů je v souboru více. Ale hádám, že to není důležité.

Samozrejme, ted jde spustit treba 10x smazat. To se da vyresit presmerovanim na jinou stranku pomoci header.

Ano, tak to mám, přesměrovává pomocí header z pohledu uživatela na stejnou stránku a v levo dole vyskočí notivifka ce úspěšném smazání nebo neúspěšném v případě, že by byl smazán cizí záznam (ano, už jsem to pošéfoval i na straně serveru, takže hotovo).


Cili, ten mazaci kod budes mit treba smaz.php, form action=smaz.php. A smaz.php ho pres header vrati na puvodni stranku, treba index.php. Tu stranku si muzes taky odeslat formularem, odkazem.
K presmerovani pripojis do adresy treba parametr, ktery uzivateli vypise chybu nebo, ze akce probehla v poradku.

Mám to podobně, akorát ne přes form, ale onclick a get požadavkem k PHP souboru který zkontroluje, odkoho ten GET je (podle login session) a jestli ten záznam je jeho.
Pokud se jedna o hackera a spusti ti tam neco 10x, tak s tim mnoho nenadelas. Ale 10x nesmaze radek z db, protoze radky maji sve autoincrement id, obvykle, a takove tam existuje jen 1x. Jenom ti hacker trochu zatizi server.

Jde zmáčknout jen jednou, protože je to javascriptem, nikoliv formulářem jak radíš. Takže zmáčknout muže jen jednou v tom případě se záznam smaže, tabulka se přepíš a podruhé už nebude mít na co zmáčknout a i kdyby měl, napíše mu to, že přístup je odepřen, protože ten záznam ani neexistuje. Ano id mám unikátní.
Samozrejme se da vyuzit toho, ze se uzivatel neodhlasil, odesel od pc a spustit tam nejake dalsi kody. Ale s tim ty mnoho neudelas, session je platne, nemuzes vedet, ze tam uz nesedi puvodni uzivatel.

Na to prdím, nedělám internetové bankovnictví pro rajfku.

Mno, co se tyce sql. K sql se pripojujes z php kodu na sveho univerzalniho uzivatele, treba fix_www / heslo. Ten je univerzalni pro kazdeho uzivatele webu. Ty tedy hlidanim prav v php musis zabezpecit, aby se tedy nespustil zadny sql dotaz, pokud uzivatele radne neoveris.

Hotovo. Viz výše. Přidělal jsem tam kontrolu oprávnění,  problém je vyřešen.
Tady je moznost, pokud to hosting umozni, udelat si nad databazi vic uzivatelu. A pak se muzes k sql pripojovat ruznymi uzivateli s ruznymi sql pravy. Ale to se obvykle neda, obvykle mas 1 usera (free db hostingy). Ale ta moznost je, na localhostu nebo lepsim hostingu.
Muzes pak nastavit prava treba fix_quest, ktery si smi prohlizet treba jen nektere tabulky a at posila jake chce prikaxy pres php, tak sql ho nepusti k tem ostatnim. Takze, pokud to jde a vis, co delas, rozhodne doporucuji.

Zbytečně složité a na vlastní server je škoda to dávat, bude to mít malou návštěvnost, ale chápu, že definovat si to takhle přímo v databázi je to nejlepší co může být.

Jenze, stale to zavisi na tom, jak dobre poresis prava pres php, aby te quest nzziskal nekde admin prava. Dobre reseni je obvykle pracne. Tys zadal jednoduche, bohuzel.

Řekl bych, že si myslím, že je to teď dobře, ale jsem začátečník a myslet si to můžu, vždycky to jistě nějak jde. Získání admin práv je u mě jednoduché přečíst si configurační soubor, čímž získá přístup do DB, a tam si jen vytvořit uživatele co bude mít ve sloupčku "admin" = 1 :-D

Díky za informace a zkušenosti, můžeme to považovat za uzavřené.

Nahlásit jako SPAM
IP: 92.240.177.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 11 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý