Jump to content
  • 0

Не работает форма для писем


Mila
 Share

Question

Добавила антиспам-проверку в форму для писем и она перестала работать - письма не отправляются,

вместо этого все время выдает: Неправильный ответ на вопрос антиспама.

Вот код:

<?php

/*

Template Name: contact.php

*/

$tmp1 = rand(0, 20);

$tmp2 = rand(0, 20);

$cp_question = $tmp1.' + '.$tmp2.' = ?';

$cp_answer = $tmp1 + $tmp2;

?>

<?php if (have_posts()) : ?><?php while (have_posts()) : the_post(); ?>

<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h2><br />

<?php

//validate email adress

function is_valid_email($email)

{

return (eregi ("^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}$", $email));

}

function is_valid_user($answer)

{

global $cp_answer;

if ($answer == $cp_answer) { return true; } else { return false;}

}

//clean up text

function clean($text)

{

return stripslashes($text);

}

//encode special chars (in name and subject)

function encodeMailHeader ($string, $charset = 'UTF-8')

{

return sprintf ('=?%s?B?%s?=', strtoupper ($charset),base64_encode ($string));

}

$cp_name = (!empty($_POST['cp_name'])) ? $_POST['cp_name'] : "";

$cp_email = (!empty($_POST['cp_email'])) ? $_POST['cp_email'] : "";

$cp_url = (!empty($_POST['cp_url'])) ? $_POST['cp_url'] : "";

$cp_ans = (!empty($_POST['cp_ans'])) ? $_POST['cp_ans'] : "";

$cp_message = (!empty($_POST['cp_message'])) ? $_POST['cp_message'] : "";

$cp_message = clean($cp_message);

$error_msg = "";

$send = 0;

if (!empty($_POST['submit'])) {

$send = 1;

if (empty($cp_name) || empty($cp_email) || empty($cp_message) || empty($cp_ans)) {

$error_msg.= "<p style='color:#a00'><strong>Пожалуйста, заполните все необходимые поля.</strong></p>\n";

$send = 0;

}

if (!is_valid_email($cp_email)) {

$error_msg.= "<p style='color:#a00'><strong>Не удалось подтвердить Ваш адрес электронной почты.</strong></p>\n";

$send = 0;

}

if (!is_valid_user($cp_ans)) {

$error_msg.= "<p style='color:#a00'><strong>Неправильный ответ на вопрос Антиспама.</strong></p>\n";

$send = 0;

}

}

if (!$send) { ?>

<?php echo $error_msg;?>

<form method="post" action="" id="contactform">

<p class="fieldwrap"><label for="cp_name"><span class="required">*</span> Ваше имя</label>

<input type="text" name="cp_name" id="cp_name" value="" /></p>

<p class="fieldwrap"><label for="cp_email"><span class="required">*</span> Email</label>

<input type="text" name="cp_email" id="cp_email" value="" /></p>

<p class="fieldwrap"><label for="cp_url">   Ваш сайт</label>

<input type="text" name="cp_url" id="cp_url" value="" /></p>

<p class="fieldwrap"><label for="fm_verify"><span class="required">*</span>Антиспам: <?php echo $cp_question; ?></label>

<input class="cpverify" name="cp_ans" id="cp_verify" type="text" value="" />

<p class="fieldwrap"><label for="cp_message"><span class="required">*</span> Ваше cообщение</label>

<textarea class="cptextarea" name="cp_message" cols="66" rows="10" id="cp_message"></textarea></p>

<p><input name="MAX_FILE_SIZE" value="1000000" type="hidden"></p>

<input type="submit" id="submit" name="submit" value="Отправить сообщение" />

</form>

<?php

} else {

$displayName_array = explode(" ",$cp_name);

$displayName = htmlentities(utf8_decode($displayName_array[0]));

$header = "MIME-Version: 1.0\n";

$header .= "Content-Type: text/plain; charset=\"utf-8\"\n";

$header .= "From:" . encodeMailHeader($cp_name) . "<" . $cp_email . ">\n";

$email_subject = "[" . get_settings('blogname') . "] " . encodeMailHeader($cp_name);

$email_text = "Пишет: " . $cp_name . "\n" .

"Email: " . $cp_email . "\n" .

"Url: " . $cp_url . "\n\n" .

$cp_message;

if (@mail(get_settings('admin_email'), $email_subject, $email_text, $header)) {

echo "<br /><p>Спасибо за ваше письмо, " . $displayName . ".</p>";

}

}

?>

<?php endwhile; ?><?php endif; ?>

Помогите, плиз, найти ошибку.

Edited by Mila
Link to comment
Share on other sites

18 answers to this question

Recommended Posts

  • 0

Ошибка в том, что:

