Korzystając z okazji przymusowego nieróbstwa związanego ze zwolnieniem lekarskim postanowiłem dokończyć pracę nad Blogiem.
A że nie chciało mi się bawić z instalacją Flex Builder'a na Ubuntu przepisałem całość na "gołego" PHP'a.
W czasie prac nad nowym wyglądem postanowiłem zastąpić swoją bardzo niedoskonałą Captchę zabawką ze stajni Googla noszącym nazwę "ReCaptchia". Jest to rozwiązanie darmowe, bardzo skuteczne(większość udanych masowych łamań tego systemu opiera się na pracy Hindusów) , posiada wsparcie dla osób niewidomych, a na dodatek (jak mi się zdawało) jest łatwe w instalacji na każdej stronie.
O ile z wyświetleniem dialogu nie było większych problemów:
echo recaptcha_get_html($publicKey);
O tyle weryfikacja poprawności wprowadzonego obrazka okazała się znacznie trudniejsza ponieważ standardowe wywołanie:
$resp = recaptcha_check_answer ($privateKey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]); if($resp->is_valid) { //TODO: Obsługa zapisu } else { // TODO: Wyświetlić komunikat o błędzie }
Sprawiała że moja strona kończyła się komunikatem 'Could not open socket'.
Po dłuższym śledztwie okazało się że komunikat ten pojawia się wielu użytkownikom a błąd z nim związany jest nierozwiązany od dwóch lat link.
Jest on bardzo często spowodowany blokowaniem przez firmy hostujące połączeń wychodzących na port 80. Ponieważ walka z OVH o otwarcie portu wydała mi się nie do wygrania (Błąd fsockopen Connection refused jest dość częsty na stronach hostowanych przez tą firmę – wystarczy wpisać ten komunikat w google) postanowiłem poszukać obejścia, którym okazały się być serwery Proxy, które przekierowują połączenie z jednego portu na inny port innego serwera.
Recaptchia nie wspiera Proxy na szczęście biblioteka PHP która zapewnia dostęp do Recaptchia jest w pełni Open Source'owa więc otworzyłem ją sobie i zmieniłem metodę _recaptcha_http_post dodając jej parametry $proxyHost = null i $proxyPort = null do których można przekazać adres i port serwera proxy. Oczywiście musiałem zmodyfikować też ciało funkcji dodając kod modyfikujący treść zapytania HTTP, oraz musiałem zmodyfikować funkcję recaptcha_check_answer tak aby mogła przekazać informacje na temat proxy do ww. metody.
Ostatecznie kod sprawdzający poprawność tekstu z obrazka wygląda następująco:
$resp = recaptcha_check_answer ($privateKey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"], array(), '190.90.128.233', #adres serwera proxy 8080);
Moje zmiany w bibliotece są wysłane do googla jako załącznik do Zadania nr 80 w projekcie Recaptcha mam nadzieję że zostaną włączone do oficjalnej wersji tej biblioteki.