Ссылочный антиспам для веб-форм.
Назначение
Дополнительная хорошая защита от автоматических (и не только) ботов, активно пытающихся засорить веб-страницы (форумы, гостевые книги) ссылками на порносайты.
Принцип работы
Проверка текста на СПАМ по "чёрным" спискам:
1. список запрещённых слов в доменах и субдоменах
2. список запрещённых вхождений в ссылках
3. список запрещённых доменов
Пример использования:
Code (php): скопировать код в буфер обмена
if (@$_SERVER['REQUEST_METHOD'] === 'POST' && is_spam($_REQUEST)) trigger_error('На нашем сайте СПАМ запрещён!', E_USER_ERROR);
Класс:
<?
/**
* Назначение:
* Дополнительная хорошая защита от автоматических (и не только) ботов,
* активно пытающихся засорить веб-страницы (форумы, гостевые книги) ссылками на порносайты.
* Если в ссылках найдены запрещённые слова, текст считается спамом.
*
* Принцип работы:
* Проверка текста на СПАМ по "чёрным" спискам:
* 1. список запрещённых слов в доменах и субдоменах
* 2. список запрещённых вхождений в ссылках
* 3. список запрещённых доменов
*
* Пример использования:
* if (@$_SERVER['REQUEST_METHOD'] === 'POST' && is_spam($_REQUEST)) trigger_error('На нашем сайте СПАМ запрещён!', E_USER_ERROR);
*
* @param mixed(string/array) $s строка или массив для проверки (массивы обходятся рекурсивно)
* текст м.б. html кодом
* @param string $found найденный "плохой" фрагмент текста
* @return bool возвращает TRUE, если тест содержит спам и FALSE в противном случае.
*
* @license http://creativecommons.org/licenses/by-nc-sa/3.0/
* @author Nasibullin Rinat <n a s i b u l l i n at starlink ru>
* @charset ANSI
* @version 1.3.0
*/
function is_spam($s, &$found = null)
{
if (is_array($s)) foreach ($s as $k => &$v) if (is_spam($v, $found)) return true;
if (! is_string($s) || strlen($s) < 6 /*sex.ru*/) return false;
#Ниже представлены домены первого уровня общесетевых и географических (региональных) ресурсов.
#Источник: http://www.tigir.com/domains.htm
$domains1 = array(
#Домены общесетевых ресурсов
'com', #коммерческие ресурсы
'net', #ресурсы и организации связанные с сетью
'org', #некоммерческие организации
'info', #информационные узлы
'biz', #ресурсы для бизнеса
'name', #доменная зона для частных лиц. Домен в зоне .name имеет три 'уровня' и выглядит так: имя.фамилия.name или так: фамилия.имя.name.
'aero', #домен для членов Авиационного сообщества и их потребителей
'arpa', #домен используемый исключительно для инфраструктуры интернета
'edu', #ВУЗ-ы США
'int', #международные организации
'gov', #правительственные организации США
'mil', #военные ведомства США
'coop', #кооперативы и организации их обслуживающие
'museum', #музеи, учреждения и частные лица, имеющие отношение к музейному делу
'mobi', #сайты для мобильных устройств
'travel', #индустрия путешествий, экскурсий и отдыха: турагентства, туроператоры и т.д.
#Географические домены
'ac', #о-в Вознесения (Ascension Island)
'ad', #Андорра (Andorra)
'ae', #Объединенные Арабские Эмираты (United Arab Emirates)
'af', #Афганистан (Afghanistan)
'ag', #Антигуа и Барбуда (Antigua and Barbuda)
'ai', #Ангилья (Anguilla)
'al', #Албания (Albania)
'am', #Армения (Armenia)
'an', #Антильские острова (Netherlands Antilles)
'ao', #Ангола (Angola)
'aq', #Антарктида (Antarctica)
'ar', #Аргентина (Argentina)
'as', #Американское Самоа или Восточное Самоа (American Samoa)
'at', #Австрия (Austria)
'au', #Австралия (Australia)
'aw', #Аруба (Aruba)
'az', #Азербайджан (Azerbaijan)
'ba', #Босния и Герцеговина (Bosnia and Herzegovina)
'bb', #Барбадос (Barbados)
'bd', #Бангладеш (Bangladesh)
'be', #Бельгия (Belgium)
'bf', #Буркина-Фасо (Burkina Faso)
'bg', #Болгария (Bulgaria)
'bh', #Бахрейн (Bahrain)
'bi', #Бурунди (Burundi)
'bj', #Бенин (Benin)
'bm', #Бермудские острова (Bermuda)
'bn', #Бруней (Brunei Darussalam)
'bo', #Боливия (Bolivia)
'br', #Бразилия (Brazil)
'bs', #Багамские острова (Bahamas)
'bt', #Бутан (Bhutan)
'bv', #остров Буве (Bouvet Island)
'bw', #Ботсвана (Botswana)
'by', #Белоруссия (Belarus)
'bz', #Белиз (Belize)
'ca', #Канада (Canada)
'cc', #Cocos (Keeling) Islands (Кокосовые острова)
'cd', #Демократическая Республика Конго (Democratic Republic of the Congo)
'cf', #Центральноафриканская Республика (Central African Republic)
'cg', #Республика Конго (Republic of the Congo)
'ch', #Швейцария (Switzerland)
'ci', #Кот-д'Ивуар (Cote d'Ivoire)
'ck', #острова Кука (Cook Islands)
'cl', #Чили (Chile)
'cm', #Камерун (Cameroon)
'cn', #Китай (China)
'co', #Колумбия (Colombia)
'cr', #Коста-Рика (Costa Rica)
'cu', #Куба (Cuba)
'cv', #Кабо-Верде (Cape Verde)
'cx', #остров Рождества (Christmas Island)
'cy', #Кипр (Cyprus)
'cz', #Чешская Республика (Czech Republic)
'de', #Германия (Germany)
'dj', #Джибути (Djibouti)
'dk', #Дания (Denmark)
'dm', #Доминика (Dominica)
'do', #Доминиканская Республика (Dominican Republic)
'dz', #Алжир (Algeria)
'ec', #Эквадор (Ecuador)
'ee', #Эстония (Estonia)
'eg', #Египет (Egypt)
'eh', #Западная Сахара (Western Sahara)
'er', #Эритрея (Eritrea)
'es', #Испания (Spain)
'et', #Эфиопия (Ethiopia)
'eu', #ная зона стран Евросоюза
'fi', #Финляндия (Finland)
'fj', #Фиджи (Fiji)
'fk', #Фолклендские острова или Мальвинские острова (Falkland (Malvina) Islands)
'fm', #Микронезия (Micronesia)
'fo', #Фарерские острова (Faroe Islands)
'fr', #Франция (France)
'ga', #Габон (Gabon)
'gd', #Гренада (Grenada)
'ge', #Грузия (Georgia)
'gf', #Французская Гвиана (French Guiana)
'gg', #Гернси (Guernsey)
'gh', #Гана (Ghana)
'gi', #Гибралтар (Gibraltar)
'gl', #Гренландия (Greenland)
'gm', #Гамбия (Gambia)
'gn', #Гвинея (Guinea)
'gp', #Гваделупа (Guadeloupe)
'gq', #Экваториальная Гвинея (Equatorial Guinea)
'gr', #Греция (Greece)
'gs', #Южная Георгия и Южные Сандвичевы острова (South Georgia and the South Sandwich Islands)
'gt', #Гватемала (Guatemala)
'gu', #Гуам (Guam)
'gw', #Гвинея-Бисау (Guinea-Bissau)
'gy', #Гайана (Guyana)
'hk', #Гонконг (Hong Kong)
'hm', #островов Херд и Макдоналд (Heard and McDonald Islands)
'hn', #Гондурас (Honduras)
'hr', #Хорватия (Croatia)
'ht', #Гаити (Haiti)
'hu', #Венгрия (Hungary)
'id', #Индонезия (Indonesia)
'ie', #Ирландия (Ireland)
'il', #Израиль (Israel)
'im', #остров Мэн (Isle of Man)
'in', #Индия (India)
'io', #Британских территорий в Индийском океане (British Indian Ocean Territory)
'iq', #Ирак (Iraq)
'ir', #Иран (Iran)
'is', #Исландия (Iceland)
'it', #Италия (Italy)
'je', #Джерси (Jersey)
'jm', #Ямайка (Jamaica)
'jo', #Иордания (Jordan)
'jp', #Япония (Japan)
'ke', #Кения (Kenya)
'kg', #Киргизия (Kyrgyzstan)
'kh', #Камбоджа (Cambodia)
'ki', #Кирибати (Kiribati)
'km', #Коморы (Comoros)
'kn', #Сент-Китс и Невис (Saint Kitts and Nevis)
'kp', #Северная Корея (Korea Norht)
'kr', #Южная Корея (Korea South)
'kw', #Кувейт (Kuwait)
'ky', #Каймановы острова (Cayman Islands)
'kz', #Казахстан (Kazakhstan)
'la', #Лаос (Laos)
'lb', #Ливан (Lebanon)
'lc', #Сент-Люсия (Saint Lucia)
'li', #Лихтенштейн (Liechtenstein)
'lk', #Шри-Ланка (Sri Lanka)
'lr', #Либерия (Liberia)
'ls', #Лесото (Lesotho)
'lt', #Литва (Lithuania)
'lu', #Люксембург (Luxembourg)
'lv', #Латвия (Latvia)
'ly', #Ливия (Libya)
'ma', #Morocco
'mc', #Монако (Monaco)
'md', #Молдова (Moldova)
'mg', #Мадагаскар (Madagascar)
'mh', #Маршалловы острова (Marshall Islands)
'mk', #Македония (Former Yugoslav Republic of Macedonia)
'ml', #Мали (Mali)
'mm', #Бирма (Burma) или Мьянма (Myanmar)
'mn', #Монголия (Mongolia)
'mo', #Макао (Macao)
'mp', #северные Марианские острова (Northern Mariana Islands)
'mq', #Мартиника (Martinique)
'mr', #Мавритания (Mauritania)
'ms', #Монтсеррат (Montserrat)
'mt', #Мальта (Malta)
'mu', #Маврикий (Mauritius)
'mv', #Мальдивы (Maldives)
'mw', #Малави (Malawi)
'mx', #Мексика (Mexico)
'my', #Малайзия (Malaysia)
'mz', #Мозамбик (Mozambique)
'na', #Намибия (Namibia)
'nc', #Новая Каледония (New Caledonia)
'ne', #Нигер (Niger)
'nf', #Норфолк (Norfolk Island)
'ng', #Нигерия (Nigeria)
'ni', #Никарагуа (Nicaragua)
'nl', #Нидерланды (Netherlands)
'no', #Норвегия (Norway)
'np', #Непал (Nepal)
'nr', #Науру (Nauru)
'nu', #остров Ниуэ (Niue)
'nz', #Новая Зеландия (New Zealand)
'om', #Оман (Oman)
'pa', #Панама (Panama)
'pe', #Перу (Peru)
'pf', #Французская Полинезия (French Polynesia)
'pg', #Папуа - Новая Гвинея (Papua New Guinea)
'ph', #Филиппины (Philippines)
'pk', #Пакистан (Pakistan)
'pl', #Польша (Poland)
'pm', #Сен-Пьер и Микелон. (St. Pierre and Miquelon)
'pn', #остров Питкэрн (Pitcairn Island)
'pr', #Пуэрто-Рико (Puerto Rico)
'ps', #Палестинские территории (Palestinian Territories)
'pt', #Португалия (Portugal)
'pw', #Палау (Palau)
'py', #Парагвай (Paraguay)
'qa', #Катар (Qatar)
're', #остров Реюньон (Reunion Island)
'ro', #Румыния (Romania)
'ru', #Россия (Russia)
'rw', #Руанда (Rwanda)
'sa', #Саудовская Аравия (Saudi Arabia)
'sb', #Соломоновы Острова (Solomon Islands)
'sc', #Сейшеллы (Seychelles)
'sd', #Судан (Sudan)
'se', #Швеция (Sweden)
'sg', #Сингапур (Singapore)
'sh', #остров Святой Елены (St. Helena)
'si', #Словения (Slovenia)
'sj', #острова Шпицберген и Ян-Майен (Svalbard and Jan Mayen Islands)
'sk', #Словакия (Slovakia)
'sl', #Сьерра-Леоне (Sierra Leone)
'sm', #Сан-Марино (San Marino)
'sn', #Сенегал (Senegal)
'so', #Сомали (Somalia)
'sr', #Суринам (Suriname)
'st', #Сан-Томе и Принсипи (Sao Tome and Principe)
'su', #территориальный домен CCCP
'sv', #Сальвадор (El Salvador)
'sy', #Сирия (Syria)
'sz', #Свазиленд (Swaziland)
'tc', #острова Тёркс и Кайкос (Turks and Caicos Islands)
'td', #Чад (Chad)
'tf', #Южные Французские Территории (French Southern Territories)
'tg', #Того (Togo)
'th', #Таиланд (Thailand)
'tj', #Таджикистан (Tajikistan)
'tk', #Токелау (Tokelau)
'tm', #Туркменистан (Turkmenistan)
'tn', #Тунис (Tunisia)
'to', #Тонга (Tonga)
'tp', #Восточный Тимор (East Timor)
'tr', #Турция (Turkey)
'tt', #Тринидад и Тобаго (Trinidad and Tobago)
'tv', #Тувалу (Tuvalu)
'tw', #Тайвань (Taiwan)
'tz', #Танзания (Tanzania)
'ua', #Украина (Ukraine)
'ug', #Уганда (Uganda)
'uk', #Соединённое Королевство (United Kingdom)
'um', #Американские Малые Внешние острова (US Minor Outlying Islands)
'us', #Соединенные Штаты Америки (United States)
'uy', #Уругвай (Uruguay)
'uz', #Узбекистан (Uzbekistan)
'va', #Ватикан (Vatican)
'vc', #Сент-Винсент и Гренадины (Saint Vincent and the Grenadines)
've', #Венесуэла (Venezuela)
'vg', #Британские Виргинские острова (British Virgin Islands)
'vi', #Американские Виргинские острова (US Virgin Islands)
'vn', #Вьетнам (Vietnam)
'vu', #Вануату (Vanuatu)
'wf', #острова Уоллис и Футуна. (Wallis and Futuna Islands)
'ws', #Самоа (Samoa)
'ye', #Йемен (Yemen)
'yt', #Майотта (Mayotte)
'yu', #Yugoslavia
'za', #ЮАР, Южно-Африканская Республика (South Africa)
'zm', #Замбия (Zambia)
'zw', #Зимбабве (Zimbabwe)
);
$re_urls = array(
#1. список запрещённых слов в доменах и субдоменах
array(
'.',
'~(?<![a-z@])
(?: sexy? (?>[-\d.][-a-z\d]*)* #! sexadecimal, sextan
| seks (?>[-\d.][-a-z\d]*)*
| xxx (?>[-\d.][-a-z\d]*)*
| free (?>[-\d.][-a-z\d]*)* #! freedom, freebsd
| porno? [-a-z\d.]*
| porevo [-a-z\d.]*
| putana [-a-z\d.]*
| prostitutk [-a-z\d.]*
| individualk [-a-z\d.]*
| orgazm [-a-z\d.]*
| viagra [-a-z\d.]*
| siski [-a-z\d.]*
| link [-a-z\d.]* #linkspace, linkfeed, etc.
#на бесплатных хостингах создают много рекламных и порно-сайтов
| host(?:s|ing)? (?>[-\d.][-a-z\d]*)* #! hostel, hostile
| [a-z\d]+host(?:s|ing)?
| \d+[mgt]b (?>[-\d.][-a-z\d]*)* #100mb.com, 1gb.ru
)
\.(?:' . implode('|', $domains1) . ')
(?![a-z\d])
~six',
),
#2. список запрещённых вхождений в ссылках
array(
':/',
'~ (?:htt?ps?|ftp)://?
[^\x20\r\n\t]*
(?: #порнуха
porno?
| porev[oa]
| eroti[kc]
| dosug
| gruppovuh
| razvrat
| seksapiln
| zanima[tlu]
| oralnym
| seksom
| klitor
| sisk[iao]
| pizda
| pisk[aio]
| minet
| orgazm
| grudi
| chlen
| vlagalische
| soset
| traha[euy]t
| drochit
| vaginaln
| putana
| prostitutk
| individualk
| lesbiy?ank
| starushk
| gomoseks
| gomosexy?
| devochk
| suchk[ia]
| telk[ia]
| seksualn
| gryazn[oiy]
| goryachenk
| gol[oiy]e
| gol[yi]h
| zrel[yi]m
| zadnicam
| fuck
| ebutsya
| iznasilovan
| sexy?zone
| (?<![a-z]) seks (?![a-z])
| (?<![a-z]) sexy? (?![a-z])
| (?<![a-z]) hu[yi] (?![a-z])
| (?<![a-z]) xxx (?![a-z])
| (?<![a-z]) ebut (?![a-z])
| (?<![a-z]) ebal (?![a-z])
| (?<![a-z]) free (?![a-z])
#услуги, реклама и прочее
| viagra
| znakomstv
| znamenitost
| arend[au]
| kupit
| prodat
| shop
| narkotiki
| nasilie
| izdevatelstv
| nikrofil
| mafia
| besplatno
| halyava
)
~six',
),
#3. список запрещённых доменов (которые пытались добавить на веб-сайт автоматические роботы-спаммеры)
array(
'.',
'~(?<![-a-z\d@]) #проверяем, чтобы домен небыл частью другого домена или e-mail адресом!
(?: #на бесплатных хостингах создают много рекламных и порно-сайтов
#список был получен из интернета и сформирован примерно так: preg_match_all() -> strtolower() -> array_unique() -> sort()
02g\.net
| 3dn\.ru
| 3x\.ro
| 5gigs\.com
| 6te\.net
| 99inch\.com
| addr\.ru
| affari\.to
| agava\.ru
| al\.ru
| alfamoon\.com
| alfaspace\.net
| awardspace\.com
| ayola\.net
| beplaced\.(?:com|de|ru)
| bestof\.ru
| bfast\.com
| bip\.ru
| bloomberg\.ru
| bobos\.ca
| boom\.mail\.ru
| boom\.ru
| bos\.ru
| by\.ru
| byu\.ru
| chat\.ru
| clan\.su
| dama-pik\.ru
| dem\.ru
| dotgeek\.org
| e2e\.ru
| eclub\.lv
| envy\.nu
| eomy\.net
| europeel\.com
| ezgoal\.biz
| f5k\.com
| far\.ru
| fatal\.ru
| flywebs\.com
| fortunecity\.com
| freevat\.com
| fud\.ru
| galactic-tech\.com
| h\d+\.ru
| ho\.com\.ua
| hobby\.ru
| hobi\.ru
| holm\.ru
| hop\.ru
| hopshot\.com
| hothostcity\.com
| hut\d*\.ru
| i7i\.ru
| indusfamily\.com
| intobservatory\.ru
| isolation\.cc
| iwebs\.ru
| jino(?:-net)?\.ru
| k70\.ru
| km\.ru
| lapin\.ru
| lgg\.ru
| medbox\.ru
| mesto\.ws
| mixa\.cc
| moy\.su
| mrezha\.ru
| my1\.ru
| mydot\.ru
| myopenweb\.com
| na\.by
| narod\.ru
| nixup\.com
| noka\.ru
| nx0\.ru
| o2g\.net
| onepage\.ru
| org(?:free)?\.ru
| orthodoxy\.[rs]u
| paltus\.ru
| pesni\.ru
| phpmysql\.ru
| polubomu\.ru
| pp\.net\.ua
| promostudio\.ru
| pud\.ru
| qksrv\.net
| ru-web\.net
| samanko\.com
| saxen\.net
| sbn\.bz
| sigom\.com
| sitecity\.ru
| sitebooth\.com
| spaceall\.de
| spaceports\.com
| sretenie\.ru
| subs\.ru
| takeinet\.ru
| medagent\.ru
| traktir\.(?:ru|org)
| tut\.by
| ucoz\.ru
| ueuo\.com
| vhoste\.ru
| vi[op]\.ru
| vip\.su
| vip(?:centr|pochta|shop|top)\.ru
| virtualave\.net
| wagoo\.com
| wagoo[12]\.com
| webeve\.com
| webforfree\.ru
| webprovider\.com
| webrise\.ru
| webservis\.ru
| wikispaces\.com
| ws\.co\.ua
| x5x\.ru
| xay\.ru
| xost\.ru
| xxh\.ru
| yadviga\.ru
| yard\.ru
| netfirms\.com
| saxen\.net
| sigom\.com
| zerver\.ru
| zportal\.info
#прочие домены, которые воспользовались услугами спамеров:
| love-give\.com
| klasspornd\.ru
| fotopornd\.ru
| mashki\.ru
| celerod\d*\.ru
| metrocartochka\.ru
| votetopornod\.ru
| ziza\.ru
| ssisi\.ru
| anuss\.ru
| blondino4ka\.ru
| coolpopa\.ru
| ebbat\.ru
| klitora\.ru
| sexi1\d*\.ru
| trah1\d*\.ru
| superblonde\.ru
| vibrosex\.ru
| vendingpmr\.ru
| freedrugs\.webng\.com
| x-strana\.ru
| znamenitut\.ru
| bargainchick\.com
| erotictrustf\.ru
| hotxugmo\.ru
| ubrlfcxzazou\.ru
| vixrdbwx\.ru
| pyporno\.com
| eblyautrom\.ru
| aromatizator\.ru
| hellepron\.ru
| porevojore\.ru
| csexprovids\.ru
| ofigetraxnul\.ru
| armaq\.ru
| sexy?zombi\.ru
| polonrotd\.ru
| snovadporn\.ru
| gbp-usd\.ru
| superintop\.info
| drochitut\.msk\.ru
| justfree\.com
| isnovaya\.ru
| opaturki.ru
| io\.ua
| creep\.ru
| viddler\.com
| 228duble\.com
| videocodezone\.com
| hotysex\.ru
| goldencards\.ru
| ynastrafi\.ru
| newdgal\.ru
| nojdimpor\.ru
| scribd\.com
| vigrapills\.info
| warec\.ws
| e-states\.ru
| pifinans\.ru
| djina\.ru
| ufsawo76\.ru
| allthemes\.ru
| dvdbum\.ru
| greenmapworld\.info
| adyma\.ru
| hot-books\.ru
| obnetdengah\.ru
| hostinfa\.ru
| uznovosti\.ru
| onguvi\.ru
| sellmyweb\.ru
| medicininfo\.ru
| brightworks\.ru
| bugeokact\.ru
| cnupthoe\.ru
| cydba\.ru
| polet-kosmos\.net
| correctdiet\.ru
| kseon\.org
| forgsms\.info
| workidea\.ru
| kluchniza\.ru
| avant4wd\.ru
| vistaaero\.ru
| votpodnw\.ru
| geynewdi\.ru
| gostrf\.ru
| forsmi\.ru
| kevser\.ru
| viptelefon\.su
| jtlogistic\.ru
| callvipgirls\.com
| cekcanem\.ru
| wmmail\.ru
| dnt\.ru
| inedvig\.ru
| masax\.ru
| superrike\.ru
| samolety-poezda\.ru
| stroyshik\.ru
| sweet-souvenirs\.ru
| snovumia\.ru
| d-e-v-u-s-h-k-a\.ru
| m-a-l-c-h-i-k-i\.ru
| sexyfly\.cn
| men-erectile\.info
| vigra-rx\.info
| altonika-td\.ru
| krim-dom\.ru
| legion-td\.ru
| flat1\.ru
| nowtec\.ru
| opattakdel\d+\.ru
| detoms\.ru
| rusbyte\.com
| bybyw\.com
# IP адреса
| 222\.73\.37\.253
)
(?![-a-z\d.]) #проверяем, чтобы домен небыл частью другого домена!
~six',
),
);
#шаг 1.
foreach ($re_urls as $a) if (strpos($s, $a[0]) !== false && preg_match($a[1], $s, $m))
{
$found = $m[0];
return true;
}
#шаг 2.
#ловим обман типа "viaggra" -- убираем повторяющиеся символы
$s = preg_replace('/([\x00-\x7f])\\1+/s', '$1', $s);
#ловим обман типа "s-i-s-k-i" -- убираем добавочные символы между буквами, но аккуратно обрабатываем слова типа "my-ski".
$s = preg_replace('/[-_]([a-zA-Z\d])(?=[\x00-\x2f\x3a-\x40\x5b-\x60\x7b\x7f])/s', '$1', $s);
unset($re_urls[2]); #удаляем список запрещённых доменов
foreach ($re_urls as $a) if (strpos($s, $a[0]) !== false && preg_match($a[1], $s, $m))
{
$found = $m[0];
return true;
}
return false;
}
?>