$tmp1 = rand(0, 20);
$tmp2 = rand(0, 20);
$cp_question = $tmp1.' + '.$tmp2.' = ?';
$cp_answer = $tmp1 + $tmp2;

при каждом обращении к странице у вас генерируется новый вопрос ответ, т.е. вы получили форму с вопросом 2+2 =? отвечаете 4 , 4 отсылается на страницу с проверкой а там делается 2 + 3 = 5, и уже 5 сравнивается с ответом 4 , конечно он не будет равен, должно случится чудо чтоб подряд два раз по рендому выпали одинаковые два числа

Link to comment
Share on other sites

  • 0

Пятница только начинается а у меня уже раскалывается голова ( Если не чего не путаю то у вас проблема с $cp_answer и $answer однако тут не видно как и передаются и как получаются данные переменные... Это WordPress ?

Если же вы не как не передаете $cp_answer то советаю его пробрасывать в сессии

Edited by stars
Link to comment
Share on other sites

  • 0
Если не чего не путаю то у вас проблема с $cp_answer и $answer однако тут не видно как и передаются и как получаются данные переменные...

Очень даже видно, с $cp_answer кусок я отобразил выше,

а $answer из формы:

<p class="fieldwrap"><label for="fm_verify"><span class="required">*</span>Антиспам: <?php echo $cp_question; ?></label>
<input class="cpverify" name="cp_ans" id="cp_verify" type="text" value="" />

попадает в обработчик:

$cp_ans = (!empty($_POST['cp_ans'])) ? $_POST['cp_ans'] : "";

//далее...

if (!is_valid_user($cp_ans)) {
$error_msg.= "<p style='color:#a00'><strong>Неправильный ответ на вопрос Антиспама.</strong></p>\n";
$send = 0;
}

// a функция:

function is_valid_user($answer)
{
global $cp_answer;
if ($answer == $cp_answer) { return true; } else { return false;}
}

Если же вы не как не передаете $cp_answer то советаю его пробрасывать в сессии

А вот тут вы правы :)

Link to comment
Share on other sites

  • 0
Ребята, к сожалению, намеков мне мало.

Ну какие намеки то... LunatiK достаточно ясно выразился что у вас, происходит:

1) Пользователь обращается к сайту.

2) Сервер ему отдает страницу где генерируется условие ответом на которое должно быть $cp_answer = $tmp1 + $tmp2;

3) Пользователь вводит данные и отправляет их серверу.

4) Сервер получает данные и вот тут он должен был бы проверить ответ пользователя с тем старым $cp_answer, но вместо этого он уже имеет новый $cp_answer = $tmp1 + $tmp2;

Что вам нужно c делать, да хотя бы:

<input type="hidden" name="cp_answer_old" value="<?php echo $cp_answer; ?>">

И уже в пункте номер 4) сверять полученные данные от пользователя с $_POST['cp_answer_old'] очевидный минус этого действа что ответ зарание известен поэтому я и предложил на пункте номер 2 $cp_answer записывать в сессию и на пункте номер 4 получать его из сессии

Link to comment
Share on other sites

  • 0

На ваш страх и риск, без каких либо гарантий и претензий, ибо всё на скорую руку, да и в пятницу вечером :)

*Удалил косчный скрипт ...

Учите пхп или нанимайте постоянного человека, такие бесплатные чтучки могут вам выйти дырой в вашем сайте :P

Edited by LunatiK
Link to comment
Share on other sites

  • 0

Не надо благодарностей, как-будто вы не понимаете что я вам делаю «медвежью услугу»

<?php
/*
Template Name: contact.php
*/
session_start();//!!! изменения
$tmp1 = rand(0, 20);
$tmp2 = rand(0, 20);

if(!isset($_SESSION['cp_answer'])) { //!!! Изменения
$_SESSION['cp_question'] = $tmp1.' + '.$tmp2.' = ?'; //!!! Изменения
$_SESSION['cp_answer'] = $tmp1 + $tmp2; //!!! Изменения
} //!!! Изменения
if (empty($_POST)) { //!!! Изменения
$_SESSION['cp_question'] = $tmp1.' + '.$tmp2.' = ?'; //!!! Изменения
$_SESSION['cp_answer'] = $tmp1 + $tmp2; //!!! Изменения
} //!!! Изменения
?>
<?php if (have_posts()) : ?><?php while (have_posts()) : the_post(); ?>

<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link: <?php the_title(); ?>"><?php the_title(); ?></a></h2><br />

