Autor Zpráva
Majkelju
Profil
Mám tabulku uživatelů, kde mám v každém řádku delete link. Po kliknutí na něj se mi otevře dialogové okno. Po kliknutí na Smazat chci načíst php soubor pouze s SQL dotazem, který uživatele smaže. Následně by se měl obsah tabulky obnovit bez reloadu stránky. Bohužel takto jak to mám, to nejede - uživatel z DB odstraněn není. Ajaxem volaný soubor deleteUser.php mám ve stejné (chráněné složce). Když si v .get() volání vyjedu výstup souboru deleteUser.php pomocí proměnné data, píše mi to že nemám povolen přístup. Jak to obejít?
K tomu, aby se mi obsah tabulky po smazání uživatele obnovil, jsem se ještě nedostal vůbec, předpokládám, že to budu muset založit jako novou otázku...

Takže jak správně zavolat deleteUser.php?

function deleteDialog(id) { 
    $( "#dialog-confirm" ).dialog({
        resizable: false,
        height:140,
        modal: true,
        buttons: {
            "Smazat": function(id) {
                $.get("./protected/deleteUser.php?id="+id);
                $( this ).dialog( "close" );
            },
            "Zrušit": function() {
                $( this ).dialog( "close" );
            }
        }
    });
}
preca1
Profil
Zdravim,
jestli nemáš povolený přístup, tak ho povol, ne? Tohle neni problém s JS, ale na straně serveru. Jakou hlášku o nepovolenym přístupu ti to vypíše? Nějakou výchozí serverovskou, nebo tvojí aplikace? Máš správně cestu k tomu scriptu? Nemá to bejt jen deleteUser.php?
Majkelju
Profil
preca1:
Cesta je správně, naopak když jsem tam měl jen deleteUser.php, tak mi proměnná data vypisovala 404 nenalezeno. Vzhledem k tomu, že jak volaný soubor, tak ten, ze kterého volám, jsou oba v té chráněné složce, tak se tomu trochu podivuji...
Chyba je standardní 403 access forbidden. Napadlo mě, jestli právě nestačí změnit obsah .htaccess...jenže nemám tušení jak...Potřebuju se tam sice dostat přes tuhle funkci, ale zároveň to musí zůstat chráněno, aby se k těm souborům nikdo nemohl dostat tak, že je zadá do URL...
Nebo dá se to obejít nějak úplně jinak? Napadlo mě přidat ten kus kódu, který maže uživatele, jako funkci do taktéž chráněného souboru protected/functions.php, který includuju už v index.php...takže by měl být přístupný...jenže pak vyvstává otázka, jak tu funkci z JS zavolat..
Majkelju
Profil
KONEČNĚ jsem na to po půl dne přišel! Přesunul jsem soubor s DELETE SQL dotazem do rootu a id uživatele místo z $_GET[] získal z $_POST[]. Místo .get() pak stačí zavolat .post() a předat parametr. Tímhle způsobem bych měl být ochráněn před tím, aby kdokoliv mohl do URL zadat parametr a vymazávat mi uživatele z databáze. Pokud se pletu, tak mě prosím někdo upozorněte! :)
juriad
Profil
Majkelju:
POST tě před ničím nechrání. Uživatel může všechno, co posílá na server sfalšovat. Výhoda POSTu proti GETu je v tom, že délka POSTu není omezená (pokud píšeš článek, tak by se ti GETem odeslaný oříznul asi na 4000 znaků). A také není vidět v URL.

Tomu, co ti přijde od uživatele nikdy nevěř, vždy na serveru prováděj kontrolu samotných dat i, zda uživatel má k akci oprávnění.
Porovnej co putuje po síti za požadavky v případě GET a POST (proč by měl být POST bezpečnější?).
Použil jsem k tomu tento formulář: http://kod.djpw.cz/rwy (dvakrát s různou metodou odeslání formuláře).

Ukázka (odeslal jsem remove-user sem na diskusi přes GET):
GET /index.php?do=remove-user&id=123 HTTP/1.1
Host: diskuse.jakpsatweb.cz
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://kod.djpw.cz/?editor=on
Connection: keep-alive

Ukázka (odeslal jsem remove-user sem na diskusi přes POST):
POST /index.php HTTP/1.1
Host: diskuse.jakpsatweb.cz
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://kod.djpw.cz/?editor=on
Connection: keep-alive
Content-Length: 21
Content-Type: application/x-www-form-urlencoded

do=remove-user&id=123

A ještě neskončím. Sleduj (tentokrát u sebe), co se stane po odeslání požadavku a stisku F5. Odešle se znovu.
Sice se prohlížeč zeptá, zda má znovu odeslat POST, ale pokud mu to dovolíš, pokusil by ses vymazat toho samého uživatele.
V případě mazání to skončí chybou, ale v případě takového přidávání komentářů, by každý refresh přidal ten samý komentář znovu a znovu.
Řešením je na konci vykonání akce přesměrovat (pomocí funkce header) na bezpečnou stránku. Tím „smažeš“ POST a GET parametry a refresh nic nezpůsobí.
Majkelju
Profil
Takže ve finále budu muset prostě část s SQL dotazem klasicky zabalit do kontroly toho, zda je uživatel přihlášen, zda má práva atd...
Kubo2
Profil
Majkelju:
Približne hej.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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