Om magtiging met captcha voor te berei, sal ons nodig hΓͺ en sy plugins , , , , , , , . (Ek het skakels na my vurke gegee, want ek het 'n paar veranderinge aangebring wat nog nie in die oorspronklike bewaarplekke kon indruk nie. Jy kan ook gebruik .)
Om te begin, kom ons stel
encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";Skakel dan die magtigingsopskrif af, net vir ingeval
more_clear_input_headers Authorization;Nou beskerm ons alles met magtiging
auth_request /auth;
location =/auth {
internal;
subrequest_access_phase on; # ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΠΌ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠ°Π·Ρ Π² ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡΠ΅
auth_request off; # Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ
set_decode_base64 $auth_decode $cookie_auth; # ΡΠ°ΡΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΡΡ ΠΊΡΠΊΡ
set_decrypt_session $auth_decrypt $auth_decode; # ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΡΠ²Π°Π΅ΠΌ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΡΡ ΠΊΡΠΊΡ
if ($auth_decrypt = "") { return 401 UNAUTHORIZED; } # Π΅ΡΠ»ΠΈ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ°ΡΡΠΈΡΡΠΎΠ²Π°ΡΡ, ΡΠΎ Π·Π½Π°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½
more_set_input_headers "Authorization: Basic $auth_decrypt"; # ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΈΡΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π½Π° basic (ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ $remote_user)
auth_basic_user_file /data/nginx/.htaccess; # Π·Π°Π΄Π°ΡΠΌ ΡΠ°ΠΉΠ» basic Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ
auth_basic Auth; # Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ basic Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ
echo -n OK; # ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½
}Vir gemagtigde gebruikers wys ons inhoud uit hul gids
location / {
alias html/$remote_user/;
}En in die afwesigheid van magtiging, wys ons 'n magtigingsvorm met 'n captcha
error_page 401 = @error401;
location @error401 {
set_escape_uri $request_uri_escape $request_uri; # ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ Π·Π°ΠΏΡΠΎΡ
return 303 /login?request_uri=$request_uri_escape; # ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ Π½Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΎΡΠΌΡ Ρ ΠΊΠ°ΠΏΡΠ΅ΠΉ, ΡΠΎΡ
ΡΠ°Π½ΠΈΠ² Π·Π°ΠΏΡΠΎΡ
}
location =/login {
default_type "text/html; charset=utf-8"; # Π·Π°Π΄Π°ΡΠΌ ΡΠΈΠΏ
if ($request_method = GET) { # Π΅ΡΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΎΡΠΌΡ Ρ ΠΊΠ°ΠΏΡΠ΅ΠΉ
template login.html.ct2; # Π·Π°Π΄Π°ΡΠΌ ΡΠ°Π±Π»ΠΎΠ½
ctpp2 on; # Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ
set_secure_random_alphanum $csrf_random 32; # Π·Π°Π΄Π°ΡΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ csrf
encrypted_session_expires 300; # Π·Π°Π΄Π°ΡΠΌ Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ csrf 5 ΠΌΠΈΠ½ΡΡ (5 * 60 = 300)
set_encrypt_session $csrf_encrypt $csrf_random; # Π·Π°ΡΠΈΡΡΠΎΠ²ΡΠ²Π°Π΅ΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ csrf
set_encode_base64 $csrf_encode $csrf_encrypt; # ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ csrf
add_header Set-Cookie "CSRF=$csrf_encode; Max-Age=300"; # ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ csrf Π² ΠΊΡΠΊΡ Π½Π° 5 ΠΌΠΈΠ½ΡΡ (5 * 60 = 300)
return 200 "{"csrf":"$csrf_random"}"; # Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ json Π΄Π»Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠ°
} # ΠΈΠ½Π°ΡΠ΅ - ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΎΡΠΌΡ Ρ ΠΊΠ°ΠΏΡΠ΅ΠΉ
set_form_input $csrf_form csrf; # ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ csrf ΠΈΠ· ΡΠΎΡΠΌΡ
set_unescape_uri $csrf_unescape $csrf_form; # ΡΠ°ΡΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ csrf ΠΈΠ· ΡΠΎΡΠΌΡ
set_decode_base64 $csrf_decode $cookie_csrf; # ΡΠ°ΡΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ csrf ΠΈΠ· ΠΊΡΠΊΠΈ
set_decrypt_session $csrf_decrypt $csrf_decode; # ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΡΠ²Π°Π΅ΠΌ csrf ΠΈΠ· ΠΊΡΠΊΠΈ
if ($csrf_decrypt != $csrf_unescape) { return 303 $request_uri; } # Π΅ΡΠ»ΠΈ csrf ΠΈΠ· ΡΠΎΡΠΌΡ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ csrf ΠΈΠ· ΠΊΡΠΊΠΈ, ΡΠΎ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΡΡ Π½Π° ΠΏΠΎΠΊΠ°Π· ΡΠΎΡΠΌΡ ΡΠ½ΠΎΠ²Π°
set_form_input $captcha_form captcha; # ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΊΠ°ΠΏΡΡ ΠΈΠ· ΡΠΎΡΠΌΡ
set_unescape_uri $captcha_unescape $captcha_form; # ΡΠ°ΡΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ ΠΊΠ°ΠΏΡΡ ΠΈΠ· ΡΠΎΡΠΌΡ
set_md5 $captcha_md5 "secret${captcha_unescape}${csrf_decrypt}"; # ΡΡΠΈΡΠ°Π΅ΠΌ md5
if ($captcha_md5 != $cookie_captcha) { return 303 $request_uri; } # Π΅ΡΠ»ΠΈ md5 Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΠΊΠ°ΠΏΡΠ΅ΠΉ ΠΈΠ· ΠΊΡΠΊΠΈ, ΡΠΎ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΡΡ Π½Π° ΠΏΠΎΠΊΠ°Π· ΡΠΎΡΠΌΡ ΡΠ½ΠΎΠ²Π°
set_form_input $username_form username; # ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π»ΠΎΠ³ΠΈΠ½ ΠΈΠ· ΡΠΎΡΠΌΡ
set_form_input $password_form password; # ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠ°ΡΠΎΠ»Ρ ΠΈΠ· ΡΠΎΡΠΌΡ
set_unescape_uri $username_unescape $username_form; # ΡΠ°ΡΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ Π»ΠΎΠ³ΠΈΠ½ ΠΈΠ· ΡΠΎΡΠΌΡ
set_unescape_uri $password_unescape $password_form; # ΡΠ°ΡΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ ΠΏΠ°ΡΠΎΠ»Ρ ΠΈΠ· ΡΠΎΡΠΌΡ
encrypted_session_expires 2592000; # Π·Π°Π΄Π°ΡΠΌ Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΡΠ΅ΡΡΠΈΠΈ 30 Π΄Π½Π΅ΠΉ (30 * 24 * 60 * 60 = 2592000)
set $username_password "$username_unescape:$password_unescape"; # Π·Π°Π΄Π°ΡΠΌ basic Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ
set_encode_base64 $username_password_encode $username_password; # ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ basic Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ
set_encrypt_session $auth_encrypt $username_password_encode; # Π·Π°ΡΠΈΡΡΠΎΠ²ΡΠ²Π°Π΅ΠΌ basic Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ
set_encode_base64 $auth_encode $auth_encrypt; # ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΡ basic Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ
add_header Set-Cookie "Auth=$auth_encode; Max-Age=2592000"; # ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΡΡ basic Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π² Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΡΡ ΠΊΡΠΊΡ Π½Π° 30 Π΄Π½Π΅ΠΉ (30 * 24 * 60 * 60 = 2592000)
set $arg_request_uri_or_slash $arg_request_uri; # ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ Π·Π°ΠΏΡΠΎΡ ΠΈΠ· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°
set_if_empty $arg_request_uri_or_slash "/"; # Π΅ΡΠ»ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π½Π΅ Π·Π°Π΄Π°Π½, ΡΠΎ Π½Π°ΡΠ°Π»ΠΎ
set_unescape_uri $request_uri_unescape $arg_request_uri_or_slash; # ΡΠ°ΡΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ Π·Π°ΠΏΡΠΎΡ
return 303 $request_uri_unescape; # ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ Π½Π° ΡΠΎΡ
ΡΠ°Π½ΡΠ½Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ
}login.html
<html>
<body>
<form method="post">
<input type="hidden" name="csrf" value="<TMPL_var csrf>" />
username: <input type="text" name="username" placeholder="Enter User Name..." /><br />
password: <input type="password" name="password" /><br />
captcha: <img src="/captcha?csrf=<TMPL_var csrf>"/><input type="text" name="captcha" autocomplete="off" /><br />
<input type="submit" name="submit" value="submit" />
</form>
</body>
</html>Bron: will.com
