Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавяне: Visual Captcha порт PHP > Python #32

Open
antitoxic opened this issue Jul 27, 2013 · 2 comments
Open

Добавяне: Visual Captcha порт PHP > Python #32

antitoxic opened this issue Jul 27, 2013 · 2 comments
Assignees
Labels

Comments

@antitoxic
Copy link
Member

Порт на http://visualcaptcha.net/ от PHP на Python.

@ghost ghost assigned antitoxic Jul 27, 2013
@antitoxic
Copy link
Member Author

Ще използвам . нотацията за конкатанация понеже копирам примерните кодове от php.

Как работи VisualCaptcha

  1. Проверява типа на формата - вертикална или хоризонтална. Типа на формата определя колко възможни отговора има. Ако има входяща променлива css_type и е равна на 1 тогава е вертикална.
  2. Ако е пратена променлива form_submit и е равна на 1 тогава се проверява captcha-та, иначе се показва. Това при нас може да са просто 2 action-а POST и GET.

И в двата случая, дали ще се показва или проверява се иницизлизира следното:

  1. Създава salt в следната форма 'emotionLoop::' .<IP адрес на потребителя> . '::visualCaptcha::'
  2. Създава hash ползвайки солта, и число свъразано с това колко е часа и после цялото го минава през sha1: sha1( $this->hashSalt . <загръгля нагоре( <unix timestamp> / 1800 )>. '::tick' );
  3. Опционално приема и задава променливи:
    • formId (frm_captcha default)
    • type (0 default)
    • fieldName (captcha-value default)
    • accessibilityFieldName (captcha-accessibility-value default)
  4. Създава mapping ( речник) за captcha изображеняита. Mapping-а е от типа nickname => (<път до снимката>, <заглавие>).
  5. Още 1 такъв мапинг. На пътя до аудио файл и това което се казва.

Показване

  1. Избира се нова стойност като се разбъркват mapping-а на отговорите.
  2. Взима се предвид предишно генерирания хеш. Да го наречем хеш1.
  3. Създава се нов хеш от хеш1 под формата: <хеш1> . '::' . microtime() и цялото това минава под sha1. Нека това е хеш2.
  4. Запазва се новия hash в сесията под името <хеш1> . '::requestSession'
  5. Според типа на формата (вертикална или хоризонталнаа се задава лимит. Лимита е 5 ако е хоризонтална. Лимита е 4 ако е вертикална. Лимита определя колко възможни отговора ще има.
  6. Избира се число от 1 до лимита (или от 0 до лимита-1) което ще определя правилния отговор.
  7. Обикаля се мапинга с разбърканите отговори. Взимат се първите 4 или 5 като nickname-а на отговора, се криптира под формата: <предишно генерирана сол>. <загръгля нагоре( <unix timestamp> / 1800 )>. '::encrypt::' . <nickname> . '::' . <хеш2>
  8. Маркира се правилния отговор от избраните като се запазва криптирания nickname, в сесията под името <хеш1>., както и се запазва към променливи на класа.
  9. Разбъркват се избраните отговори
  10. Запазват се опциите направо като масив във сесията под името: <хеш1>.'::options'
  11. Разбърква се мапинга с аудио файловете.
  12. Няма лимит за възможните отговори на аудио записите, тоест лимита от 4 или 5 не важи тук.
  13. Избира се произволно правилен отговор и се криптира nickname-а му по същия начин както и преди.
  14. Записват се криптирания отговор в сесията под името <хеш1> . '::accessibility'
<script>
window.vCVals = {
    'f': '{{formId}}',
    'n': '{{fieldName}}',
    'a': '{{accessibilityFieldName}}'
};
</script>
<div class="eL-captcha type-{{тип форма}} clearfix">
    <p class="eL-explanation type-{{тип форма}}"><span class="desktopText">Drag the <strong>{{заглавие на правилния отговор}}</strong> to the circle on the side.</span><span class="mobileText">Touch the <strong>{{правилния отговор}}></strong> to move it to the circle on the side.</span></p>
    <div class="eL-possibilities type-{{тип форма}} clearfix">

{{  foreach ({{възможни отговори}} as {{индекс на възможен отговор}} => {{заглавие на възможен отговор}})   }}

        <img src="{{базов път до скрипта който показва картинките}}?index={{индекс за възможен отговор }}&amp;r={{unix timestamp}}" class="vc-{{индекс за възможен отговор + 1}}" data-value="{{заглавие на възможен отговор}}" alt="" title="">

endforeach;}}
    </div>
    <div class="eL-where2go type-{{тип форма}} clearfix">
        <p>Drop<br>Here</p>
    </div>
    <p class="eL-accessibility type-{{тип форма}}"><a href="#" title="Accessibility option: listen to a question and answer it!"><img src="images/accessibility.png" alt="Accessibility option: listen to a question and answer it!"></a></p>
    <div class="eL-accessibility type-{{тип форма}}">
        <p>Type below the <strong>answer</strong> to what you hear. Numbers or words:</p>
        <audio preload="preload">
            <source src="{{базов път до скрипта който доставя аудиото}}?t=ogg&amp;r={{unix timestamp}}" type="audio/ogg">
            <source src="{{базов път до скрипта който доставя аудиото}}?t=mp3&amp;r={{unix timestamp}}" type="audio/mpeg">
            Your browser does not support the audio element.
        </audio>
    </div>
</div>

Скриптът за доставяне на аудиото

Пътя до файла се взима от сесията, където беше запазен повреме на избор на правилния аудио отговор. Според типа се доставя mp3 или ogg

Подават се следните header-и:

header( 'Pragma: public' );
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header( 'Cache-Control: private', false );
header( 'Content-Type: ' . <'audio/ogg' или 'audio/mpeg'>);
header( 'Content-Transfer-Encoding: binary' );
header( 'Content-Length: ' .  <размер на фйала в bytes>);

И се прочита файла

Скриптът за показване на картинка

Пътя до файла се взима според индекса си (от 1 до 4 или 5) от сесията, където беше запазен повреме на избор на правилния captcha отговор. Според това дали javacsript e засекъл retina display или не ще има HTTP GET променлива на име retina.

Ако е ретина файла вместо да завършва на .png завършва на @2x.png,

Подават се следните header-и:

header( 'Pragma: public' );
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header( 'Cache-Control: private', false );
header( 'Content-Type: image/png' );
header( 'Content-Transfer-Encoding: binary' );
header( 'Content-Length: ' . <размер на фйала в bytes> );

И се прочита файла.

Проверка дали captcha-та е валидна

Ако полето за captcha съществува се сравнява със запазената в сеията стойност за верен отговор. Това е то.

Същото за аудиото.

@antitoxic
Copy link
Member Author

@kgospodinov може ли 1 рамо за питона? Доста неща тип sha1, shuffle, read file, filezie, сесии ( в django) не знам как е препоръчително да се ползват?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant