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:"Mus\u00edte vyplnit ochranu proti spamu."}" 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