<?php
//validate email adress
function is_valid_email($email)
{
return (eregi ("^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}$", $email));
}
function is_valid_user($answer)
{
global $_SESSION;//!!! изменения
if ($answer == $_SESSION['cp_answer']) { return true; } else { return false;}//!!! изменения
}
//clean up text
function clean($text)
{
return stripslashes($text);
}
//encode special chars (in name and subject)
function encodeMailHeader ($string, $charset = 'UTF-8')
{
return sprintf ('=?%s?B?%s?=', strtoupper ($charset),base64_encode ($string));
}

$cp_name = (!empty($_POST['cp_name'])) ? $_POST['cp_name'] : "";
$cp_email = (!empty($_POST['cp_email'])) ? $_POST['cp_email'] : "";
$cp_url = (!empty($_POST['cp_url'])) ? $_POST['cp_url'] : "";
$cp_ans = (!empty($_POST['cp_ans'])) ? $_POST['cp_ans'] : "";
$cp_message = (!empty($_POST['cp_message'])) ? $_POST['cp_message'] : "";
$cp_message = clean($cp_message);
$error_msg = "";
$send = 0;
if (!empty($_POST['submit'])) {
$send = 1;
if (empty($cp_name) || empty($cp_email) || empty($cp_message) || empty($cp_ans)) {
$error_msg.= "<p style='color:#a00'><strong>Пожалуйста, заполните все необходимые поля.</strong></p>\n";
$send = 0;
}
if (!is_valid_email($cp_email)) {
$error_msg.= "<p style='color:#a00'><strong>Не удалось подтвердить Ваш адрес электронной почты.</strong></p>\n";
$send = 0;
}
if (!is_valid_user($cp_ans)) {
$error_msg.= "<p style='color:#a00'><strong>Неправильный ответ на вопрос Антиспама.</strong></p>\n";
$send = 0;
$_SESSION['cp_question'] = $tmp1.' + '.$tmp2.' = ?'; //!!! Изменения
$_SESSION['cp_answer'] = $tmp1 + $tmp2; //!!! Изменения
}
}
if (!$send) { ?>

<?php echo $error_msg;?>

<form method="post" action="" id="contactform">

<p class="fieldwrap"><label for="cp_name"><span class="required">*</span> Ваше имя</label>
<input type="text" name="cp_name" id="cp_name" value="" /></p>

<p class="fieldwrap"><label for="cp_email"><span class="required">*</span> Email</label>
<input type="text" name="cp_email" id="cp_email" value="" /></p>

<p class="fieldwrap"><label for="cp_url">   Ваш сайт</label>
<input type="text" name="cp_url" id="cp_url" value="" /></p>

<p class="fieldwrap"><label for="fm_verify"><span class="required">*</span>Антиспам: <?php echo $_SESSION['cp_question'];//!!! Изменения
?></label>
<input class="cpverify" name="cp_ans" id="cp_verify" type="text" value="" />

<p class="fieldwrap"><label for="cp_message"><span class="required">*</span> Ваше cообщение</label>
<textarea class="cptextarea" name="cp_message" cols="66" rows="10" id="cp_message"></textarea></p>

<p><input name="MAX_FILE_SIZE" value="1000000" type="hidden"></p>
<input type="submit" id="submit" name="submit" value="Отправить сообщение" />
</form>

<?php
} else {
$displayName_array = explode(" ",$cp_name);
$displayName = htmlentities(utf8_decode($displayName_array[0]));

$header = "MIME-Version: 1.0\n";
$header .= "Content-Type: text/plain; charset=\"utf-8\"\n";
$header .= "From:" . encodeMailHeader($cp_name) . "<" . $cp_email . ">\n";
$email_subject = "[" . get_settings('blogname') . "] " . encodeMailHeader($cp_name);
$email_text = "Пишет: " . $cp_name . "\n" .
"Email: " . $cp_email . "\n" .
"Url: " . $cp_url . "\n\n" .
$cp_message;

if (@mail(get_settings('admin_email'), $email_subject, $email_text, $header)) {
echo "<br /><p>Спасибо за ваше письмо, " . $displayName . ".</p>";
}
}
?>

<?php endwhile; ?><?php endif; ?>

P.S. Все предупреждения остаются в силе

Edited by LunatiK
Link to comment
Share on other sites

  • 0
LunatiK, я не понимаю, почему "медвежью"?

Потому что я «хрен с горы», туда мог внедрить уязвимость и потом ей воспользоваться, а так как вы ничего в этом не понимаете и анализируете работу по факту «работает/не работает» и походу с этим ничего делать не собираетесь, то в конечном итоге с таким подходом сядете в лужу (или даже попадёте на бабки).

Link to comment
Share on other sites

  • 0
вставит какой-нить backdoor типа eval(); инклюдом perl скрипта который будет тырить пароли рутовые. :P

Или

eval(file_get_content($_GET['bugaga']));

На многих хостингах прокатывает :)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy