Autor Zpráva
bar
Profil
Dobré ráno,
mám problémy se spamem, který je rozesílán z mého skriptu pomocí fce mail. Dá se to vůbec nějakým způsobem 100% zabezpečit, aby k tomuto nedocházelo, případně co bych mohla ošetřit??
Skript
<?php
function JeEmail ($cislo)
{
return ereg("^.+@.+\..+$",$cislo);
}
if (!empty($_POST)) // kontolovat na mail
{
if (!JeEmail($_POST["email"])) // kontrolou neprošla
{ if ($jazyk=="pl") // testování jazyk. verze
Header("Location: http://www.xx-as.cz/kontakty.php?a=podaliście błędny e-mail");
else
{if ($jazyk=="en")
Header("Location: http://www.xx-as.cz/contact.php?a=please try again, incorrect e-mail");
else
Header("Location: http://www.perex-as.cz/kontakt.php?a=zadali jste chybný e-mail");
}}
else
{
// kontolou OK
$email=$_POST["email"]; //mail odesilatele - z formuláře
$zprava=$_POST["zprava"];
$jmeno=$_POST["jmeno"];
$zprava = iconv("CP1250","ISO-8859-2",$zprava);
$jmeno = iconv("CP1250","ISO-8859-2",$jmeno);
$jazyk=$_POST['jazyk'];
$headers.= "Content-Type: text/html; charset=ISO-8859-2\r\n";
if(Mail("xx@xx-as.cz","dotaz z www-xx","jméno odesilatele:$jmeno\n\n$zprava","From:".$email."\r\n".$header));
{ if ($jazyk=="pl")
Header("Location: http://www.perex-as.cz/kontakty.php?b=Dziękujemy za Państwa zainteresowanie, z przyjemnością odpowiemy na otrzymane e-maile.");
else
{if ($jazyk=="en")
Header("Location: http://www.xx-as.cz/contact.php?a=thank you for your e-mail");
else Header("Location: http://www.xx-as.cz/kontakt.php?b=Děkujeme za Vaši zprávu, pokud jste uvedl svůj e-mail, brzy odpovíme.");
}}
}
}
?>

Jediné, co mě napadá je použití wordwrap u proměnné $email, kterou tahám z formuláře (mail odesilatele) a její oříznutí.

Za každou radu moc děkuji!!!
bar
Profil
Trochu jsem to pořešila a byla bych ráda, pokud má k tomu někdo zkušenější připomínky, aby je napsal. V podstatě jsem ořízla proměnnou email získanou z formuláře pouze na jednu e-mail adresu, kterou pak předávám do fce mail jako odesilatele (from)

vypisuju pouze část skriptu:

$email=$_POST["email"];
if(strpos($email,',')!= false)
{ $konec=strpos($email,',');
$email= substr($email,0,$konec);
}
$zprava=$_POST["zprava"];
$jmeno=$_POST["jmeno"];
ernesto
Profil *
sory, ale nepochopil sem přesně tvuj problém, nicméně mam pro tebe jinou radu a to ohledně několika jazykových verzí, my používáme tohle: mam x skriptů pro x jazykovejch verzí a v každým si definuju konstanty - nějak takhle:
skript ./cz/res.php
<?php
define('BAD_EMAIL','zadali jste chybný e-mail');
?>

skript ./pl/res.php
<?php
define('BAD_EMAIL','podaliście błędny e-mail');
?>

skript ./en/res.php
<?php
define('BAD_EMAIL','please try again, incorrect e-mail');
?>

potom podle toho jakou jazykovou verzi uživatel použije se naincluduje příslušnej soubor a zbavíš se tim těch odpornejch ifů (jestli máš ten web udělanej takhle ůplně všude, tak to musí bejt děsnej bastl), jedeš prostě jenom tohle:

if (!JeEmail($_POST["email"])) // kontrolou neprošla
Header("Location: http://www.xx-as.cz/kontakty.php?a=".BAD_EMAIL);
else {[kód pro odeslání mailu]}

pochybuju, že by se ti to chtělo teď přepisovat, ale snad pro příště

pokud líp popíšeš původní problém, tak bych moh bejt nápomocnej i tam - nějak mi uchází kdo koho potom spamuje, když je tam příjemce napsanej natvrdo
bar
Profil
ernesto
díky, použiju, jsem spíš amatér a tohle dělám jako hobby, takže jsem ráda, že se můžu něčemu přiučit :).
Spam se mně dostal do skriptu, který zpracovává data z kontaktního formuláře. Ve formuláři mám jeden input, do kterého se zadává email odesilatele. Přes tento input se nějaký hnusný robot dostal do skriptu pro zpracování formuláře, který pak odesílám pomocí fci mail. Výsledkem bylo odeslání šíleného množství mailů, což na hostingu nevidí samozřejmě rádi. Data získané z formuláře vypadala přibližně takto:

