เชเซเชชเซเชเชพ เชธเชพเชฅเซ เช
เชงเชฟเชเซเชคเชคเชพ เชคเซเชฏเชพเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ, เช
เชฎเชจเซ เชเชฐเซเชฐ เชเซ เช
เชจเซ เชคเซเชจเชพ เชชเซเชฒเชเชเชจเซเชธ , , , , , , , . (เชฎเซเช เชฎเชพเชฐเชพ เชซเซเชฐเซเชเซเชธเชจเซ เชฒเชฟเชเชเซเชธ เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ, เชเชพเชฐเชฃ เชเซ เชฎเซเช เชเซเชเชฒเชพเช เชซเซเชฐเชซเชพเชฐเซ เชเชฐเซเชฏเชพ เชเซ เชเซ เชนเชเซ เชธเซเชงเซ เชฎเซเชณ เชญเชเชกเชพเชฐเชฎเชพเช เชงเชเซเชฒเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชจเชฅเซ. เชคเชฎเซ เชชเชฃ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ .)
เชถเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ, เชเชพเชฒเซ เชธเซเช เชเชฐเซเช
encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";เชเชเชณ, เชฎเชพเชคเซเชฐ เชเชฟเชธเซเชธเชพเชฎเชพเช, เช เชงเชฟเชเซเชคเชคเชพ เชนเซเชกเชฐเชจเซ เช เชเซเชทเชฎ เชเชฐเซ
more_clear_input_headers Authorization;เชนเชตเซ เช เชฎเซ เช เชงเชฟเชเซเชคเชคเชพ เชธเชพเชฅเซ เชฌเชงเซเช เชธเซเชฐเชเซเชทเชฟเชค เชเชฐเซเช เชเซเช
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; # ะฟะพะปัะทะพะฒะฐัะตะปั ะฐะฒัะพัะธะทะพะฒะฐะฝ
}เช เชงเชฟเชเซเชค เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชฎเชพเชเซ เช เชฎเซ เชคเซเชฎเชจเชพ เชซเซเชฒเซเชกเชฐเชฎเชพเชเชฅเซ เชธเชพเชฎเชเซเชฐเซ เชฌเชคเชพเชตเซเช เชเซเช
location / {
alias html/$remote_user/;
}เช เชจเซ เชเซ เชคเซเชฏเชพเช เชเซเช เช เชงเชฟเชเซเชคเชคเชพ เชจเชฅเซ, เชคเซ เช เชฎเซ เชเซเชชเซเชเชพ เชธเชพเชฅเซ เช เชงเชฟเชเซเชคเชคเชพ เชซเซเชฐเซเชฎ เชฌเชคเชพเชตเซเช เชเซเช
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>เชธเซเชฐเซเชธ: www.habr.com
