LINUX.ORG.RU

капча и бесконечный редирект

 , , ,


0

1

Здравствуйте.

Возникла необходимость поставить капчу при входе на страницу. Я с этим никогда не сталкивался. Порылся в интернете и наваял следующий алгоритм:

  1. Чувак запрашивает файл картинка.гиф
  2. Апач редиректит его на файл капча.пхп
  3. Скрипт рисует собственно форму и отдаёт её чуваку.
  4. Чувак вводит что-то и нажимает Отправить (снова на файл капча.пхп).
  5. Скрипт проверяет соответствие, и, если введено правильно, хедером отдаёт вожделенную картинку.гиф

И апач снова редиректит её на капчу.пхп...

Что я неправильно делаю?

Я могу вместо хедера использовать команду Вложить, но тогда в адресной строке будет стоять имя скрипта, а это мне не надо.

Перемещено beastie из general

И апач снова редиректит её на капчу.пхп

Он должен это делать не всегда, а только для пользователей, которые еще не ввели правильную капчу. Подумай, как ты будешь реализовывать это условие.

amomymous ★★★ ()

1. Чувак запрашивает файл картинка.гиф 2. Апач редиректит его на файл капча.пхп

За такое сразу убивать надо ваще-то. Если запрошен картинка.гиф, это значит что юзеру нужен картинка.гиф, а не какое-то говно. Если юзеру отдаётся не картинка.гиф, а говно - то это спам по определению. А спамеры должны сдохнуть.

Редиректы они не для того, чтобы спамить были придуманы, вообще-то, а чтобы можно было на серваке файл в другое место положить, например, не нарушая работу старых сцылок.

Но вообще, конечно, спамерам в изобретательности не откажешь, да. Использовать капчу, которая была придумана как защита от спама, для производства спама - это заслуживает некоторого уважения. Что, впрочем ничуть не уменьшает всеобщую ненависть к спамерам. :)

Stanson ★★★★★ ()
Последнее исправление: Stanson (всего исправлений: 1)

1. Чувак запрашивает файл картинка.гиф 2. Апач редиректит его на файл капча.пхп

Вскройтесь там у себя.

Deleted ()
Ответ на: комментарий от andricum

Обычно капчей защищают не отдельную картинку, а страницу. Тогда условие можно вставить в код этой страницы. Когда юзер вводит капчу, это сохраняется в сессионной переменной.

amomymous ★★★ ()
Ответ на: комментарий от andricum

А скрипт знает URL картинки?

Если знает, можно отдавать картинку скриптом:

<?php
// если проверка капчи не пройдена - выдать ошибку
// иначе - вывод картинки
header('Content-type: image/gif');
echo file_get_contents('image.gif');
amomymous ★★★ ()
Последнее исправление: amomymous (всего исправлений: 1)
Ответ на: комментарий от amomymous

Функцию file_get_contents я ещё не изучал, а вот с include $uri1; всё работает. Неприятно только то, что в адресной строке браузера вместо адреса картинки чувак увидит адрес пхп-скрипта.

Не по теме: то ли у меня браузер устарел - как тут на форуме спасибо сказать,я не вижу никаких кнопок

andricum ()
Ответ на: комментарий от andricum

Неприятно только то, что в адресной строке браузера вместо адреса картинки чувак увидит адрес пхп-скрипта.

mod_rewrite из апача в помощь

Pinkbyte ★★★★★ ()
Ответ на: комментарий от andricum

Значит, я не имею права проверять, робот ко мне ломится или человек?

А какая разница? Для картинки-то? Я бы понял, если бы там какая-нибудь форма постинга сообщения была, или что-то аналогичное, но картинка, едрить! А если оно будет где-то как <img> вставлено - то просматривающий страницу ваще не увидит эту картинку.

Stanson ★★★★★ ()
Ответ на: комментарий от Pinkbyte

Действительно, я об этом как-то позабыл.

С др. стороны, я не понимаю, как это реально сделать? Адрес пхп-скрипта я знаю, но у картинки адрес может быть любой, тысячи их... Как написать правило?

То есть при запросе картинки

RewriteCond %{REQUEST_URI} (картинка1.gif|картинка2.gif|картинка3.gif)
RewriteCond %{HTTP_REFERER} ^$
RewriteCond %{HTTP_USER_AGENT} !(yandex|google|rambler|msn|bing|yahoo|nigmamail) [NC]
RewriteRule ^(.*)$ /test.php [L]

и test.php должен выдать картинку. КАК?

andricum ()
Ответ на: комментарий от Stanson

Ну, как бы это культурно объяснить... На сайте 20 человек посетителей в день, а картинки тырятся широким потоком. А интернет-канал у меня за 240 руб. Т.е. реальному посетителю бывает вообще не пропихнуться

andricum ()
Ответ на: комментарий от andricum

Такие проблемы вовсе не капчей решают вообще-то. Далеко не факт, что загрузка канала вообще уменьшится, а нагрузка на сервак возрастёт 100%.

