Борба срещу спама
php за начинаещи
И така, сайтът има форма, от която се изпращат писма. Хората, без дори да посещават сайта, въвеждат алгоритъма за достъп до нашата програма в своята база данни и изпращат писма, включително до нашия сайт, чрез нашата форма за обратна връзка. Вероятно сте получавали писма като това повече от веднъж: "Платете ни пари и ние ще добавим вашата връзка към 10 000 форума и 20 000 книги за гости." Алгоритъмът за добавяне на съобщения във форуми и книги за гости е приблизително един и същ и спамърите използват това и ако няма пречка за добавяне на съобщения, винаги ще изтривате ненужни съобщения, като например: "Хайде, нов сайт с порно клипове."
Как да се уверим, че знаем със сигурност, че изпратеното писмо е написано точно през нашата форма, а не е използван пощенски робот? Тук ще обсъдим няколко начина за спиране на спама във вашия сайт. В зависимост от това колко напреднал е вашият сайт, това ще зависи от това колко често ще се опитвате да добавяте спам и колко сложни молци ще бъде направено това. И така, обичайната форма за изпращане на съобщения от сайта изглежда така:
Можете да видите, че формулярът ще ни препрати към скрипта "main.php". Изглежда така:
// ако нищо не е изпратено от формуляра, отпечатайте гоif(empty( $_POST [ 'submit' ] )) <печат" "; > //ако информацията от формата е изпратена до скриптаelse |
//в каква форма ще бъде получено писмото $body = "Потребителско име: %name%
В нашия случай формата за изпращане на съобщение ще изглежда така:
Поле с име"kod_secret"и думата$SECRET.Нека стартираме друг файлsecret.php, той винаги ще съдържа различен низ, след което ще бъде сравнен сизпратено от формуляра и ако има съвпадение, писмото ще бъде изпратено до нас. Във файлаsecret.phpзадайте правата за достъп на 766. Тогава работещият файлmain.phpще изглежда така:
// създайте файл secret.php, ако не съществува $secret_php = "secret.php";ако(!@file_exists( $secret_php )) <@touch( $secret_php ); $fp =fopen($secret_php, "w");fwrite( $fp , '');fclose($fp); > |
// вмъкваме в скрипта 'secret.php', от него научаваме на какво е равно // записаната в него променлива $_SECRET .
// генерира четири символа, винаги различни - това ще бъде ключът $SECRET =substr(md5(uniqid(@rand())),0,4); // формира низ за запис в 'secret.php' $content = " $_SECRET ='". $SECRET ."'; ?>\n"; // отворете secret.php за запис, като го изтриете напълно $fp =fopen('secret.php', 'w'); // запишете низа $content във файла 'secret.php'fwrite( $fp , $content ); // затворете 'secret.php'fclose( $fp ); // съдържанието на 'secret.php' се промени, следващия път // $c_secret ще има различна стойност
// ако нищо не се изпраща от формуляра, тогава го отпечатваме // променливата $SECRET ще бъде различна, генерирахме я по-горе // и записахме стойността й в 'secret.php'if(empty( $_POST [ 'submit' ] )) <печат" "; >
//ако информацията от формата е изпратена до скриптаelse< // проверява дали потребителят е въвел правилно данните в полето '_secret' // $kod_secret е получено от формата, а $_SECRET от файла 'secret.php' // включихме го по-горе с редаinclude"secret.php"; // ако променливите съвпадат, изпраща се букватаif(trim($_POST [ 'kod_secret' ] ) == $_SECRET ) < $body = " Потребителско име: %name%
Съобщение: %message% "; $user = "[email protected]"; $newm = "Изпратено от моя сайт"; $body =str_replace("%name%", $_POST [ 'name' ] , $body ); $body =str_replace("%message%", $_POST [ 'message' ] , $body); $headers = "Content-Type: text/html; charset=windows-1251\r\n"; $headers .= "От: ". $user ;if(@mail( $user , $newm , $body , $headers ) ) <print$name ."! Успешно изпратихте имейл.
". $body ; >else<print"Грешка не работи @mail."; > > // ако данните не съвпадат, кажете на потребителяelse<print"
Грешка.Въведете правилния текст в полето SECRET
"; // отпечатайте формуляра за изпращане. $SECRET е променен и файлът 'secret.php' е промененprint" "; > > ?>
Какво постигнахме? Формулярът винаги генерира различен компонент от четири знака. Потребителят го вижда. Молим го да добави този компонент към полето SECRET, име на полето „kod_secret“. След като потребителят щракна върху бутона „изпращане“, открихме на какво е равна променливата $_SECRET, записана преди това във файла „secret.php“, просто като я включихме в началото на скрипта. След това генерирахме нова стойност $SECRET, написахме нов ред във файла 'secret.php' с тази нова стойност и проверихме дали потребителят е въвел правилните данни в полето SECRET. Ако е правилно, тогава сме изпратили писмото, ако не, тогава показваме формуляра за изпращане с новата стойност $SECRET.
С този подход леко влошаваме живота на спамърите. Вижте как го внедрихме тук.
По-долу в полемиката този метод беше силно критикуван. Въпросът е, че акодвама души ще изпращат едновременно писма от сайта, след което единият ще презапише кода на другия. Има недостатък в този метод. Нека променим малко програмата.
По принцип няма да запазваме секретния код в никакъв файл, а просто добавяме скрито поле в полето за изпращане, в което ще напишем този код.
Можете да видите, че редът" . $SECRET . " '>се появи във формуляра
Когато предаваме данни от този формуляр към скрипта, откриваме на какво е равно$_SECRET, след което го сравняваме с това, което потребителят трябва да въведе в полетоkod_secret, ако има съвпадение, писмото се изпраща.
$SECRET =substr(md5(uniqid(@rand())),0,4); |
// ако потребителят все още не е изпратил нищо от формуляра, отпечатайте гоif(empty( $_POST [ 'submit' ] )) <печат" "; >
//ако информацията от формата е изпратена до скриптаelse< // ако променливите съвпадат, изпратете имейлif(trim( $_POST [ 'kod_secret' ] ) == $_POST [ '_SECRET' ] ) < $body = " Потребителско име: %name%
Съобщение: %message% "; $user = "[email protected]"; $newm = "Изпратено от моя сайт"; $body =str_replace("%name%", $_POST [ 'name' ] , $body ); $body =str_replace("%message%", $_POST [ 'message' ] , $body); $headers = "Content-Type: text/html; charset=windows-1251\r\n"; $headers .= "От: ". $user ;if(@mail( $user , $newm , $body , $headers ) ) <print$name ."! Успешно изпратихте имейл.
". $body ; >else<print"Грешка не работи @mail."; > >
// ако данните не съвпадат, казваме на потребителя за товаelse<печат"
Грешка.Въведете правилния текст в полето SECRET
"; // отпечатайте формуляра за изпращане. $_SECRET се промени, вмъкнете новия ключ във формуляра.отпечатайте" "; > > ?>
Виждате, че в този случай вземаме всички данни от формуляра. Ако двама потребители ни изпратят писмо едновременно, тогава единият няма да презапише данните на другия, тъй като и двете променливи (тайният код и кодът, който потребителят въвежда, ще вземем от самата форма за изпращане). Но в този случай, когато страницата се презареди с просто презареждане, програмата ще изпрати писма, така че ние вземаме и двете секретни променливи от самия формуляр, колкото пъти искаме. И спамерът, след като е разбрал нашия механизъм, ще може да го регистрира в своя пощенски скрипт и спокойно да ни изпраща писма.
В резултат на това и първият, и вторият метод имат недостатъци. Но на малки сайтове трябва да ги използвате, няма нищо лошо в това. Но в напреднали сайтове вероятно е невъзможно да се използват тези методи. Факт е, че никой няма да попречи на спамъра първо да сканира вашата страница, от текста на която, за да разбере секретния код, генериран от програмата. Затова ще се опитаме да дадем друг метод, който донякъде решава проблемите на първите два метода.
Създайте папкаimages_spamс733разрешения иsecret.datфайл с766разрешения. Алгоритъмът ще бъде като този:
Стартираме сесията, в папката /tmp на сървъра се появява текстов файл, напримерsess_63e20455ed7296331fefdf4b1f45534eе името на сесията и файлът ще има същото име.
След това генерирайте секретния код $SECRET =substr(md5(uniqid(@rand())),0,4); и напишете реда $_SECRET = $SECRET в този файл.
След това, използвайки GD библиотеката, генерираме картина, в която пишем тайния код с букви ичисла. Тази картина ще има същото име като името на сесията във формат .jpg. Записваме го в папкатаimages. Името на файла ще бъде63e20455ed7296331fefdf4b1f45534e.jpg
Сега в папката /tmp има файл, наречен sess_63e20455ed7296331fefdf4b1f45534e, в който нашият таен код е написан в текст, а в папкатаimagesима файл 63e20455ed7296331fefdf4b1f45534e.jpg, в който е изчертан нашият таен код.
След това във файлаsecret.datзаписваме ред с името на сесията и времето, в което е създадена
Освен това, във формата за изпращане на съобщение, добавете ред, в който картината е написанаи я покажете на потребителя.
Той я вижда, въвежда секретния код в полето и изпраща писмото.
След това разглеждаме името на сесията, изтегляме в програмата данните, записани в тази сесия (в нашия случай от файла tmp/sess_63e20455ed7296331fefdf4b1f45534e), тоест на какво е равен тайният код, записан преди това в този файл.
Ако съвпада с това, което потребителят е видял на снимката и е изпратен от формуляра, тогава изпращаме имейл, изтриваме файла на сесията 'tmp/sess_63e20455ed7296331fefdf4b1f45534e' и картината 'images_spam/63e20455ed7296331fefdf4b1f45534e.jpg' и от файлаsecret.d наизтрийте реда с „63e20455ed7296331fefdf4b1f45534e“.
Ако програмата на робота е влязла, тогава тя ще създаде куп сесийни файлове и куп .jpg файлове и няма да може да изпраща писма. Затова включвамеsecret.dat, погледнете времето, изминало от създаването на файла на сесията и изображението, ако е повече от, например, една минута, изтрийте файла на сесията 'tmp/sess_63e20455ed7296331fefdf4b1f45534e' и изображението 'images_spam/63e20455ed7296331fefdf4b1f 45534 e.jpg" и изтрийте реда с "63e20455ed7296331fefdf4b1f45534e" от файлаsecret.dat.
Какво се случи:в сесията беше записан таен код (винагиразлични) и генерираха картина с името на сесията, в която те начертаха кода, извадиха тайната променлива в програмата и я сравниха с изпратеното от потребителя. Роботът дори и да сканира страницата ще намери само името на сесията, няма да прочете нищо от картинката. Тоест проблемите, описани в първите два метода, са решени.
Недостатъците на този подход са графичната библиотека GD, тя не работи на всички сървъри. Но за останалото има само плюсове.
Направих скрипт, но не използвах сесията, реших, че е по-добре да използвам симулатора, той работи на принципа на сесията.
Можете да видите как изглежда тук. Или погледнете нашата книга за гости, сега предлагаме на спамърите да добавят към нашия спам за гости, може би някой ще ви каже грешките, само ще съм благодарен. Потвърждавам, че с помощта на този скрипт се отървах от спама чрез програмата робот.
Страница 1 |
И самото скрито ще изглежда така: " 7493343c5b43a9b1eb96aa6acec23e6e " name=l> В моя случай се използват 2 скрити заглавки. Скриптът използва втория хеш за сравнение. Без познаване на алгоритъма е невъзможно да се познае какъв ще бъде хешът. Този метод, разбира се, също е подходящ само за малки сайтове, но като един от вариантите според мен е възможен.
>Съгласен съм, че секретният код на първия ще бъде изтрит. Всичко е наред Да, нашата опелена водка може да отрови потребителя. Всичко е наред, ще бъде излекувано (в краен случай ще се прероди).
Напишете в предговора към статията „Аз самият не съм специалист по проблема, написах този скрипт по бърз начин чисто за себе си, поради незнание направих големи предположения, когато го използвате, може да имате такива и такива проблеми“, в противен случай, виждам, вашите криви алгоритми вече са започнали да се разглобяват от хората на техните сайтове.
Предлага се да се напишекодов низ към файла secret.php. Какво се случва, ако влязат 2 посетители едновременно? Тайната на втория презаписва тайната на първия. И първият няма да може да изпрати съобщение. Има механизми, специално предназначени за съхраняване на такива временни данни, свързани с конкретен посетител. Не, не бисквитки. Това е две.