Autor | Zpráva | ||
---|---|---|---|
marek888 Profil |
#1 · Zasláno: 22. 10. 2013, 17:05:57
Dobrý den. Našel sem si na internetu, jak odstranit můj příspěvek. Vložil jsem ho na stránku, a když sem na něj klikl, tak mě odhlásil, a příspěvek nevymazal. Neví tu prosím někdo, čím to může být? Obbávám se toho, že je to způsobené tím, že na té samé stránce mám formulář, kterým odesílám příspěvky, ale nejsem si uplně jistý. Děkuji všem za odpovědi. Zde je kod, pro případné vyřešené problému. :
echo "<a href= ' . $_SERVER[PHP_SELF] . '?akce=smaz&id=' . $id . '>Smazat</a>"; if (!empty($_GET['akce']) && $_GET['akce'] == 'smaz') { mysql_query("delete from tabulka where id=" . $_GET['id']); } |
||
Amunak Profil |
#2 · Zasláno: 22. 10. 2013, 17:24:23
Z tak malého úseku kódu nikdo nepozná, čím to může být. Ale máš tam několik chyb:
- tvůj kód je náchylný na CSRF - a na SQL injection - používá zastaralé funkce mysql_* - přistupuje k mazání jako k mazání. Obvykle se místo skutečného mazání z DB pouze označí příspěvek jako smazaný, aby se dal případně obnovit, kdyby to bylo potřeba. Staré "smazané" položky jdou vždycky dodatečně odstranit, bylo-li by to nezbytné. marek888: „Obbávám se toho, že je to způsobené tím, že na té samé stránce mám formulář, kterým odesílám příspěvky“ to by neměl být problém, záleží na tom, jak to máš napsané. Dej sem celý kód. |
||
marek888 Profil |
#3 · Zasláno: 22. 10. 2013, 17:38:04
$db_host = ""; $db_username = ""; $db_pass = ""; $db_name = ""; @mysql_connect("$db_host", "$db_username", "$db_pass") or die("nepripojeno k databazi"); @mysql_select_db("$db_name") or die("Nespravna databaze, či tabulka!!"); $q = mysql_query("SELECT * FROM `prispevky` WHERE `obsah` IS NOT NULL ORDER BY `id`DESC") or die(mysql_error()); while ($r = mysql_fetch_array($q)) { echo "<div class='comentare'>"; echo "<p class='titulekb'>Title: " . $r['titulek'] . "</p>"; echo "<p class='autorb'>Author: " . $r['autor'] . "</p>"; echo "<p class='obsahb'>" . $r['obsah'] . "</p>"; echo "<p class='datumb'>Upload: " . $r['datum'] . "</p>"; echo "</div><br>"; } echo "<a href= ' . $_SERVER[PHP_SELF] . '?akce=smaz&id=' . $id . ' class='smazat' >Smazat</a>"; if (!empty($_GET['akce']) && $_GET['akce'] == 'smaz') { mysql_query("delete from tabulka where id=" . $_GET['id']); } ?> |
||
Amunak Profil |
Jestli je tohle celý soubor, tak tam nemůže být problém s tím, že je uživatel nepřihlášený, protože se po něm nikde žádné přihlášení nevyžaduje. Vypisuje ti to nějaké chybové hlášení? Povol si všechny chyby:
error_reporting(E_ALL); Pár bonusových chyb: - nepoužívej zavináče (@), opravdu nechceš potlačovat chybová hlášení - nepoužívej "$promenna" - uvozovky tam jsou zbytečné (a nežádoucí) - nepoužívej or die() ani mysql_error()
- kdokoliv, kdo se na takovouhle stránku dostane, ti může mazat cokoliv anebo i jinak poškodit databázi (SQL injection) marek888: „Já tomu kodu nějak takhle rozumím.“ A co tedy myslíš, že dělá? (Kontrola) přihlášení tam očividně není. |
||
marek888 Profil |
#5 · Zasláno: 22. 10. 2013, 19:06:01
Sory, já sem ti sem dal pouze kod mého výpisu. Ta stránka je primitivně zabezpečena. Už sem opravil ty chyby, nebo spíše zastaralý metody. Kod celé, jako opravdu celé:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> <html> <head> <link rel ="stylesheet" type ="text/css" href= "main.css"> <meta name="robots" content="noindex, nofollow"> </head> <body> <?php if ($_GET["heslo"] != "-heslo-"): ($_GET["jmeno"] != "jméno"); ($_GET["jmeno"] != "jméno"); ($_GET["jmeno"] != "jméno"); ($_GET["jmeno"] != "jméno"); ?> <!--přihlašovací formulář --> <form class="black"> Zadej své jméno: <input type="text" name="jmeno"><br><br> Zadej své heslo: <input type="password" name="heslo" ><br><br> <input value="Vkročit na stránku" type="submit"> </form> <? else: ?> <form name="myForm" action="pridat.php" method="POST"> <p class="black">Autor</p> <select name="autor"> <option value="Honza Havelka">Honza Havelka</option> <option value="Viki Kučerová">Viki kučerová</option> <option value="Lukaš Douběta">Lukaš Douběta</option> <option value="Pandora Fields">Pandora Fields</option> <option value="Programmer Marek Douběta ©">Programmer Marek Douběta ©</option> </select> <script language="javascript"> <!-- function CountChars(field,cntfield) { if (field.value.length >= 0) cntfield.value = field.value.length; } // --> </script> <p class="black">Titulek<br> <textarea name="titulek" onkeydown="CountChars(document.myForm.titulek,document.myForm.one)" onkeyup="CountChars(document.myForm.titulek,document.myForm.one)"></textarea> <input readonly="readonly" type="text" name="one" size="3" maxlength="3" value="0"> Počet znaků ze 30 </p><br><br> <script language="javascript"> <!-- function CountChars(field,cntfield) { if (field.value.length >= 0) cntfield.value = field.value.length; } // --> </script> <p class="black">Obsah<br> <textarea name="obsah" onkeydown="CountChars(document.myForm.obsah,document.myForm.two)" onkeyup="CountChars(document.myForm.obsah,document.myForm.two)"></textarea> <input readonly="readonly" type="text" name="two" size="3" maxlength="3" value="0"> Počet znaků z 1000 </p> <input type="submit" value="odelat"> </form> <?php if (isset($_POST['submit'])) { //Overi jestli je odeslano, jinak bz vzpsalo chybu $autor = $_POST['autor']; $titulek = $_POST['titulek']; $obsah = $_POST['obsah']; echo 'Autor: ' . $_POST['autor'] . '<br>Titulek: ' . $_POST['titulek'] . '<br>Obsah: ' . $_POST['obsah']; //Vypis } $db_host = ""; $db_username = ""; $db_pass = ""; $db_name = ""; mysql_connect($db_host, $db_username, $db_pass); mysql_select_db($db_name); $q = mysql_query("SELECT * FROM `prispevky` WHERE `obsah` IS NOT NULL ORDER BY `id`DESC"); while ($r = mysql_fetch_array($q)) { echo "<div class='comentare'>"; echo "<p class='titulekb'>Title: " . $r['titulek'] . "</p>"; echo "<p class='autorb'>Author: " . $r['autor'] . "</p>"; echo "<p class='obsahb'>" . $r['obsah'] . "</p>"; echo "<p class='datumb'>Upload: " . $r['datum'] . "</p>"; echo "</div><br>"; } echo "<a href= ' . $_SERVER[PHP_SELF] . '?akce=smaz&id=' . $id . ' class='smazat' >Smazat</a>"; if (!empty($_GET['akce']) && $_GET['akce'] == 'smaz') { mysql_query("delete from tabulka where id=" . $_GET['id']); } ?> <? endif ?> </body> </html> |
||
Tori Profil |
#6 · Zasláno: 22. 10. 2013, 19:11:17
marek888:
„když sem na něj klikl, tak mě odhlásil, a příspěvek nevymazal“ Příspěvek vymazat ani nemohl, když je čtete z tabulky prispevky a mažete z tabulky tabulka . Místo $_SERVER[PHP_SELF] má být $_SERVER['PHP_SELF'] .
Je v tom skriptu i session_start() ?
Jak vypadá kód, kterým se odhlašujete? Je v tom samém skriptu nebo ne? |
||
weroro Profil |
#7 · Zasláno: 22. 10. 2013, 19:35:45
marek888:
„Už sem opravil ty chyby, nebo spíše zastaralý metody.“ Stále je tam vidno min. mysql_query , takže nebolo opravené všetko.
|
||
marek888 Profil |
#8 · Zasláno: 22. 10. 2013, 19:58:40
když sem se pokusil udělat $_SERVER['PHP_SELF'] tak mi to začalo psát errory.
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /3w/xf.cz/p/pandorafields/prispevky.php on line 91 upravený kod: echo "<a href=' . $_SERVER['PHP_SELF'] . '?akce=smaz&id=' . $id . class='smazat' '>Smazat</a>"; |
||
Amunak Profil |
#9 · Zasláno: 22. 10. 2013, 20:00:01
marek888:
Oprav si apostrofy/uvozovky anebo escapuj. |
||
Tori Profil |
marek888:
Těch uvozovek okolo jsem si nevšimla, pardon. Takže takhle: echo '<a href="'.$_SERVER['PHP_SELF'].'?akce=smaz&id='.$id.'" class="smazat">Smazat</a>'; echo "<a href='{$_SERVER['PHP_SELF']}?akce=smaz&id=$id' class='smazat'>Smazat</a>"; |
||
marek888 Profil |
#11 · Zasláno: 23. 10. 2013, 12:04:19
Tori:
Script na odhlašování nepoužívám, používám jednoduché zaheslování stránky přes php Zaheslování stránek » Zaheslování serverovým skriptem . Myslím, že na takto lehkém zabezpečení nemusí být odhlášení. Díky za kod, už mě to pouze odhlásí, což je asi způsobeno tím, že nemám script na odhlášení, ale nejsem si jistý. |
||
Amunak Profil |
#12 · Zasláno: 23. 10. 2013, 13:22:32
marek888:
Tak to tě to potom odhlásí hned po opuštění stránky, protože se nikde neukládá informace o tom, že jsi přihlášený. Ten odkazovaný skript totiž funguje na tom principu, že jen server přijme nějaký tajný řetězec, a tak vypíše něco, co by jinak nevypsal. "odhlášený" jsi ve chvíli, kdy skript opustí větev if. Máš dvě možnosti: - upravit to tak, že budeš heslo zadávat znovu i při mazání - používat jinou autentifikaci - buď si nějakou persistentní napíšeš, anebo využiješ třeba apache, který umí podle autentifikace odlišovat, kam smíš vlézt. |
||
marek888 Profil |
#13 · Zasláno: 23. 10. 2013, 13:35:43
Díky, já bych spíše zvolil tu první možnost, akorát nevím, jak to udělat.
|
||
Časová prodleva: 11 let
|
0