Autor Zpráva
marek888
Profil
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
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
$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']);
        }
        ?>
Já tomu kodu nějak takhle rozumím.
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
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
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
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
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
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>';
Anebo takhle, jestli vám to připadá čitelnější:
echo "<a href='{$_SERVER['PHP_SELF']}?akce=smaz&id=$id' class='smazat'>Smazat</a>";
marek888
Profil
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
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
Díky, já bych spíše zvolil tu první možnost, akorát nevím, jak to udělat.

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: