Kontrola formuláře PHP/JavaScript

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Hajous
nováček
Příspěvky: 1
Registrován: květen 14
Pohlaví: Žena
Stav:
Offline

Kontrola formuláře PHP/JavaScript

Příspěvekod Hajous » 28 kvě 2014 17:14

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..:-/

Reklama
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Kontrola formuláře PHP/JavaScript

Příspěvekod CZechBoY » 29 kvě 2014 13:49

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';
  }
}
?>
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Karel.helpik
nováček
Příspěvky: 4
Registrován: květen 14
Pohlaví: Muž
Stav:
Offline

Re: Kontrola formuláře PHP/JavaScript

Příspěvekod Karel.helpik » 30 kvě 2014 12:39

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.

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Kontrola formuláře PHP/JavaScript

Příspěvekod CZechBoY » 30 kvě 2014 12:40

Hoďte tam captchu nebo jinou kontrolní otázku.
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Karel.helpik
nováček
Příspěvky: 4
Registrován: květen 14
Pohlaví: Muž
Stav:
Offline

Re: Kontrola formuláře PHP/JavaScript

Příspěvekod Karel.helpik » 30 kvě 2014 16:00

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.

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Kontrola formuláře PHP/JavaScript

Příspěvekod CZechBoY » 30 kvě 2014 23:37

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í
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Karel.helpik
nováček
Příspěvky: 4
Registrován: květen 14
Pohlaví: Muž
Stav:
Offline

Re: Kontrola formuláře PHP/JavaScript

Příspěvekod Karel.helpik » 04 čer 2014 13:16

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)?

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Kontrola formuláře PHP/JavaScript

Příspěvekod CZechBoY » 04 čer 2014 13:17

Kód: Vybrat vše

if ($_POST['email'] != 'nevypl@nov.at') {//bot}
 
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Karel.helpik
nováček
Příspěvky: 4
Registrován: květen 14
Pohlaví: Muž
Stav:
Offline

Re: Kontrola formuláře PHP/JavaScript

Příspěvekod Karel.helpik » 05 čer 2014 17:13

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:


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host