Stránka 1 z 1

Kontrola formuláře PHP/JavaScript

Napsal: 28 kvě 2014 17:14
od Hajous
Zdravím,
potřebuji poradit s kontrolou formuláře. Mám vytvořenou databázi pomocí PHP která mi přidává nový údaj do tabulky. Potřebuji ale ještě před odesláním formuláře jeho kontrolu, aby se mi do tabulky nezapisovaly nevyplněné údaje. Ta kontrola má být provedena pomocí javascriptu. Lámu si s tím hlavu už delší dobu a stále nic..:-/

Re: Kontrola formuláře PHP/JavaScript

Napsal: 29 kvě 2014 13:49
od CZechBoY
Zdravím,
tak chceš kontrolu přes PHP nebo JS nebo kombinaci?

Kód: Vybrat vše


<script>
$(
"form").on('submit', function() {
  if ($(
this).find('input[name=jmeno]').val() == '') {
    $(
this).append('<div class="error">Nevyplněné jméno</div>');
    return 
false;
  }
});
</script>

Kód: Vybrat vše


<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  if (empty(
$_POST['jmeno'])) {
    echo 
'Chybí jméno';
  }
}
?>

Re: Kontrola formuláře PHP/JavaScript

Napsal: 30 kvě 2014 12:39
od Karel.helpik
od CZechBoY » Včera, 13:49
Zrovna něco podobného také hledám a řeším.

1) Jak to mám do formuláře prosím dát?
2) Prý existují nějaké funkce proti zneužití bezpečnosti a XSS. Něco jsem o tom četl a nechápu to. Každopádně v jedné své knize návštěv i přes kontrolní otázku už musím v .htaccessu blokovat IP adresy. Dost se spamy omezily, pořád to je průchozí. Poradíte prosím?

Děkuji moc.

Re: Kontrola formuláře PHP/JavaScript

Napsal: 30 kvě 2014 12:40
od CZechBoY
Hoďte tam captchu nebo jinou kontrolní otázku.

Re: Kontrola formuláře PHP/JavaScript

Napsal: 30 kvě 2014 16:00
od Karel.helpik
ad captcha:
- ta je z hlediska přívětivosti pro uživatele otravna a to i z hlediska UX
- na ten web chodí tak 200 lidí za týden, takže musí existovat jiné řešení. Až bude na web chodit 100 za den, možná capchu dám


ad jinou konktrolní otázku:
- už to, že jsem ji tam musel dát mě dost štvalo


Existuje jistě jiné řešení a myslel jsem, že ochrana inputů nějak půjde.

Nebo třeba udělat input, který bude uživatelům skrytý, ale pokud ho někdo vyplní, tak se vložení neprovede. To pad dát jako další opatření kontroli.

Děkuji za radu.

Re: Kontrola formuláře PHP/JavaScript

Napsal: 30 kvě 2014 23:37
od CZechBoY
Jo takovej trik existuje :D
v css dáš prvku display:none a do html vložíš

Kód: Vybrat vše

<input type="text" name="email" value="nevypl@nov.at">
a blbější bot to vyplní

Re: Kontrola formuláře PHP/JavaScript

Napsal: 04 čer 2014 13:16
od Karel.helpik
Jasné že blbější, ale mít systém podmínek pro kontrolu je asi dobrá volba - nebo ne?

"Jo takovej trik existuje"
- jak to kontrolovat (pomocí PHP)?

Re: Kontrola formuláře PHP/JavaScript

Napsal: 04 čer 2014 13:17
od CZechBoY

Kód: Vybrat vše

