#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 потерпели неудачу, тогда как этот метод работает отлично, и я больше не получаю спам.
Большое спасибо всем вам, экспертам, за ваши ценные предложения.