To: marketing@xx-as.cz
Subject: dotaz z www
From:affect
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain
Subject: Re: Hi
bcc: bschmidt@westside.com,carolyn3@ptd.net,drouse@blackplanet.com,
ian@liontrax.com,spurvis@whbcjackson.org,christieo@mail.com,
ericangel22@wmconnect.com,jovo@verizon.net,
babypinkangel_2000@pigletmail.com,patricklenzi@sbcglobal.net, atd

Chtěla jsem to vyřešit tak, že si otestuju počat e-mail adres, který dostávám z formuláře a pak pustím jen první a ostatní oříznu. Toto řešení ale patrně není úplně nejlepší. Lepší by bylo využít fci, kterou testuju získanou e-mail adresu:

function JeEmail ($cislo)
{
return ereg("^.+@.+\..+$",$cislo);
}

Chtěla bych trochu upravit regularní výraz, ve kterém budou povolené znaky, přibližně tak:
function JeEmail ($cislo)
{
return ereg ("[a-zA-Z0-9_\.\-]{1,64}@[a-zA-Z0-9\.\-]+'",$cislo);
}

Za jakoukoliv radu díky!!!
ernesto
Profil *
no mě se to moc nezdá, nějak mi nedocvakává, jak by se z toho políčka dostaly všechny ty maily do bcc a taky jak by to mohlo znásilnit subject. určitě se to odesílalo z mailserveru toho hostera? fakt mi to příde divný, nejlepší by bylo si tyhle $_POSTy někam od teď logovat aby bylo vidět co to tam vlastně přišlo, kdyby se tohle o čem referuješ stalo znova.
z dostupnejch informací usuzuju, že to tenhle skript nezpůsobil. datům co sou v mailu se nedá nikdy věřit, pro demonstraci ti můžu klidně poslat maila kterej se bude tvářit, že ho poslal třeba stallman.
bar
Profil
ernesto
Já z toho už vůbec nejsem chytrá, dívala jsem se jen na článek od J.Vrány. který popisuje možné problémy s fcí mail, asi se stalo něco podobného. Původně jsem si myslela, že pokud mám ve fci mail přímo natvrdo napsaného příjemce mailu (není vkládán uživatelem do formuláře přes input a následně pomocí POST vytahován do proměnné a zpracováván), tak by se toto, co se stalo, nemělo stát, no stalo se. Teď to budu muset ošetřit a asi to udělám právě přes fci JeEmail, pomocí které budu testovat povolené znaky. Mimochodem stránky mám na Českém hostingu.
ernesto
Profil *
hmmm, tak to sem netušil, maily sou fakt zrádný, je to přesně tak jak si nastínila, takže určitě použij ten regulár, ta druhá verze vypadá líp, ta první připouští i mezeru a vzhledem ke žravosti regulárních výrazů by prošel prakticky jakejkoliv vstup. pokud chceš bejt úplně precizní, tak zkus vygooglit nějakej regulár na mail podle RFC nebo jak se ten úřad menuje. taky rozhodně doporučuju nějakou třídu na posílání mailů, některá by ty reguláry mohla mít i v sobě a popřípadě by mohla sama hodit chybu při vložení špatnejch dat - to už bude v manuálu. nějaký odkazy sou i pod tim článkem.
good luck
ernesto
Profil *
jo a sory že sem nepřihodil jak by měl ten regulár vypadat, ale podle mě je lepší použít hotový precizní řešení než bastlit něco sám - šetří to čas a nervy. a google umí používat i moje matka :) (ne ... kecam, používá seznam:)
bar
Profil
Vracím se k původnímu tématu, protože mám s formulářem a fcí mail další problém. Ten první jsem vyřešila a fci je mail upravila následujícím reg. výrazem:

function JeEmail ($cislo)
{
return ereg('^[a-zA-Z0-9_-.]+@[a-zA-Z0-9.-]+.[a-zA-Z0-9_-.]+$',$cislo) ;
}