И я вот не понял - что значит «картинки тырятся». Не хочешь чтобы картинки скачивали - так не выкладывай их. Хочешь ограничить доступ - логин-пароль сделай.

Stanson ★★★★★ ()
Ответ на: комментарий от Stanson

У меня случай был. Выложил на сайт одну страницу, утром проснулся - тысяча посетителей за сутки, не считая реальных роботов, сервер висит. Поставил капчу на неё (простой алерт с кнопкой ОК), количество заходов на сайт уменьшилось в 20 раз, и стало всё хорошо. Так что на эту тему я при своём мнении.

andricum ()
Ответ на: комментарий от andricum

Ты вообще в курсе, как это вот всё работает? :) Алерт он на страничку поставил :) Сервер у него от тыщи в сутки висит. :) Ну цирк же.

Stanson ★★★★★ ()
Ответ на: комментарий от Stanson

Я-то не в курсе, потому и пришёл на форум.

Да и Вы, видать, не в курсе, как алертом капчу сделать, :)

А сервер у меня 83-го г. выпуска, да и на нём кроме апача ещё много чего работает.

andricum ()
Ответ на: комментарий от andricum

А сервер у меня 83-го г. выпуска, да и на нём кроме апача ещё много чего работает.

Я даже боюсь спросить.... Это PDP-11 какой-нибудь, или целый VAX? Ну в ZX Spectrum я бы поверил, но вот апач на нём запустить конечно можно, через огроменную жоппу с костылями (маньяческий софтверный эмулятор какого-нибудь MIPS + напихать ему страничную память), но скорость будет совсем унылая.

Stanson ★★★★★ ()
Ответ на: комментарий от andricum

Я фигею.

Дядя Фёдор, ты неправильно бутерброд ешь.

Ты же вообще не с того конца проблему решаешь. Рассказывай чего у тебя там на самом деле.

Stanson ★★★★★ ()
Ответ на: комментарий от andricum

Ну так ты не говоришь что у тебя за конфигурация железа, сети и т.п.

Одно дело - если канал тонкий, совсем другое - если железо слабое, третье - если и то и другое сразу, четвёртое - если канал, например, нормальный, но с потерями и т.п.

Если это ZXSpectrum воткнутый в нормального проводного провайдера, то имеет смысл поднять на роутере или отдельном сервере страничку-буфер, с которой уже и пускать народ на ZX, например. И пускать на ZX только IP тех клиентов которые буферную страничку прошли успешно, причём разрешать доступ например посредством iptables на роутере, чтоб ни одного лишнего байта не просочилось на раритет.

Stanson ★★★★★ ()
Ответ на: комментарий от Stanson

Это для меня слишком сложно, так сказать, в проекте. Меня первоначально интересовал только вопрос: как делается капча. КАК ЭТО ВООБЩЕ РАБОТАЕТ? И почему я смог сделать для хтмл-страницы, но не могу сделать то же самое для картинки?

andricum ()
Ответ на: комментарий от andricum

Капча - по-любому, отдача браузеру странички сгенерённой скриптом с уникальным идентификатором (который не показывается юзеру, но запоминается сервером), неким объектом для идентификации (картинка, вопрос, стишок и т.п.) связанным с идентификатором и формой ввода для юзера. После ввода ответа работает ещё один скрипт, который сравнивает ответ юзера с правильным ответом который указан для идентификатора использованного для генерации первой странички.

Т.е. по-любому капча приводит к двум запускам скрипта и двум выдачам страницы, что скорее всего по размеру и ресурсам будет накладнее чем выдача картинки. Поэтому вешать это на условный ZX мягко говоря не лучшая затея.

Stanson ★★★★★ ()
Ответ на: комментарий от andricum

о у картинки адрес может быть любой, тысячи их

регекспы и подстановка, не?

Осиль уже маны по mod_rewrite, задача у тебя среднего уровня, не hello world, но и не суперсложная

Pinkbyte ★★★★★ ()
Ответ на: комментарий от Pinkbyte

Короче, сотворил следующее:

Апач:

	RewriteCond %{REQUEST_URI} (test.gif|test.jpg)
	RewriteCond %{HTTP_REFERER} ^$
	RewriteCond %{HTTP_USER_AGENT} !(yandex|google) [NC]
	RewriteRule ^(.*)$ /test.php [L]

Файл test.php:

<?php 
	$test = 	($_SERVER['SCRIPT_URL']); 
	$test1 = substr($test,1);
	$test2 = $_POST['prompt']; 
	if($test2=="2") { echo '$test1'; } 
	else { 
		echo '
			<FORM action="';
		echo $test1;
		echo '"	 	method=post>
				<INPUT type=text name=prompt size=5 maxlength=2>
				<INPUT type=submit value="ОК">
				</FORM>';  }  ?>

Работает, ясен пень, неправильно. При запросе test.gif|test.jpg я попадаю-таки на test.php и вижу форму. Но привводе чего угодно всё равно открывается картинка. Я думаю, проблема в переменной $test2 = $_POST , т.к условие if($test2==«2») не работает, echo '$test1' не выполняется.

andricum ()

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

nixbrain ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.