if ($_POST['email'] != 'nevypl@nov.at') {//bot}
 

Re: Kontrola formuláře PHP/JavaScript

Napsal: 05 čer 2014 17:13
od Karel.helpik
To vypadá rozumě.
"

Kód: Vybrat vše

if ($_POST['email'] != 'nevypl@nov.at') {//bot}

"

Tzn do mého příkladu

Kód: Vybrat vše

if ($mail != 'nevypl@nov.at') {
   //bot
   echo "<h3>Jestli si to vyplnil, jsi SPAM a nechi tě tu!</h3>";
   //mail("kam@domena.cz", "QB - Pokus o SPAM (domena.cz) - Skrytá pole", $telomailinfo, "FROM: domena");
   echo "<p><a href='guestbook.php'>GO BACK</a></p>";
   exit;
}


Je to tak?

Takto vypadá současné zpracování knihy návštěv. Asi to je balast. Budu rád buď o zjednodušení i a o lepší zabezpečení.

Mám tam něco špatně?

Je postup kontrol správně nebo dojde jen k jedné kontrole a teprve pokud projde, nastane odesílání do DB? Chtěl bych samozřejmě aby před každým odesláním formuláře do DB nastala kontrola postupně přes všechny vypsané (nebo Vámi navrhnuté) kontroly.

Možná by to chtělo nějak tu kontrolu zjednodušit do jedné velké funkce, aby se to zpřehlednilo.

Kód: Vybrat vše

        <?php
        if (IsSet($_POST['domenovy_coockies'])) {
            $nick = htmlspecialchars($_POST['nick']);
            $web = htmlspecialchars($_POST['web']);
            $mail = htmlspecialchars($_POST['mail']);
            @setcookie("domena_cookies", $nick . "#" . $web . "#" . $mail . "#", time() + 31536000);
            $telomailinfo = "Od: $_POST[nick]";
            $telomailinfo .= " \nmesage: $_POST[textstary]";
            $telomailinfo .= " \ne-mail: $_POST[mail]";
            $telomailinfo .= " \nzadaný web: $_POST[web]";
            $telomailinfo .= " \n\nJeho ip: $_SERVER[REMOTE_ADDR]";
        }
        require "mysqlDB.php";
        if (IsSet($_POST['sent'])) {
            $adresa = $_POST['adresa'];
            $nick = htmlspecialchars($_POST['nick']);
            $mail = htmlspecialchars($_POST['mail']);
            $web = htmlspecialchars($_POST['web']);
            $textstary = $_POST['textstary'];
            $text = htmlspecialchars($textstary);
            $ip = $_SERVER["REMOTE_ADDR"];
            $ip_cele = gethostbyaddr($_SERVER['REMOTE_ADDR']);
           
            /************************************************************************
            ***** kontroluji SPAMY *****
            ************************************************************************/

            /************************************
            ***** 1) IP kontrola nemá cenu. Je hodně zavirovaných PC odesílanících SPAM
            ************************************/
            if ($ip == "0.0.0.0" || $ip == "0.0.0.1" || $ip == "0.0.0.2" || $ip == "60.190.240.76") {
                echo "<h3>Máš BAN, nemůžeš nic psát. Požádej mě ať Tě smažu z banlistu.</h3>";
                //mail("kam@domena.cz", "QB - BAN (domena.cz)", $telomailinfo, "FROM: domena");
                echo "<p><a href='guestbook.php'>GO BACK</a></p>";
                exit;
            }

            if ($web != "") {
                if (substr($web, 0, 7) == "http://") {
                    $web = $web;
                } else {
                    $web = "http://" . $web;
                }
            }
           
            /************************************
            ***** 2) Uvedení už identifikované email SPAM adresy skoro nemá cenu. SPAM emailů je na netu mraky.
            *************************************/
            if ($mail == "utillintaps@xpasop3free.in") {
                echo "<h3>Jsi SPAM a máš BAN - nemůžeš nic psát. Požádej mě ať Tě smažu z banlistu.</h3>";
                mail("kam@domena.cz", "QB - Spam - definován a zachycen (domena.cz)", $telomailinfo, "FROM: domena");
                echo "<p><a href='guestbook.php'>GO BACK</a></p>";
                exit;
            }

            /************************************
            ***** 3) Pokud je v postu více jak 3 adres (mající http://), informuj ho o tom. Pravděpodobně SPAM.
            *************************************/
            if (substr_count($textstary, "http://") > 3) {
                echo "<script language=\"javascript\" type=\"text/javascript\">alert(\"SPAM?  nezadavej vice jak tri uplne adresy do textu, takove zpravy mazu jako spam... \");</script>";
                echo "<p>Okopíruj si tento text (CTRL+C) a vložíš ho (CTRL+V) se správným kontrolním číslem a pouprav nebo rozděl text</p>";
                echo "<p><strong>Napsal jsi:</strong></p>";
                echo "<p>" . $_POST['textstary'] . "</p>";
                //mail("kam@domena.cz", "QB - SPAM - Více než 3x odkaz (domena.cz)", $telomailinfo, "FROM: domena");
                echo "<p><a href='guestbook.php'>GO BACK</a></p>";
                exit;
            }

            /************************************
            ***** 4) Kontrolní otázka. Nerad, ale musel jsem ji tam dát. Zachytí toho hodně.
            ***** Po cca roce SPAMy prochází docela hodně :( .
            ***** Prý to jde skrýt a nenutit běžné uživatele vyplňovat. Pokud to skrýt půjde může se:
            ***** a/ odpověď měnit nějakým skriptem
            ***** b/ češtinu prý boti neumí => odpověď: "žluty", "hustědémonskykrutopřísný" :D
            ***** c/ muže se odpověď kontrolovat nejen na správný řetězec, ale i na počet znaků i na typ (číslo = int)
            *************************************/
            if ($_POST['check'] != 5) {
                echo "<html><head><link rel='stylesheet' type='text/css' href='styl.css' /><title>Smazání příspěvku</title></head>
      <div class='okraj'><p><strong>Neodpověděl jsi správně na kontrolní otázku<br>(kontrola proti SPAMU) !</strong></p>";
                echo "<p>Okopíruj si tento text (CTRL+C) a vložíš ho (CTRL+V) s již správným kontrolním číslem</p>";
                echo "<p><strong>Napsal jsi:</strong></p>";
                echo "<p>" . $_POST['textstary'] . "</p>";
                //mail("kam@domena.cz", "QB - Kom. BEZ k.o. (domena.cz)", $telomailinfo, "FROM: domena");
                echo "<p><a href='guestbook.php'>GO BACK</a></p></div></head></html>";
                exit;
            }


            /*   $text= htmlspecialchars(wordwrap($textstary, 68, "\n", 1));     Toto místo 51.řádku (kvůli nedoděl.gravatarum) */

            if ($nick == "" || $textstary == "") {
                echo "<script language=\"javascript\" type=\"text/javascript\">alert(\"nebyly vyplněny všechny POVINNÉ údaje\");</script>";
                //mail("kam@domena.cz", "QB - Nebyly vyplněny všechny povinné údaje (domena.cz)", $telomailinfo, "FROM: domena");
            } else {
                $query = MySQL_Query("INSERT INTO domena_guestbook VALUES ('', '$nick', '$web', '$mail', '$text', now(), 'obr', '$ip', '$ip_cele')");
                if ($query) {
                    mail("kam@domena.cz", "QB - NEW komentář (domena.cz)", $telomailinfo, "FROM: domena");
                }
                else
                    mail("kam@domena.cz", "QB - DB (nepodařilo se vložit data) (domena.cz)", $telomailinfo, "FROM: domena");
                @header("Location: guestbook.php");
                exit;
            }
        } // konec sent
        echo "<a href='guestbook.php'>GO BACK</a>";
        ?>


Moc všem diskutujícím děkuji.

--- Doplnění předchozího příspěvku (05 Čer 2014 17:14) ---

Nevím proč se kod neobarvil. Bylo by to přehlednější.

--- Doplnění předchozího příspěvku (05 Čer 2014 17:42) ---

Něco jsem našel na to skrytou odpověď. Moc tomu ale také nerozumím. Jak to implementovat?

Kód: Vybrat vše

<noscript>
   <div class="row">
      <p><label class="required" for="frmcontactForm-spam">Pro ochranu proti spamu napište do pole číslo ~ 6590 ~</label><br /><input type="text" class="w-full text" name="spam" id="frmcontactForm-spam" required="required" data-nette-rules="{op:':filled',msg:&quot;Mus\u00edte vyplnit ochranu proti spamu.&quot;}" value="" />
      </p>
   </div>
</noscript>
<script type="text/javascript">
<!--
   document.write('<input type="hidden" name="spam" value="' + 6590 + '" \/>');
-->
</script>


Asi to funguje tak, že když je vypnutý JS, tak se zobrazí již naformátovaný odstavec s textem informujícím o pravděpodobně nějak vygenerovaném čísle 6590.
Pokud vypnutý JS není, je vložen schovaný input se shodnou hodnotou 6590.

Pravděpodobně se tedy musí po každém odeslání formu a před odesláním do DB nebo emailem i kontrolovat:
- zda je odeslán "input" s jménem "spam" a hodotou "6590".

Jak to udělat opět nevím, ale věřím, že když to sem píšu a já si dal práci s tím, jak SPAM filtrovat, tak že nějaký programátor dříve i později napíše konktrétnější řešení :) . Já mu každopádně poděkuji a pokud bude mít nastavou notivfikaci, přijde mu na email :thumbup: