preloading articles

Реалізація сторінки зворотнього зв'язку
Премодерація повідомлень

вересень 2015

Зміст

  1. Спамери
  2. Структура веб-сторінки Зворотнього Зв'язку
  3. Внесення даних до Бази Даних
  4. Блок модерації повідомлень
  5. ігнорувати
    додати
    видалити
    блокувати
    динамічні Ip
  6. Блок виведення повідомлень
  7. Заключення
spamers vs programers

1. Спамери

Анатолій.
:( Що ж практичний досвід спілкування з програмкою-спамером; і в черговий раз вона "засмітила" сторінку зворотнього зв'язку.

Інтернет це безперечно безмежний простір інформації, і так звісно є люди якім необхідно в цьому веб-просторі продвинути свої веб-ресурси на кращі позиції пошукових ситем. Гірше те, що застосовують для підвищення рейтингу свого ресурсу програмки-боти, що "засмічують" спамом просту сторінку коментарів, та загалом спамер/не спамер це напевно філософія...

Розгляну ще один варіант антиспаму, - премодерація повідомлень...

Скажу відверто, дуже цікава задачка стала реалізувати адмін-панель для премодерації повідомлень, чудова можливість попрактикуватись у створенні SQL-запитів до бази даних, розвитку логічного мислення, створення алгоритму php-скриптів.




Лиш місяць назад переглядав варіант веб-сторінки коментарів, із захистом від програмки-бота, що спамить.

В попередньому варіанті сторінки коментарів зробив затримку на сорок секунд від повторного повідомлення та блок випадкових питань, але... нажаль, такий варіант лиш уповільнив роботу бота та суттєво зменшив кількість спаму на сторінці зворотнього звязку, кількість сторонніх повідомлень хоч і невелика та все ж присутня, що варто виправити.

Що ж наразі мені подобається варіант з премодерацією повідомлень.

Здається, що це може дещо бути зручним для відвідувача сайту, тим що ненавантажує лишніми головоломками на зразок капчі, де бувають досить складні символи. Єдине коментар зявиться через час, що необхідний адміністратору ресурсу для перевірки доречності повідомлення на веб-сторінці.

2. Структура обробки веб-сторінки Зворотнього Зв'язку

  1. Ну по-перше, сама веб-сторінка "Зворотнього Зв'язку":
    1. як правило, основне то коментар;
    2. в любому коментарі повинне бути ім'я; власника коментаря;
    3. дата та час повідомлення.
        Вважаю, цього досить.

  2.     Друге, веб-сторінка "Адмінування коментарів" адміністратора веб-ресурсу, саме там будуть знаходитись повідомлення, що не пройшли модерацію.
  3. На цій сторінці авторизований адміністратор зможе виконати слідуючі дії з надісланими повідомленням:
    1. Ігнорувати - видаляти повідомлення чи не видаляти, рішення можна прийняти пізніше.
    2. Додати - коментар відповідає всім етичним нормам,
    3. Видалити - просто видаляється повідомлення,
    4. Блокувати Ip-адресу - Ip-адреса користувача надіславшого повідомлення блокується, повідомлення видаляється.

    Можна також зібрати деяку статистичну інформацію, з моменту останнього візиту адміністратора веб-ресурсу. (але в даній статті не розглядається)

структура організації веб-сторінки коментарів з премодерацією повідомлень

Рис.3. Cтруктура організації веб-сторінки коментарів з премодерацією повідомлень

Декілька слів про реалізацію задумки попередньої модерації повідомлень.

Розгляну лише деякі елементи даної структури:
1. Внесення даних до бази даних
2. Модерація повідомлень
3. Виведення модерованих повідомлень.

3. Внесення даних до Бази Даних

Внесення даних в таблицю коментарів відбувається слідуючим чином:

  1. Відвідувач сайту вводить ім'я та коментар в полі html-форми. Поля мають бути обов'язково заповнені, застосуємо атрибут required в полі тега input, та поля textarea html-форми.
  2. Активувавши кнопку <input type="submit"> відправляємо дані імя та коментар на сервер до php-обробника.
  3. Проста Html-форма має:
    - поле для введеня імені - input required type="text" name="name",
    - поле для введення коментаря - textarea required cols="55" rows="8" name="comment"
    - ну і кнопочку відправити меседж input type="submit" value="Надіслати відгук".

    Сама форма всі дані, що ввів відвідувач відправляє до скрипту Php-обробника, що звісно на стороні серверу, там ми виконуємо перевірку, чи всі дані коректно введено, берем час внесення повідомлень і якщо все гаразд, то всі дані відправляємо в таблицю Бази Даних.

    Проста html-форма буде мати вигляд:



  4. Таблиця Coment бази даних
  5. Таблиця коментарів складається із полів:
    id- id повідомлення;
    id_allow- дозвіл на виведення промодерованих повідомлень ("0" - повідомлення не виводиться на сторінку коментарів, "1"- виводиться );
    datetime_coment- дата час повідомлення;
    Name- ім'я автора повідомлення;
    Coment- текст повідомлення;
    ip_adress- Ip-адреса компютора з якого було відправлено повідомлення;

  6. Php-обробник Зворотнього Зв'язку обробляє отримані дані:
<?php

// встановлюємо зєднання з базою даних
$mysqli = new mysqli("localhost", "user", "password", "database");

// Встановлюємо кодування зєднання з базою даних - utf8
mysqli_set_charset($mysqli, "utf8");

// Дізнаємось ip-адресу відвідувача сайту
$Ip_Visitors=$_SERVER["REMOTE_ADDR"];

// перетворюємо введені дані в спеціальні символи
$name = htmlspecialchars(stripslashes($_POST['name']));
$comment = htmlspecialchars(stripslashes($_POST['comment']));

// Блок перевірки кількості введених символів
if (strlen($comment)>400){
header('Location:http:Warning_Page.html');
		exit;
};

// Блок перевірки заблокованих ip-адрес
$result = $mysqli->query("SELECT blocked_ip 
			  FROM table_blocket_ip");
while ($row = $result->fetch_assoc()){
	if ($Ip_Visitors==$row['blocked_ip']){
		header('Location:http:Warning_Page.html');
		exit;
	};
};

// відправляємо дані до таблиці Coment
$mysqli->query("INSERT INTO `Coment`(`id_allow`,`Name`,`Coment`,`ip_adress`) 
		VALUES ('0','$name','$comment','$Ip_Visitors')");

$mysqli->close();

?>

PHP-обробник html-форми виконує:
1. з'єднання з базою даних,
2. організовує кодування передачі та виведення даних в форматі utf08,
3. визначення Ip-адреси ПК автора повідомлення
4. санітаризує введені дані від тегів кодування
5. обмежує кількість введених символів коментаря (в даному прикладі 400 символів)
6. блокує запис повідомлення блокованих Ip-адрес (вибір Ip-адрес з таблиці table_blocket_ip) та перенаправляє заблокованого відвідувача на попереджувальну сторінку
7. вносить запис в таблицю коментарів Coment
8. закриває з'єднанння з базою даних

Відмічу по роботі скрипта один момент, є атрибут id_allow поля таблиці Coment за замовчуванням встановлюємо значення "0", саме значення цього атрибута є дозволом на виведення коментарів на сторінку Зворотнього Зв'язку. Адмін ресурсу, переглянувши текст повідомлення та за умови, що воно не порушує етичні правила, встановлює значення цього атрибуту "1."

Легко здогадатись, що пізніше SQL-запит на вибірку даних ім'я, дата/час, коментар на веб-сторінку Зворотнього Зв'язку з таблиці Coment матиме вигляд:

	
SELECT `Name`,`datetime_coment`,`Coment` 
FROM `Coment` 
WHERE id_allow='1' 

Якщо уважно переглянути скрипт, то можливо з'явиться питання:
- А яким чином вноситься дата та час повідомлення в таблицю коментарів?

На що можу дати відповідь, при створенні таблиці Coment поле datetime_coment має тип даних timestamp. СКБД MySQLi за замовчуванням встановлює поточну дату та час CURRENT_TIMESTAMP, тому вносити дані часу нема сенсу так як, повторюсь, вони прописуються автоматично.

4. Сторінка модерації повідомлень

Цікава сторінка - сторінка адміністратора; що ж оскільки ми програмісти, та ще й адміністратори, добавим дещо легкого гумору в розробку сторінки модерації.

- Чому б нам не найняти дівчину-секретаря, що буде повідомляти про стан речей сторінки коментарів, щось на зразок:

"- Рада вітати, пане Адміністратор, сьогодні Ваш ресурс переглянуло N-відвідувачів"
"- Сьогодні повідомлень не було!"
"- З моменту Вашого останнього візиту надійшло N-повідомлень."
"- Час надходження повідомлень: ДД.ММ.РР ЧЧ.ХХ"


можливо, ще що додатково, наприклад, ...

"- До Вашого відома, всього Ваш ресурс вже відвідало - 847 відвідувачів"

чи так...

"- І пане Вам надійшло 3234 повідомлення на протязі трьох годин, вважаю це хтось помилився адресою, і Ви їх все рівно не читали б, ну я їх і видалила :) "

малюнок дівчини до сторінки адмінування

4.1.Основні блоки сторінки модерації повідомлень

1. Авторизація адміністратора ресурсу. ( В даній статті не розглядаємо, але можна переглянути щось схоже Сторінка організації кодування авторизації на сайті )

2. Представлення статистичної інформації ( кількість відвідувачів, кількість нових повідомлень - за наявності чи інше за алгоритмом обробки даних). ( Також в даній статті не розглядається)

3. Блок модерації нових повідомлень ігнорувати, дозволити, видалити чи заблокувати Ip-адресу і видалити повідомлення від відвідувачів веб-ресурсу.

4.2. Симбіоз HTML та PHP. Коротко про алгоритм роботи

Кубік Рубіка

Згідно поставлених цілей веб-сторінка модерації повинна ігнорувати, внести, видалити, заблокувати повідомлення.

Для любої операції над даними (ігнорувати, внести, видалити, заблокувати) ми маємо ідентифікувати повідомлення. Зрозуміло, що ідентифікувавши повідомлення за id-ідентифікатором ми зможемо внести в базу даних саме це конкретне повідомлення, а не яке-небудь інше.

Реалізувати php-скрипт, що формує Html-форму адмін сторінки можна слідуючим чином:

	
$con = new mysqli("localhost", "user", "password", "database"); 
mysqli_set_charset($con, "utf8");
$i=1;
$result = $con->query("SELECT id,ip_adress,Name,Coment
            FROM Coment 
            WHERE id_allow='0';");
while ($row = $result->fetch_assoc()){
	echo 'id повідомлення:'. $row['id']. '
	<input type="hidden" name="id_msg'.$i.'" value="'.$row['id'].'">';
	
	echo 'ip-адреса : '. $row['ip_adress'];
						
	echo 'Ігнорувати<br>
	Добавити<br>
	Видалити<br>
	Заблокувати Ip</p>';
					
	echo 'Name:'. $row['Name']. '<br>';
	echo 'Coment: '. $row['Coment']. '<br>';
	
	$i++;
}
$con->close(); 

Для кожної операції над повідомленням, поле input type=radio name=admin має своє значення: 1- нічого не робити, 2 - добавити, 3- видалити, 4- заблокувати та видалити. Php-обробник, знаючи індекс даного поля проводить відповідну операцію.

4.2.1. Операція Ігнорувати

Статус повідомлення input name="admin" value="1" без змін, воно так і залишається в таблиці премодерації,- ніяких операцій з цим повідомленням не проводимо.

4.2.2. Операція Додати

Вибір адміна input name="admin" value="2". Маємо змінити статус даного повідомлення, щоб скрипт виводив його на сторінку коментарів, відповідно маємо змінити атрибут id_allow на дозвіл "1". Досить просто реалізовується, за умови, що ми знаємо id повідомлення (передається php-обробнику в полі input type=hidden).

SQL-запит на зміну статуса:

	
UPDATE Coment 
SET id_allow='1' 
WHERE id='$id'; 

4.2.3. Операція Видалити

Вибір адміна input name="admin" value="3". Видалити повідомлення, де id повідомлення (передається php-обробнику в полі input type=hidden).

SQL-запит на видалення повідомлення:

	
DELETE 
FROM Coment
WHERE id='$id'; 

4.2.4. Операція Заблокувати Ip-адресу та Видалити

Вибір адміна input name="admin" value="4". Вирішується завдання слідуючим чином, спочатку заноситься Ip-адреса абонента до таблиці заблокованих Ip-адрес, а потім видаляється повідомлення.
id повідомлення (передається php-обробнику в полі input type=hidden).

Таблиця table_blocket_ip для заблокованих ip-адрес, має поля:

blocked_ip- поле для заблокованих Ip
pattern_ip- поле шаблон Ip-адрес (для динамічних Ip-адрес)

php-обробник запитів на блокування Ip-адреси та видалення повідомлення:

	
$result = $mysqli->query("SELECT ip_adress 
			FROM Coment WHERE id='$id'");
$row = $result->fetch_assoc();
$blocked_ip=$row["ip_adress"];
$mysqli->query("INSERT INTO `table_blocket_ip`(`blocked_ip`) 
		VALUES ('$blocked_ip')");
$mysqli->query("DELETE FROM Coment WHERE id='$id';"); 

Здається тут є кращий спосіб перенесення даних з однієї таблиці до іншої SELECT INTO, але в мене він зразу чомусь не запрацював, а далі я не став вирішувати чому, пішов складнішим шляхом :)

Тут могло б зявитись питання " - Чому ми застосовуємо цикл, де використовується змінна $i?"

Відповідь: Справа в тому, що в кожен момент часу може бути різна кількість надісланих повідомлень, сьогодні одне повідомлення, завтра три чи навіть двадцять... І яким чином передати дані з Html-форми до Php-обробника форми? А так ми знаємо, що сьогодні одне повідомлення чи три повідомлення чи навіть двадцять повідомлень і відповідно передаємо php-обробнику значення полів input з відповідним номером.

P.S. Маска вибору заблокованих Ip-адрес для динамічних Ip-адрес

Даний сайт мав нагоду спілкуватись із спамером, один із варіантів, щоб позбавитись його було рішення заблокувати ip-адресу спамеру

Та повідомлення спамеру надходили до сторінки коментарів таким чином:

Ip : 188.143.232.34     Spamer : Accountant supermarket a href=" ..... " philosophy term papera He was lying.....
Ip : 188.143.232.34     Spamer : I came here to a href="... " heap custom papers guaranteedWe will not let them.....
Ip : 188.143.232.34     Spamer : Another year href=".... " homework history The White House said on Friday that th.....
Ip : 188.143.232.37     Spamer : Which year are you a href=".... " animal farm essays reasonable people in a room.....
Ip : 188.143.232.37     Spamer : Accountant supermarket a href=" ..... " philosophy term paper He was lying.....
Ip : 188.143.232.37     Spamer : How do I get an outside a href="..... " scentuelle libido patc is going to be a.....
Ip : 188.143.232.19     Spamer : Could you tell me the a href="..."> essays writing services Also suspended.....
Ip : 188.143.232.19     Spamer : Get a job a href=".....">editing research paperLloyds has already opted to .....
Ip : 188.143.232.19     Spamer : I work for a href="....."> how do i find my sat essay score Publicis .....

Як видно Ip-адреса спамеру динамічна, та змінюється через кожні три повідомлення, що ж ... тоді розглянемо варіант блокування надходжень спамерних повідомлень застосувавши маску вибору заблокованих Ip.

Тобто, якщо занести перші три октети Ip-адреси (188.143.232) в таблицю блокованих Ip-адресів, то блокувати спамера можна застосувавши скрипт:

Скрипт веб-сторінки Зворотнього Звязку, що перевіряє чи відвідувач має Ip-адресу із таблиці заблокованих шаблонів динамічних Ip-адрес:

	
//отримуємо Ip-адресу
$Ip_Visitors=$_SERVER["REMOTE_ADDR"];

// вибираємо перші три октети адреси
$pattern_visitor_ip=substr($Ip_Visitors,0,11);

// перевіряємо наявність в базі даних
$result = $mysqli->query("SELECT pattern_ip 
			  FROM table_blocket_ip");
			  
while ($row = $result->fetch_assoc()){
	if ($pattern_visitor_ip==$row['pattern_ip']){
		header('Location:http:Warning_Page.html');
		exit;
	};
}; 

Форма внесення Ip-адреси до таблиці заблокованих Ip

Форма внесення

	
<form class="form_for_ip" method="post" action="block_pattern.php" >
<p><label for="id_value">Заблокувати шаблон Ip-адреси</label>   
<input type="text" type="text" name="id_value" id="id_value" placeholder="188.143.232.19">
</p>
<input type="Submit" value="Заблокувати">
</form>

Скрипт block_pattern.php на внесення Ip-адрес до Бази Даних

	
$pattern_visitor_ip=substr($_POST['bloced_ip'],0,11);

$mysqli->query("INSERT INTO `table_blocket_ip`(`pattern_ip`) 
		VALUES ('$pattern_visitor_ip')");

4.3. Про Php-обробник форми адмін-сторінки

Php-обробник форми адмін-сторінки може мати вигляд:

	
<?php 

//Функція опрацювання обробки повідомлення
function Get_Msg ($Qnt_msdg){
  $admin=$_POST['admin'.$Qnt_msdg];
  $id=$_POST['id_msg'.$Qnt_msdg];
	
  $mysqli = new mysqli("localhost", "user", "password", "database"); 
  mysqli_set_charset($mysqli, "utf8");
	
  if ($admin=='2'){		
   $mysqli->query("UPDATE Coment 
 		SET id_allow='1' 
 		WHERE id='$id';");
  };
  if ($admin=='3'){
    $mysqli->query("DELETE 
 		FROM Coment 
 		WHERE id='$id';");
  };
  if ($admin=='4'){
    $result = $mysqli->query("SELECT ip_adress 
    			FROM Coment
    			WHERE id='$id'");
    $row = $result->fetch_assoc();
    $blocked_ip=$row["ip_adress"];
    $mysqli->query("INSERT INTO `table_blocket_ip`(`blocked_ip`) 
     		VALUES ('$blocked_ip')");
    $mysqli->query("DELETE 
    		FROM Coment
  		WHERE id='$id';");
  };
  $mysqli->close();
};


$mysqli = new mysqli("localhost", "user", "password", "database");
mysqli_set_charset($mysqli, "utf8");

// Кількість невідмодерованих повідомлень
$res = $mysqli->query("SELECT count(id_allow) as count 
			FROM Coment
			WHERE id_allow='0';");

$row = $res->fetch_assoc(); 
$Qnt_msdg= $row["count"];

// обробляємо всі ($Qnt_msdg) повідомлення
for ($x = 1; $x <<= $Qnt_msdg; $x++) {
	Get_Msg ($x);
}
$mysqli->close();

//повертаємось
header('Location:http:Back_to_admin.php');
exit;
 
?> 

5. Виведення повідомлень

Скрипт для виведення промодерованих повідомлень досить простий.
В полі веб-сторінки Зворотнього Звязку встановлюємо простий скрипт, що зєднується з базою даних та отримує результуючу вибірку даних таблиці Coment

	
<?php

// встановлюємо зєднання з базою даних
$mysqli = new mysqli("localhost", "user", "password","database");

// Встановлюємо кодування зєднання з базою даних - utf8
mysqli_set_charset($mysqli, "utf8");

// Отримуємо результуючу вибірку даних
$result = $mysqli->query("SELECT  `Name`,`datetime_coment`,`Coment` 
			FROM `Coment` 
			WHERE id_allow='1' ");		
for ($row_no = $result->num_rows - 1; $row_no >= 0; $row_no--) {
	$result->data_seek($row_no);
	$row = $result->fetch_assoc();
		
echo '<p>'.$row['Name'].''.$row['datetime_coment'].''.$row['Coment'].'</p>';		
				
};
	
$mysqli->close();

?> 

6. Заключення

- Та може й зовсім не страшний той спамер, завжди є простір для думки, щоб це такого придумати, щоб було цікаво.

- Тим паче реалізація такого плану веб-сторінки Зворотнього Зв'язку сприяє подальшому апгрейду такої веб-сторінки, так вважаю дуже доречно застосувати AJAX для асинхронного обміну даними з сервером, але це вже тема для іншої статті.

Схожі теми на ресурсі BestWebIt.biz.ua

- Н-да, історичне зростання :)

  1. серпень 2015 Реалізація сторінки коментарів. ( Антиспамерний захист)
  2. листопад 2014 Створення сторінки з коментарями ( Проста )