Jump to content

Gold Dragon

User
  • Posts

    367
  • Joined

  • Last visited

Everything posted by Gold Dragon

  1. Я как-то в одном проекте заказчику понадобилось устроить голосование, но максимально исключить накрутки и я использовал следующее- учёт IP - учёт названия браузера - учёт версии браузера - учёт расширения экрана - уникальное число (md5(time)) всё это учитывал отдельно в базе данных и также в куках. При этом заносилась и дата-время голосования При этом заказчик получил возможность устанавливать степень проверки. Я в данном случае определил их десять, т.е. в настройках можно было установить на сколько "жестоко" контролировать 1 - совпадение IP с данными из базы 2 - совпадение IP с данными из базы + существует кук с такими же данными 3 - ip + название браузера 4 - ip + название браузера + такие же данные в существующем куке ... и так далее 10 - полное совпадение всех данных как в таблице так и куках Плюс ко всему дата-время играло тоже роль контроля, можно было устанавливать ограничение по времени голосования. Так что хоть чуть-чуть но можно было отслеживать и регулировать Гостей Но всё это больше похоже на "большое извращение" Но желание заказчика - закон.. У себя я Гостям даю очень мало прав и считаю для идентификации достаточно IP+browser
  2. первая функция по возможности максивально пытается найти IP адрес из разных переменных $_SERVER и приводит (проверяет) на соответствие стандарту Вторая функция определяет агента и приводит его в правильный вид (некоторые браузеры вносят путаницу в отображение версий). Просто нет чёткого формата как и что отображать, а производители не особо этим озабочены.. А вообще у функции есть два дополнительных параметра gerUserBrowser($param1, $param2) $param1 - "browser" - получить только название - "version" - получить только версию - "both" (или всё что угодно) - получить название и версию браузера (по умолчанию) $param2 - разделитель, через который будет название будет отделено от версии (по умолчанию пробел)
  3. не заостряй особого внимания просто вставь эти функции где-нибудь в коде и вместо $_SERVER['REMOTE_ADDR'] пиши getIp() вместо $_SERVER['HTTP_USER_AGENT'] пиши gerUserBrowser()
  4. Всё равно не понятно для активации чего Активация активации рознь... Можно к примеру просто обойтись проверкой что перед тобой человек, а не бот и попросить пройти простое подтверждение через картинку-код. А в других случаях гостям вообще нечего делать, пусть полноценно проходят регистрацию.. Кстати, советую использовать мои функции для получения IP и версии браузера, они более корректно это определят, иначе погрешность ещё более возрастёт. Я не ради рекламы просто постоянно этим пользуюсь и на сегодня я считаю это самый совершенный код... ошибок минимум
  5. web-mindfreak, так тебе для чего учитывать гостей? для online, в опросах/голосованиях, для контроля флуда в комментариях...?
  6. Сессия это временное решение пока работает браузер и при следующем заходе сессия будет другая. Если использовать сессию как идентификатор, то тоже не совсем правильно получится, куки очищаются. Хотя автор не совсем чётко пояснил как долго нужно учитывать Гостя Если только для "Кто в online" то сессия самый идеальный вариант, для всего остального недостаточно..Идентификатор должен быть более-менее постоянный. Конечно самый идеальный вариант привязаться к "железу", например макадрес сетевой карты :0 но это не реально.. Самый оптимальный вариант - это IP, но тоже не вариант так как есть и динамические, есть и общий на организацию и т.п. Самое постоянное это расширение экрана + версия браузер. Хотя браузеры часто начали обновляться в последнее время. Наверное правильное решение всё это комбинировать. Например, учитывать IP+браузер и оставлять отметки в куках, но не идентификатор сессии, а что-то такое что можно ещё не только проверить на существование, но и сравнить с чем-то. Тем самым мы можем увеличить количество проверок. PS я так понял, если предложить вариант решения и приложить подробный код, то сразу получаешь -1? Просто интересно за что?
  7. вот я писал как-то для примера сайт-визитку полностью на Ajax http://forum.vingrad.ru/index.php?showtopic=330866&view=findpost&p=2353552 Единственная проблема, там я не задавался целью менять ещё и адрес в адресной строке браузера или входить по адресу, но думаю это не трудно сделать на том же jQuery
  8. Я бы всё это реализовал через jQuery (ajax). посмотри это например http://xhtml.co.il/ru/jQuery/jQuery.ajax
  9. А может просто в самом движке ошибка и кто его делал просто два раза вставил подключение языка?
  10. самый оптимальный вариант это воспользоваться парой IP+Браузер и всё это перевернуть в MD5. Шансов что попадутся одинаковые пользователи с одинаковыми IP и версией браузера очень и очень маленький.. вот как определить IP более полно function getIp() { $serverVars = array("HTTP_X_FORWARDED_FOR", "HTTP_X_FORWARDED", "HTTP_FORWARDED_FOR", "HTTP_FORWARDED", "HTTP_VIA", "HTTP_X_COMING_FROM", "HTTP_COMING_FROM", "HTTP_CLIENT_IP", "HTTP_XROXY_CONNECTION", "HTTP_PROXY_CONNECTION", "HTTP_USERAGENT_VIA"); foreach ($serverVars as $serverVar) { if (!empty($_SERVER) && !empty($_SERVER[$serverVar])) { $proxyIP = $_SERVER[$serverVar]; } elseif (!empty($_ENV) && isset($_ENV[$serverVar])) { $proxyIP = $_ENV[$serverVar]; } elseif (@getenv($serverVar)) { $proxyIP = getenv($serverVar); } } if (!empty($proxyIP)) { $isIP = preg_match('|^([0-9]{1,3}\.){3,3}[0-9]{1,3}|', $proxyIP, $regs); $long = ip2long($regs[0]); if ($isIP && (sizeof($regs) > 0) && $long != -1 && $long !== false) return $regs[0]; } return $_SERVER['REMOTE_ADDR']; } вот как определить Браузер более полно function gerUserBrowser($param = 'both', $separator = ' ') { $agent = $_SERVER['HTTP_USER_AGENT']; preg_match("/(MSIE|Opera|Firefox|Chrome|Version|Opera Mini|Netscape|Konqueror|SeaMonkey|Camino|Minefield|Iceweasel|K-Meleon|Maxthon)(?:\/| )([0-9.]+)/", $agent, $browser_info); list(, $browser, $version) = $browser_info; if (preg_match("/Opera ([0-9.]+)/i", $agent, $opera)) return 'Opera ' . $opera[1]; if ($browser == 'MSIE') { preg_match("/(Maxthon|Avant Browser|MyIE2)/i", $agent, $ie); if ($ie) return $ie[1] . ' based on IE ' . $version; return 'IE ' . $version; } if ($browser == 'Firefox') { preg_match("/(Flock|Navigator|Epiphany)\/([0-9.]+)/", $agent, $ff); if ($ff) return $ff[1] . ' ' . $ff[2]; } if ($browser == 'Opera' && $version == '9.80') return 'Opera ' . substr($agent, -5); if ($browser == 'Version') return 'Safari ' . $version; if (!$browser && strpos($agent, 'Gecko')) return 'Browser based on Gecko'; switch ($param) { case "browser": $result = $browser; break; case "version": $result = $version; break; default: $result = $browser . strip_tags($separator) . $version; } return $result; } Остаётся только получить данные, сложит и преобразовать в MD5, например так $id_user = md5(getIp() . gerUserBrowser()); Но если и этого мало, то добавь к примеру расширение монитора
  11. Вот сделал небольшое пояснение Код поля ввода <div id="kab-mod-search"> <input name="kabsearchword" id="kabsearchword" maxlength="50" type="text" size="25" value="" /> <div id="kabsearchform"></div> </div> <script type="text/javascript" src="mod_kabsearch.js"></script>'; файл mod_kabsearch.js function kab_get() { $('#kabsearchform').fadeOut(300, function(){ a = $("#kabsearchword").val(); $.get(location.protocol+'//'+location.hostname+'/ajax.php?task=mosearch', {str : a}, function(data) { $('#kabsearchform').html(data).fadeIn(600); return false; }); }); } $("#kabsearchword").keyup(function(){ if(kab_get.timeout){ clearTimeout(kab_get.timeout); } kab_get.timeout = setTimeout(kab_get,500); }); $("#kabsearchword").blur(function() { $("#kabsearchform").fadeOut(600); $("#kabsearchword").val(''); }); файл ajax.php <?php $task = (isset($_GET['task'])) ? $_GET['task'] : ''; switch ($task) { case 'mosearch': $str = (isset($_GET['task'])) ? strip_tags(trim($_GET['str'])) : ''; moSearch($str); break; default: echo ''; } function moSearch($str) { $result = ''; // получаем общее количество данных из базы // и присваиваем их переменной $total // получаем данные из базы с фильтром $str // и присваиваем их переменной $rows // листаем то что получили, но не всё, а например первые 10 // и выводим их допустим в использую эту структуру $result .= ' <div class="mosearchresult" id="mosearchresult-'.$rows->ИДЕНТИФИКАТОР_ЗАПИСИ.'"> <a href="ССЫЛКА_НА_ПОКАЗ ПОЛНОЙ ИНФОРМАЦИИ">'.$rows->НАЗВАНИЕ_ЧЕГО_ТО.'</a> </div>'; // Далее формируем красивую форму $result .= ' <div class="mosearchresulttotal"> '.$result.' <p>всего найдено: '.$total.'</p> <p><a href="ССЫЛКА_НА_РАСШИРЕННЫЙ_ПОИСК">расширенный поиск</a></p> </div>'; echo $result; } если что не понятно, спрашивай, поясню. и вот стили... #kab-mod-search { margin: 0 auto; width: 200px; } #kabsearchword { background: #f4f4f4; border: solid 1px #a3a3a3; padding: 5px; font-family: Arial; font-weight: bold; -webkit-box-shadow: inset 0 2px 3px rgba(0, 0, 0, .1); -moz-box-shadow: inset 0 2px 3px rgba(0, 0, 0, .1); box-shadow: inset 0 2px 3px rgba(0, 0, 0, .1); -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; -webkit-appearance: none; /* reset webkit search style */ background-image: url("/components/com_gdkabak/images/search.png"); background-position: center; background-repeat: no-repeat; } #kabsearchword:focus { background: #ffffcc } #kabsearchform { display: none; position: absolute; background-color: #fafafa; border: solid 1px #a3a3a3; padding: 5px 10px; font-family: Arial; -webkit-box-shadow: inset 0 2px 3px rgba(0, 0, 0, .1); -moz-box-shadow: inset 0 2px 3px rgba(0, 0, 0, .1); box-shadow: inset 0 2px 3px rgba(0, 0, 0, .1); -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; -webkit-appearance: none; /* reset webkit search style */ z-index: 99; line-height: normal; width: 190px; } .mosearchresult { width: 100%; padding: 3px; text-align: left; border-bottom: #eeeeee solid 1px; background-image: url("/components/com_gdkabak/images/fonsearch.png") } .mosearchresult a, .mosearchresulttotal a { font-size: 10pt; color: #e0742c; font-weight: bold; text-decoration: underline } .mosearchresulttotal { font-size: 10pt; color: #000000; font-weight: bold; text-decoration: none; } .mosearchresult a:hover, .mosearchresulttotal a:hover { color: #000000; text-decoration: none } .mosearchresult span { font-size: 8pt; color: #999999; }
  12. в данной ситуации главное чтобы браузеры на случай "но если вдруг..." реагировали соответственно. Хотя на LI все браузеры реагируют вроде одинаково, т.е. это получаются не связанные маркированные пункты списка
  13. всё таки новая спецификация написана более непонятно... Ну или не привычно...
  14. SelenIT, т.е. ты хочешь сказать что если не разрешено, то запрещено? sigma77, да нет... скрипт я имею не Javascript, а PHP, так что контент нормальный на выходе
  15. ну я сейчас вообще стараюсь всё делать по 5-й спецификации.. Просто в одном скрипте у меня по ошибке не было в LI родителя, а сайт отлично работает и валидатор молчит.. Насчёт глючит... только Осёл как всегда
  16. хотя ни один браузер при любой спецификации не глючит
  17. погонял в валидаторах в разных спецификациях.. HTML5 запросил родителя. Хотя всё равно не могу понять, если на сайте, то не обращает внимание
  18. я понимаю что на меня сейчас крутые наезды типа ленивый и т.п. Но я не нашёл слова ИСКЛЮЧИТЕЛЬНО, но нашёл слово Otherwise (иначе) и также нет слова НЕЛЬЗЯ или ЗАПРЕЩЕНО.. с этим и возник вопрос
  19. а если читать дальше у меня с английским не очень..
  20. прямого запрета я не нашёл.. Валидатор ничего не дал.. Я так понимаю если его просто использовать, то получится несвязанный маркированный список, вернее его элемент.. На TD валидатор ругается
  21. да в том то и дело не могу понять.. На сколько я понял английский.. этот тэг используется внутри других тэгов.. Если не используется внутри, то он становится вне списка...
  22. Валидно ли использовать тэг LI без UL, OL или MENU ?
  23. Inessa, может всё таки попробуешь эту конструкцию "=?utf-8?b?".base64_encode(...)
  24. так у меня такая и стоит.. И без разницы где переменную создавать. главное чтоб до mail() стояла
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy