Как избавиться от спам-вставки MySQL?

#php #spam

#php #спам

Вопрос:

Мне действительно интересно, как кто-то добавляет записи в мою существующую таблицу комментариев в блоге. Я использую свой собственный скрипт блога, в котором пользователь добавляет комментарий к любому конкретному блогу. У меня есть отдельная таблица комментариев с идентификатором блога. Я попробовал несколько методов CAPTCHA, но ничего не работает. Я использую PDO для mysql. Я также выполняю проверку JavaScript перед отправкой формы. Я не уверен, является ли он / она реальными людьми или это делают какие-то боты. В течение 1 часа добавляются тысячи записей.

Я представляю свой код ниже. Кто-нибудь может мне помочь, пожалуйста?

 <?php
if(isset($_POST['user_comment']))
{

if ($_SESSION['answer'] == $_POST['answer'] ) 
{
$name = $_POST['name'];
$email = $_POST['email'];
$website = $_POST['website'];
$web = $website;
$comment = addslashes(nl2br($_POST['comment_text']));
$comment =strip_tags($comment);
$id = $article_id;
$ref = $_SERVER["HTTP_REFERER"];
$userip = $_SERVER['REMOTE_ADDR'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
$submit_date = date('Y-m-d H:i:s');

if ((($name) amp;amp; ($email) amp;amp; ($comment))) {

$conn = new PDO("mysql:host=$hostname;dbname=$database",$username,$password);


$sql = "INSERT INTO blog_comments (user,email,website,message,date,storyid,userip,useragent,block) VALUES (:user,:email,:website,:message,:date,:storyid,:userip,:useragent,:block)";
$q = $conn->prepare($sql);
$q->execute(array(':user'=>$name, ':email'=>$email, ':website'=>$website, ':message'=>$title, ':date'=>$submit_date, ':storyid'=>$id, ':userip'=>$userip, ':useragent'=>$useragent,':block'=>'1'));

        }

}
else
{
?>
<tr><td>
<p style="text-align:center; color:#CC0000; font-size:14px; font-weight:bold; padding-bottom:10px;">Wrong Answer! Please try again!!</p>
</td>
</tr>           

<?php
}
}
?>
  

ЭТО МОЙ КОД CAPTCHA:

 <?php

    session_start();

    $digit1 = mt_rand(1,20);
    $digit2 = mt_rand(1,20);
    if( mt_rand(0,1) === 1 ) {
            $math = "$digit1   $digit2";
            $_SESSION['answer'] = $digit1   $digit2;
    } else {
            $math = "$digit1 - $digit2";
            $_SESSION['answer'] = $digit1 - $digit2;
    }

    ?>  
  

ЭТО ПРОВЕРКА JS:

 <script type="text/javascript" language="javascript">
function validate()
{
        if( document.getElementById( "name" ).value == ""){
           alert("Please enter your name.");
           document.getElementById( "name" ).focus();
           return false;
        }
        if( document.getElementById( "email" ).value == ""){
           alert("Please enter Your email ID.");
           document.getElementById( "email" ).focus();
           return false;
        }
        if( document.getElementById( "comment_text" ).value == ""){
           alert("Please enter your comment.");
           document.getElementById( "comment_text" ).focus();
           return false;
        }

        if( document.getElementById( "answer" ).value == ""){
           alert("Please solve this math.");
           document.getElementById("answer").focus();
           return false;
        }
}
</script>
  

ЭТО МОЯ ФОРМА:

 <form action="" method="POST" onSubmit="return validate();">
<table cellpadding="5" cellspacing="5" width="100%">
<tr><td colspan="3">
<input type="hidden" name="id" value="<? print($id);?>">
</td></tr>

<tr>
<td style="font-size:12px; font-weight:bold; width:150px;">Your Name</td>
<td style="width:260px;"><input type="text" name="name" id="name" style="width:250px; height:20px;"></td>
<td style="text-align:left;">Required</td>
</tr>


<tr>
<td style="font-size:12px; font-weight:bold; width:150px;">Your E-mail</td>
<td style="width:260px;"><input type="text" name="email" id="email" style="width:250px; height:20px;"></td>
<td style="text-align:left;">Required</td>
</tr>


<tr>
<td style="font-size:12px; font-weight:bold; width:150px;">Your Website</td>
<td style="width:260px;"><input type="text" name="website" style="width:250px; height:20px;"></td>
<td style="text-align:left;">Optional</td>
</tr>

<tr>
<td style="font-size:12px; font-weight:bold; width:150px;">Your Comment</td>
<td style="width:260px;"><textarea name="comment_text" id="comment_text" style="width:250px; height:100px;"></textarea></td>
<td style="text-align:left;">Required</td>
</tr>

<tr>
<td style="font-size:12px; font-weight:bold; width:150px;">What's <?php echo $math; ?> = </td>
<td style="width:260px;"><input type="text" name="answer" id="answer" style="width:250px; height:20px;"></td>
<td style="text-align:left;">Required</td>
</tr>


<tr>
<td colspan="3" style="text-align:center;">
<input type="submit" class="submit" value="Submit" name="user_comment">
</td></tr>


</table>

</form>
  

Комментарии:

1. Может быть, кто-то опубликовал один и продолжал нажимать F5? Вы должны, по крайней мере, добавить перенаправление, чтобы этого больше не могло произойти. Можете ли вы также показать свою капчу и проверку JS?

2. Проверка JS бесполезна, чтобы противостоять этому, боты отправляют запрос непосредственно на ваш PHP-скрипт. Вы уверены, что ваша капча работает правильно?

3. Нет! Все комментарии новые с разными IP-адресами. Я также использую captcha и проверку javascript. Поэтому, если кто-то просто повторно отправит форму, он / она получит ошибку с неправильной капчей.

4. Да, моя капча работает нормально. С капчей проблем нет.

5. @NeerajKumar Где выполняется проверка php на случай, если javascript отключен?

Ответ №1:

Я бы посоветовал вам выбрать из БД предыдущую запись пользователя с отправленным электронным письмом и сравнить содержимое или дату с отправленными данными. Если содержимое одинаковое или диапазон дат очень мал, тогда покажите сообщение об утверждении для публикации или сделайте что-то в этом роде.

Ответ №2:

Ваша капча не очень безопасна. Любой бот может дать вам ответ.

 What's <?php echo $math; ?> = 
  

Это будет отображаться только в виде текста What's x y = ответ — z .

Каждый бот и каждый самостоятельно написанный Javascript может заполнить все требуемые поля и получить «вопрос» и заполнить его в поле ответа.

И я предполагаю, что если вы нажмете F5 в своем браузере после публикации комментария, php-скрипт также сохранит его в вашей БД, потому что ответ в вашей сессии не удаляется после одной попытки.

Попробуйте напечатать изображение с вопросом вместо текста и удалите ответ в своей сессии после первой попытки. Это должно решить проблему.

Комментарии:

1. Ранее я пробовал это с помощью image captcha, но это не сработало.

2. Как я сказал, ваш php-код не выполняет никакой проверки, он не удаляет ответ. Вам нужен только прокси-переключатель и бот, и у вас будет много комментариев за короткое время.

3. Я добавил новое поле в свою таблицу, чтобы записать математический ответ, и удивился, что они ответили как человек, например, 12, 8, -3. Итак, они реальные люди, вставляющие комментарий через веб-сайт. Но как они могли ввести сотни комментариев за короткое время с разными IP-адресами и useragent.

4. почему только люди могут это делать? любой бот тоже может это сделать. Я мог бы написать бота, который мог бы сделать это легко за 10 минут. Потому что это всегда одна и та же структура (всегда математические операции с — и )

Ответ №3:

В конце концов, я сам нашел решение. Теперь я показываю последнюю прокомментированную дату и время вместо CAPTCHA и прошу пользователя ввести это значение так, как оно есть в поле ввода. Все методы captcha потерпели неудачу, тогда как этот метод работает отлично, и я больше не получаю спам.

Большое спасибо всем вам, экспертам, за ваши ценные предложения.