Pak jsem ale zjistila, že někdo zneužívá přímo skript, kterým zpracovávám údaje z formuláře a odesílám pomocí fce mail. Probíhá to tak, že odněkud z cizích stránek míří odkaz přímo na skript, který zpracovává a odesílám data. Jakým způsobem jde zajistit, aby tento skript (viz výše) nebyl volán z cizích stránek? Zatím mě napadá jen to, že bych testovala, odkud volání skriptu přijde a pokud nejde ze stránky, na které mám formulář, jednoduše ukončit odesílání mailu. Má případně někdo podobné zkušenosti?
krteczek
Profil
vypadá to že ke svému emailu připíšou bcc:maily@nejaky.cz,dalsi@mail.cz ...
tím ho rozešlou kamkoliv...:-)
takže email "od" nedávej do from ale jen do obsahu zprávy přidej větu že ten a ten s tímto mailem mi posílá tuto zprávu, stejně většina emailových klientů emaily zvýraznuje (aktivuje)
krteczek
bar
Profil
krteczek
asi to tak je, to jsem ale právě řešila tím regulárem a celkem to filtruje (když se tam objeví např. čárka, už to nepošle), samozřejmě se to dá určitě obejít. Teď mně jde ale o toto. Někdo cizí se podívá na stránku s formulářem a mrkne na action, kde mám adresu se skriptem, kterým zpracovávám formulář. A kdokoliv si pak udělá vlastní formulář a okudkoliv začne spamovat příjemce blbostma, bude prostě odkazovat z cizích stránek přímo na ten skript. Dá se tomu nějak zabránit?
krteczek
Profil
no já to řeším tak že formulář i zpracovávaný script je na te samé stránce.
další pomucka může být vygenerování náhodného řetězce, který se předá jak ve skrytém formulářovém poli tak přes session a při post požadavku se ověří všechny hodnoty, pokud není chyba tak se ověří i tyto dvě proměnné($_SESSION['kontrola'] a $_POST['kontrola']
nějak takhle:

<?php
session_start();
$s = '';
$text = '';
$email = '';
$jmeno = '';
$kontrola = rand(1000.100000);
$_SESSION['kontrola'] = $kontrola;
$adresa = 'krteczek@jaknato.com';
$predmet = 'zprava z webu';
$kodovani = "Content-Type: text/plain; charset=utf-8
";

if(isset($_POST['ok']))
{
if((!empty($_POST['zprava'])) && (trim($_POST['zprava']) != ''))
{
$text = htmlspecialchars($_POST['zprava'], ENT_QUOTES, "utf-8");//nebo utf8 ->ted nevím
}
else
{
$s .= '<p>Nevyplnili jste zprávu pro nás. Prosím doplňte ji.</p>';
}
if((!empty($_POST['email'])) && (JeEmail($_POST['email'])))
{
$email = "From:" . $_POST['email'];
}
else
{
$s .= '<p>Nevyplnili jste Vaši emailovou adresu, nebo Vámi zadaná emailová adresa neodpovídá povolenému vzoru. Prosím opravte ji.</p>';
}
if((!empty($_POST['jmeno'])) && (trim($_POST['jmeno']) != ''))
{
$jmeno = htmlspecialchars($_POST['jmeno']);
}
else
{
$s .= '<p>Nevyplnili jste Vaše jméno, prosím doplňte ho.</p>';
}
if(($s == '') && (!empty($_POST['kontrola'])) && (ctype_digit($_POST['kontrola']) === true) && (!empty($_SESSION['kontrola'])) && ($_POST['kontrola'] == $_SESSION['kontrola']))
{
$kodovani .= $email;
if(@mail($adresa, $predmet, $text, $kodovani))
{
$s .= '<p>Právě byl odeslán email s podrobnou zprávou.</p>';
}
else
{
$s .= '<p>Email se nepodařilo odeslat.</p>';
}
}
else
{
$s .= '<p>Kontrolní řetězce se neshodují. Email nebude odeslán.</p>';
}
}
echo $s;
?>
<form method="post">
<input type="text" name="jmeno" value="<?php echo $jmeno;?>">
<input type="text" name="email" value="<?php echo $email;?>">
<textarea name="zprava" rows="5" cols="34"><?php echo $text;?></textarea>
<input type="hidden" name="kontrola" value="<?php echo $kontrola;?>">
<input type="submit" name="ok" value="Odeslat">
</form>

snad jsem tam nenasekal chyby, psal jsem to jen tak z hlavy a nekontroloval jsem to...
krteczek
krteczek
Profil
jsem na tu konntrolu pozapomenul, už je to opraveno
krteczek
bar
Profil
krteczek
moc děkuju, jdu na to
Toto téma je uzamčeno. Odpověď nelze zaslat.

0