Autor Zpráva
akali
Profil *
Ahoj, měl bych dotaz ohledně smapů na fóru. Tady je kód

if (isset($_POST['odeslano']))
{
    if (empty($_POST['jmeno']) || empty($_POST['text']) || ($_POST['spam']!='5'))
    {   

        echo "<div id=\"neodeslano\">
        <table align=left>
        <tr><td>Vaše zpráva nebyla odeslána! Jedno z políček</td></tr>
        <tr><td> má prázdnou, nebo nesprávnou hodnotu!</td></tr>
        </table></div>";
    }
    else 

----- pokračování php kódu----

a pak mám tři políčka v html

<input name="jmeno" size="10"><br>
<input name="text" size="10"><br>
<input name="spam" size="10"><br>


Myslel jsem, že takto zabráním spamům, když napíšu před input "spam" příklad 10-5 a nevyplní se 5 tak se to neodešle, ale omyl je pravdou, spamů je víc a víc. Pomohl by mi někdo vyřešit tuto situaci? Popřípadě jak se to dělá v dnešní době?
Radovan789
Profil *
Já například předpokládám že internetoví bot nemá zaplé Cookies a většina uživatelů zaplé cookies má.
akali
Profil *
To si mi poradil. Nevím z toho hlavu ani patu.
Radovan789
Profil *
Takže:
vytvořím si 2 proměné s (int) od 1 do 10
a pak třeba můžu zapsat do dokumentu.
<?php
$promena1 = mt_rand(1,10);
$promena2 = mt_rand(1,10);

$cookie = md5(md5($promena1+$promena2)."tajná sůl");

setcookie("cookie",$cookie);
?>

<script type="text/javascript">
document.write(["<?=$promena1?>", "<?=$promena2?>"].join(" + "));
</script>

<input type="text" name="email">


Doporučuji použít name=email protože boti tam začnou cpát emaily.

A když se to postne tak:
if ($_COOKIE["cookie"] == md5(md5(POST["email"])."tajná sůl")) {
echo "vse ok";
}
Bubák
Profil
akali:
Pro jistotu se zeptám, jde o spam od spambotů, a ne od lidí, spamerů?

Zdejší antispam používá něco podobného, hodnotu vyplňuje JavaScript. Kdo má JS vypnutý, musí hodnotu vyplnit ručně. Dříve bylo číslo jednomístné, pak se nějaký spam od spambotů začal objevovat, nyní je číslo dvoumístné a spam od spambotů se neobjevuje.
Radovan789
Profil *
Bubák:
Co myslíš tím Zdejší antispam ?
akali
Profil *
Je to rozhodně od spam botů. Přes noc jich přibyde zhruba 25

S cookies jsem na webu ještě nikdy nepracoval a ten návod od Radovana nějak nechápu. Spíš ani nevím jak to do mýho kódu zapracovat.
Radovan789
Profil *
Tak sem pošli celý tvůj kód a já ti to tam přidám.
akali
Profil *
Možná se tohoto kódu zděsíš, ale nejsem na tom se znalostmi tak jak Vy, bohužel :(

<?php

if (isset($_POST['odeslano']))
{
if (empty($_POST['jmeno']) || empty($_POST['text']) || ($_POST['spam']!='5'))
{

echo "<div id=\"neodeslano\">
<table align=left>
<tr><td>Vaše zpráva nebyla odeslána! Jedno z políček</td></tr>
<tr><td> má prázdnou, nebo nesprávnou hodnotu!</td></tr>
</table></div>";


}
else
{
$ref = $REMOTE_ADDR;
$datum = StrFTime("%d/%m/%Y %H:%M:%S", Time());

// Připojení k databázi.
include '../db.php';

// Správné nastavení češtiny.
$objekt_vysledku = mysqli_query($db_spojeni, "SET NAMES 'UTF8'");

// Vytvoření SQL příkazu typu INSERT.
$sql_prikaz =
"INSERT INTO muzi(jmeno, datum, ip_adresa, text) "
."VALUES('"
.mysqli_real_escape_string($db_spojeni,$_POST['jmeno'])
."','"
.mysqli_real_escape_string($db_spojeni,$datum)
."','"
.mysqli_real_escape_string($db_spojeni,$ref)
."','"
.mysqli_real_escape_string($db_spojeni,$_POST['text'])
."')"
;

// Zaslání SQL příkazu do databáze.
$objekt_vysledku = mysqli_query($db_spojeni, $sql_prikaz);

header("Location: forum.php?odeslano");

}
}
?>

<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../style.css">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta name="author" content="; kittlerpeta@centrum.cz: ">
<meta name="description" content="Velký Beranov - fotbal, muži (fórum)">
<link rel="shortcut icon" href="../images/favicon.jpg">
<title>Velký Beranov - fotbal</title>
</head>

<?php

include '../db.php';

$objekt_vysledku = mysqli_query($db_spojeni, "SET NAMES 'UTF8'");

$objekt_vysledku = mysqli_query($db_spojeni,
'SELECT * FROM ip_ban');

while ($radek = mysqli_fetch_array($objekt_vysledku))
{
$ban[] = $radek['ip_adresa'];
}

mysqli_free_result($objekt_vysledku);

if ($db_spojeni)
mysqli_close($db_spojeni);


$ip = $_SERVER['REMOTE_ADDR'];
if(in_array($ip, $ban)){
include ("ban.php");
}
else
{
?>



<body>
<div id="main">
<div id="head">
<img alt='' src="../images/hlavicka_vb_c.jpg" onmouseover="this.src = '../images/hlavicka_vb_b.jpg'" onmouseout="this.src = '../images/hlavicka_vb_c.jpg'">


</div>


<div style="padding: 0 0 0 0;">

<div id="levy_menu">
<div id="menu">
<ul class="glossymenu">
<li><a href="../home_novinky.php">Home</a></li>
<li><a href="../kontakt.php">Kontakt</a></li>
<li><a href="../ml_zaci/ml_zaci.php">Mladší žáci</a></li>
<li><a href="../st_zaci/st_zaci.php">Starší žáci</a></li>
<li><a href="../dorost/dorost.php" >Dorost</a></li>
<li><a href="../muzi/muzi.php" class="trida">Muži</a></li>
</ul>
</div>
<div style="position: absolute; left: 20px; top: 400px;"><img src="images/muzi_vlevo.jpg" alt=''> </div>
<div style="position: absolute; z-index : 2; padding: 200px 0px 5px 250px;"><img src="images/mic.jpg" alt=''> </div>
</div>


<div style="float: left; width: 447px; background-image: url(../images/pozadi_menu.jpg); background-repeat: repeat-x;">
<div style="width: 355px; min-height:550px; position: relative; left: 45px; top: 20px;">
<div style="max-width:355px; height: 15px; background-color: #98B22F; text-align: right; line-height: 0.8;">
<table>
<tr>
<td style="width: 110px;"></td>
<td style="width: 50px;"><a href="forum.php">Fórum</a></td>
<td style="width: 78px;"><a href="galerie/index.php">Fotogalerie</a></td>
<td style="width: 52px;"><a href="http://nv.fotbal.cz/domaci-souteze/kao/vysocina/jihlava/souteze.asp?soutez=612A1A">Tabulka</a></td>
<td style="width: 50px;"><a href="hraci.php">Hráči</a></td>
</tr>
</table>
</div>
<div style="position: relative; top: 10px; width=355px;">


<form name="odeslano" action="#" method="post">
<b><font color="#808080">-Jméno:</font></b><br>
<input name="jmeno" size="10"><br>
<b><font color="#808080">-Zpráva:</font></b><br>
<textarea name="text" onKeyPress="maxpocet(this,400)" onKeyUp="maxpocet(this,400)" rows="3" cols="30" id="policko">
</textarea><br>
<b><font color="#808080">-Spam</b> (napiš číslicí)</font><br>
<b><font color="#808080">10 - 5 =</font></b><input name="spam" size="2"><br> <br>
<input type="submit" name="odeslano" value="Odeslat zprávu">
</form>

<div id="infobox" style="visibility:hidden; position:absolute; top: 1px; left: 135px; color:white; font-size:11px;">
Text ve zprávě je omezen na 400 znaků<br>
Zbývá <b><span id="zbyva"></span></b> znaků<br>
Nyní je napsáno <b><span id="napsano"></span></b> znaků
</div>

<script type="text/javascript" src="../script.js"></script>

<div id="ip_adresa">
Při zaslání příspěvku do tohoto fóra, je zapisována Vaše ip-adresa, chovejte se proto tak, jak máte. Vyjadřujte se slušně
</div>

<?php
if(isset($_GET["odeslano"]))
echo "<div id=\"odeslano\"><img src=../images/ok.png height=20px width=20px><span style=\"vertical-align: top\">Vaše zpráva byla úspěšně odeslána</span></div>";
?>
<hr>




<?php
/********Vypis****************************************************************************************************/
// Připojení k databázi.
include '../db.php';

// Správné nastavení češtiny.
$objekt_vysledku = mysqli_query($db_spojeni,"SET NAMES 'UTF8'");

// zjištění počtu řádků v tabulce:
$radku=MySQLi_Fetch_Row(MySQLi_Query($db_spojeni,"SELECT COUNT(0) FROM muzi"));$radku=$radku[0]/20;

// Zaslání SQL příkazu do databáze.
$strana=IntVal($_GET['strana']); //číselná hodnota ?strana=
$strana=$strana*20;
$objekt_vysledku = mysqli_query($db_spojeni,"SELECT * FROM muzi ORDER BY id DESC LIMIT $strana,20");


Echo '<div style="background-color: #2C292A; text-align: center; color: white; ">';
Echo 'Strana: ';
For($i = 0; $i < $radku; $i++) Echo '<a href="'.$_SERVER["SCRIPT_NAME"].'?strana='.Floor($i).'">'.Floor($i + 1).'</a>'.($i + 1 < $radku ? ', ' : '');
Echo '</div><br>';


// Zobrazení všech vrácených dat.
while ($radek = mysqli_fetch_array($objekt_vysledku))
{
echo '<font color="white"><b>',$radek['jmeno'],'</b><br>';
echo '',$radek['datum'],'<br>';
echo '',$radek['text'],'<br></font>';
echo '<br>';
}

// Zavření objektu výsledku, protože už ho nebudeme používat.
mysqli_free_result($objekt_vysledku);

// Odpojení od databáze.
if ($db_spojeni)
mysqli_close($db_spojeni);

Echo '<div style="background-color: #2C292A; text-align: center; color: white; ">';
Echo 'Strana: ';
For($i = 0; $i < $radku; $i++) Echo '<a href="'.$_SERVER["SCRIPT_NAME"].'?strana='.Floor($i).'">'.Floor($i + 1).'</a>'.($i + 1 < $radku ? ', ' : '');
Echo '</div>';
?>


</div>
</div>
</div>

<div id="pravy_
akali
Profil *
Dokončení kódu, jinak nevím, proč to na každým novým řádku udělalo mezeru

<div id="pravy_menu">
  <div id="pravy_obr">
  <script type="text/javascript">
            var obrazky = new Array("images/vb-jamne.jpg", "images/hriste.jpg", "images/kabiny.jpg");
            document.write("<img src='"+obrazky[Math.round(Math.random()*(obrazky.length-1))]+"'>");
            document.write("<img src='"+obrazky[Math.round(Math.random()*(obrazky.length-1))]+"'>");
            document.write("<img src='"+obrazky[Math.round(Math.random()*(obrazky.length-1))]+"'>");
  </script>  
   </div>
  <div style="position: relative; top: 157px;"><img src="../images/prava_sil.jpg" alt=''></div>
</div>
</div>

<br class="cleaner"> <br>
<?php
include '../footer.php';
?>
 
</div>
</body>
<?
}
?> 
</html>
Radovan789
Profil *
No tak bych to viděl nějak takhle, doufám že to pochopíš:
if (isset($_POST['odeslano']))
{
    if (empty($_POST['jmeno']) || empty($_POST['text']) || $_COOKIE["cookie"] != md5(md5(POST["email"])."tajná sůl"))
    {   

        echo "<div id=\"neodeslano\">
        <table align=left>
        <tr><td>Vaše zpráva nebyla odeslána! Jedno z políček</td></tr>
        <tr><td> má prázdnou, nebo nesprávnou hodnotu!</td></tr>
        </table></div>";
    }
    else 

----- pokračování php kódu----

a pak mám tři políčka v html

<input name="jmeno" size="10"><br>
<input name="text" size="10"><br>
<?php
$promena1 = mt_rand(1,10);
$promena2 = mt_rand(1,10);

$cookie = md5(md5($promena1+$promena2)."tajná sůl");

setcookie("cookie",$cookie);
?>

Kolik je 
<script type="text/javascript">
document.write(["<?=$promena1?>", "<?=$promena2?>"].join(" + "));
</script>
?
<input name="email" size="10"><br>
Radovan789
Profil *
Mám chybu na řádku 3:

Má tam být:

3... if (empty($_POST['jmeno']) || empty($_POST['text']) || $_COOKIE["cookie"] != md5(md5($_POST["email"])."tajná sůl"))
4... {
akali
Profil *
Jak jste se v tom vyznal? :-)
Ještě mi to hlásí chybku na tomto řádku

if (empty($_POST['jmeno']) || empty($_POST['text']) || $_COOKIE["cookie"] != md5(md5(POST["email"])."tajná sůl"))


Parse error: syntax error, unexpected '[' in /home/www/velkyberanov-fotbal.cz/subdomeny/www/muzi/forum.php on line 4
Bubák
Profil
Radovan789:
Co myslíš tím Zdejší antispam ?
Antispam použitý v této Diskusi. Kdo si ho chce užít, musí si vypnout JavaScript.
Na serveru se v PHP zkontroluje odeslaná hodnota, ale s tím akali nemá problém.
akali
Profil *
Omlouvám se, nevšimnul jsme si Vaší zprávy. Ještě to hlásí chybu zde


setcookie("cookie",$cookie);
?>

Warning: Cannot modify header information - headers already sent by (output started at /home/www/velkyberanov-fotbal.cz/subdomeny/www/muzi/forum.php:11) in /home/www/velkyberanov-fotbal.cz/subdomeny/www/muzi/forum.php on line 142
Radovan789
Profil *
Bubák:
Zdejší antispam používá něco podobného, hodnotu vyplňuje JavaScript. Kdo má JS vypnutý, musí hodnotu vyplnit ručně. Dříve bylo číslo jednomístné, pak se nějaký spam od spambotů začal objevovat, nyní je číslo dvoumístné a spam od spambotů se neobjevuje.

Zřejmě si ten můj anti-spam nepochopil, uživatel musí mít zaplý JS i Cookies ale za nikoho nic nevyplňuje.

akali:
Vyzkoušej tu opravu co jsem napsal a napiš jestli jede.
Radovan789
Profil *
akali:
No tak to budete muset dát celého soboru:
<?php
ob_start();
?>


a uplně nakonec celého souboru:
<?php
ob_end_flush();
?>
Radovan789
Profil *
<?php
ob_start();
?>


Na začátek souboru.

<?php
ob_end_flush();
?>


Na konec souboru.

Omlouvám se za překlep
akali
Profil *
Výborně. Nyní to funguje tak, jak má
Snad jen bych byl rád, kdyby jste měl ještě chviličku času a vysvětlil mi tyto dva řádky
$cookie = md5(md5($promena1+$promena2)."tajná sůl");
a
setcookie("cookie",$cookie);
Radovan789
Profil *
$cookie = md5(md5($promena1+$promena2)."tajná sůl");

Uděláme si hash (otisk) viz http://cs.wikipedia.org/wiki/MD5 kvuli znepřístupnění hodnoty spam bota.

příklad:
echo md5("ahoj");

vypíše: 79c2b46ce2594ecbcb5b73e928345492

Tím pádem když třeba zašifrujeme čísla 5+10 tak útočník je nikdy nezjistí.

A slovo tajná sůl je jenom takoví přestředek k zabezpečení (viz wikipedie). Takže slovo "tajná sůl" doporučuji změnit na nějaký nesmysl a pak to stejné slovo dát i do podmínky.

setcookie("cookie",$cookie);
Vytvoří u klienta cookie s názvem cookie a hodnotou $cookie (zašifrovaná informace).

viz: http://cs.wikipedia.org/wiki/Cookie


Nejsem moc dobrý na vysvětlování.

Ale zítra napište jestli tenhle anti-spam funguje :-)
akali
Profil *
možná to nechápu, ale ty slova mám přepsat takto? + přidat do podmínky

$cookie = md5(md5($promena1+$promena2)."nesmyslná slova");
setcookie("nesmyslná slova",$cookie);
Bubák
Profil
Radovan789:
Zřejmě si ten můj anti-spam nepochopil, uživatel musí mít zaplý JS i Cookies ale za nikoho nic nevyplňuje.
Pochopil, já popsal antispam Diskuse Jak psát web, přes který spam neprochází, a nepotřebuje cookies.
Radovan789
Profil *
akali:
Ne... podmínka je IF
takže:

$cookie = md5(md5($promena1+$promena2)."nesmyslná slova");
+
if (empty($_POST['jmeno']) || empty($_POST['text']) || $_COOKIE["cookie"] != md5(md5($_POST["email"])."nesmyslná slova"))
akali
Profil *
Díky za ochotu, vysvětlení a hlavně kvalitní filtr. Dnes jsem na fóru, kam jsem filtr aplikoval nenašel jediný spam, na ostatních bohužel ano. Takže to aplikuji na ostatní. Díky mockrát!

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:

0