Jest zębatka :-)
Rozważam różne pomysły, ale chciałbym jak najmniej angażować użytkownika.
Na razie wychodzi mi, że bez wymuszenia na użytkowniku jakiejś dodatkowej akcji (poza układaniem) - to zawsze można obejść.
Gdyby było tak, że te cyfry (literki) w Twoim pomyśle są przypisane na stałe, to po ich odgadnięciu system pada
(chyba, ze czego nie widzę - to podpowiedz).
Więc nie mogą być na stałe (czyli losowane). Ale wtedy serwer nie wie z czym porównać.
Widzę dwie możliwości - serwer wysyłając zdjęcie wysyła również losowanie (może być zakodowane), ale odgadnięcie sposobu kodowania rozbija system.
Lub - losowanie jest odsyłane do serwera (również w jakiś sposób zakodowane), ale sytuacja jest jak wyżej (po odgadnięciu sposobu kodowania leżymy).
Chyba, żeby uzależnić układ np. od daty, godziny, itp. Wtedy przeglądarka i serwer znając datę i godzinę mogą sobie wygenerować ten sam układ i go porównać.
Tu odgadnięcie układu niewiele daje, bo za godzinę układ by się zmienił. Ale odgadnięcie algorytmu generowania układu znowu sprawę psuje. A algorytm musiałby być przesłany do klienta, więc znów można to podejrzeć.
Widzę sposób z zaangażowaniem użytkownika. Serwer stawia na losowym puzzlu kropkę.
Polecenie jest: "zacznij układać od puzzla z kropką".
Wtedy skrypt łamiący musiałby analizować obraz i wybrać ten z "kropką", co chyba nie byłoby łatwe przy odpowiednio spreparowanych puzzlach.
Ale - po pierwsze, jeśli puzzli jest mało (4), to szansa na przypadkowe trafienie jest duża (gdyby skrypt łamiący zastosował rozwiązanie siłowe).
Po drugie - jest to angażowanie użytkownika w "odgadywanie" - czyli wracamy do klasycznych rozwiązań.
Zadanie ogólne jest "jak odróżnić inteligencję naturalną od sztucznej?"
Wydaje się, że problem ułożenia puzzli (zwłaszcza np. okrągłych) nadaje się na taki test, ale jeszcze nie wiem, jak to zaimplementować.
Szczerze powiedziawszy nie zajmowałem się nigdy takimi zabezpieczeniami. Tak mi przy okazji prac na grą przyszło do głowy, ale muszę to zgłębić.