ΠΡΠ΅Π΄ΠΈ Π΅Π΄Π½Π° Π³ΠΎΠ΄ΠΈΠ½Π°, 21 ΠΌΠ°ΡΡ 2019 Π³., Π²
Π’ΠΎΠ²Π° Π΅ ΠΊΡΠΈΡΠΈΡΠ½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ, Π·Π°ΡΠΎΡΠΎ... Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ ΠΈ ΡΠ΅ΡΠΈΠΉΠ½ΠΈ Π±ΠΈΡΠΊΠ²ΠΈΡΠΊΠΈ. ΠΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΡΠ° ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ Π±Π΅ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½Π° ΠΊΠΎΡΠ΅ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΡΠΈΠ»ΡΡΠΈΡΠ° Π½ΡΠ»Π΅Π²ΠΈΡ Π±Π°ΠΉΡ (ΠΊΠ°ΠΊΡΠΎ ΡΠ΅ ΠΎΠΊΠ°Π·Π° ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ, ΡΠΎΠ²Π° Π½Π΅ Π±Π΅ΡΠ΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ, Π·Π°ΡΠΎΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° CRLF / ASCII 13, 10, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠ°ΡΠ΅ Π·Π°Π³Π»Π°Π²ΠΊΠΈΡΠ΅ ΠΈ Π΄Π°Π½Π½ΠΈ ΠΎΡ HTTP ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ°, ΡΠΎΠ²Π° Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΊΡΠΈΡΠΈΡΠ½ΠΎ, Π½ΠΎ Π²ΡΠ΅ ΠΏΠ°ΠΊ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎ). Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡΡ Π±Π΅ΡΠ΅ ΠΏΡΠ΅Ρ
Π²ΡΡΠ»Π΅Π½ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠΈ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ ΠΏΠΎ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ°, Π·Π° Π΄Π° ΠΎΡΠΊΡΠΈΡΡ ΠΈ ΠΎΡΡΡΡΠ°Π½ΡΡ ΠΏΡΠΈΡΠΈΠ½ΠΈΡΠ΅ Π·Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ°.
ΠΠΎΡΠ°ΡΠ° Π½Π° Mail.ru Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅; Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠ΅Π΄Π½ΠΈ/Π±Π΅ΠΊ-Π΅Π½Π΄ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ, ΠΊΠ°ΠΊΡΠΎ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ (ΠΌΠ½ΠΎΠ³ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π½Π° Π±Π΅Π·ΠΏΠ»Π°ΡΠ΅Π½ ΡΠΎΡΡΡΠ΅Ρ), ΡΠ°ΠΊΠ° ΠΈ Π²ΡΡΡΠ΅ΡΠ½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈ, ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π² Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ°. Π£ΡΠΏΡΡ
ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΊΠ»ΡΡΠΈΠΌ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° nginx ΠΈ openresty ΠΈ Π΄Π° Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡΠ΅Π΄ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅
OpenResty Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠ΅Π½ ΠΏΠ»ΡΠ³ΠΈΠ½, ΠΊΠΎΠΉΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ Lua ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π² nginx ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° Mail.ru, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡΡ Π½Π΅ ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½. Π ΡΠ»Π΅Π΄ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅ Π½Π°ΠΉ-Π½Π°ΠΊΡΠ°Ρ ΡΠ΅ Π²ΡΡΠ½Π°Ρ
Π° ΠΊΡΠΌ Π½Π΅Π³ΠΎ, Π·Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΠΈΡΡΠΈΠ½ΡΠΊΠΈΡΠ΅ ΠΏΡΠΈΡΠΈΠ½ΠΈ, Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΡΡ ΠΏΡΠ΅ΠΏΠΎΡΡΠΊΠΈ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅. Π£ΡΠ°ΡΡΠ²Π° Π² ΡΠ°Π·ΠΊΠΎΠΏΠΊΠΈΡΠ΅ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄
- Π nginx, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ, ΠΈΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΎΠ±Ρ
ΠΎΠΆΠ΄Π°Π½Π΅ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ (ΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎ SSRF) Π² Π½ΡΠΊΠΎΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π½ΠΎ ΡΠΎΠ²Π° Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΡΠ°ΠΊΡ ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΎΡΠΊΡΠΈΡ ΠΎΡ ΡΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠΈ Π²
Nginx Amplify ΠΈΠΠΈΠΊΡΠΈ ΠΎΡ Yandex (Π΄Π°, Π½ΠΈΠ΅ ΡΡΡΠΎ Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ). ΠΠΎΠ³Π°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ OpenResty, ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΏΡΡΠ½Π΅, Π½ΠΎ ΡΠΎΠ²Π° Π½Π΅ ΠΏΠΎΠ²Π»ΠΈΡ Π½Π° Π½Π°ΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ.ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
location ~ /rewrite { rewrite ^.*$ $arg_x; } location / { root html; index index.html index.htm; }
ΡΠ΅Π·ΡΠ»ΡΠ°Ρ
curl localhost:8337/rewrite?x=/../../../../../../../etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
... - Nginx ΠΈΠΌΠ° Π³ΡΠ΅ΡΠΊΠ°, ΠΊΠΎΡΡΠΎ ΠΏΡΠΈΡΠΈΠ½ΡΠ²Π° ΠΈΠ·ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ, Π°ΠΊΠΎ ΡΠ΅Π΄ΡΡ Π·Π° ΠΏΡΠ΅Π·Π°ΠΏΠΈΡ ΡΡΠ΄ΡΡΠΆΠ° Π½ΡΠ»Π΅Π² Π±Π°ΠΉΡ. ΠΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠ·Π΄Π°Π΄Π΅ ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅, nginx ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Ρ Π½ΠΎΠ² Π±ΡΡΠ΅Ρ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°Ρ Π½Π° ΠΏΡΠ»Π½Π°ΡΠ° Π΄ΡΠ»ΠΆΠΈΠ½Π° Π½Π° ΡΠ΅Π΄Π°, Π½ΠΎ ΠΊΠΎΠΏΠΈΡΠ° ΡΠ΅Π΄Π° ΡΠ°ΠΌ ΡΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡ Π·Π° ΡΠ΅Π΄, Π² ΠΊΠΎΡΡΠΎ Π½ΡΠ»Π΅Π²ΠΈΡΡ Π±Π°ΠΉΡ Π΅ ΡΠ΅ΡΠΌΠΈΠ½Π°ΡΠΎΡ Π½Π° ΡΠ΅Π΄Π°, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅Π΄ΡΡ ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ° ΡΠ°ΠΌΠΎ Π΄ΠΎ Π½ΡΠ»Π°ΡΠ° Π±Π°ΠΉΡ; ΠΎΡΡΠ°Π½Π°Π»Π°ΡΠ° ΡΠ°ΡΡ ΠΎΡ Π±ΡΡΠ΅ΡΠ° ΡΡΠ΄ΡΡΠΆΠ° Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π΄Π°Π½Π½ΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π΅Π½ Π°Π½Π°Π»ΠΈΠ·
ΡΡΠΊ .ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ (^@ Π½ΡΠ»Π΅Π² Π±Π°ΠΉΡ)
location ~ /memleak { rewrite ^.*$ "^@asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdasdf"; } location / { root html; index index.html index.htm; }
ΡΠ΅Π·ΡΠ»ΡΠ°Ρ
curl localhost:8337/secret -vv
...
curl localhost:8337/memleak -vv
...
Location: http://localhost:8337/secret
...
- Nginx Π·Π°ΡΠΈΡΠ°Π²Π° GET ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΎΡ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ»ΡΠΆΠ΅Π±Π½ΠΈ Π·Π½Π°ΡΠΈ ΠΈ ΠΏΡΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΡΠ°ΠΌΠΎ Π½Π° GET ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΏΡΠΈ ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π½Π΅ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π· ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½ΠΈ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π² nginx. POST ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π΅ ΡΠ° Π·Π°ΡΠΈΡΠ΅Π½ΠΈ. OpenResty Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΠΊΠ°ΠΊΡΠΎ Ρ GET, ΡΠ°ΠΊΠ° ΠΈ Ρ POST ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ POST ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΡΠ΅Π· OpenResty, ΡΡΠ°Π²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ.
ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
location ~ /memleak { rewrite_by_lua_block { ngx.req.read_body(); local args, err = ngx.req.get_post_args(); ngx.req.set_uri( args["url"], true ); } } location / { root html; index index.html index.htm; }
ΡΠ΅Π·ΡΠ»ΡΠ°Ρ:
curl localhost:8337 -d "url=secret" -vv
...
curl localhost:8337 -d "url=%00asdfasdfasdfasdfasdfasdfasdfasdf" -vv
...
Location: http://localhost:8337/{...ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ secret...}
...
ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½Π° ΡΠ΅Π°ΠΊΡΠΈΡ
ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π±Π΅ΡΠ΅ Π΄ΠΎΠΊΠ»Π°Π΄Π²Π°Π½ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° nginx ΠΈ OpenResty, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π΅ ΡΡΠΈΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π° Π³ΡΠ΅ΡΠΊΠ° Π² ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° nginx, Ρ.ΠΊ. Π² ΡΠ°ΠΌΠΈΡ nginx Π½ΡΠΌΠ° Π½Π°ΡΠΈΠ½ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ° ΡΡΠ΅Π· ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ, ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΠΉΡΠ΅
ΠΠΎΡΡΡΡΠΈΠ³Π΅Ρ
Π ΡΠ°ΠΊΠ°, ΠΊΠ°ΠΊΠ²Π° Π±Π΅ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ°ΡΠ° ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ, Π·Π° Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈ?
ΠΠΌΠ°ΡΠ΅ Π»ΠΈ Π³ΡΠ΅ΡΠΊΠ° Π² nginx? ΠΠ°, ΡΠ°ΠΊΠ° Π±Π΅ΡΠ΅, Π·Π°ΡΠΎΡΠΎ ΠΈΠ·ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ ΠΎΡ ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉ Π΅ Π³ΡΠ΅ΡΠΊΠ°.
ΠΠΌΠ°ΡΠ΅ Π»ΠΈ Π³ΡΠ΅ΡΠΊΠ° Π² OpenResty? ΠΠ°, ΠΏΠΎΠ½Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡΡ ΡΡΡ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π½Π°ΡΠ° ΠΎΡ OpenResty ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π½Π΅ Π΅ ΠΏΡΠΎΡΡΠ΅Π½ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ°Π½.
ΠΠΌΠ°ΡΠ΅ Π»ΠΈ Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ/ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Ρ OpenResty? ΠΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΈ Π»ΠΈΠΏΡΠ° Π½Π° ΠΈΠ·ΡΠΈΡΠ½ΠΎ ΠΈΠ·ΡΠ²Π»Π΅Π½ΠΈΠ΅ Π±Π΅ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ Π½Π΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ.
ΠΠΎΡ ΠΎΡ ΡΠ΅Π·ΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π΅ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ Π² ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° Ρ Π½Π°Π³ΡΠ°Π΄Π° ΠΎΡ $10000 XNUMX? ΠΠ° Π½Π°Ρ ΡΠΎΠ²Π° ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ Π½Π΅ Π΅ Π²Π°ΠΆΠ½ΠΎ. ΠΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠΎΡΡΡΠ΅Ρ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π² ΠΏΡΠ΅ΡΠ΅ΡΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΡΠ΅Π·ΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ, Π½ΠΈΠΊΠΎΠΉ Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° ΡΡΡ Π½Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° ΡΠ° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ°Π½ΠΈ ΠΈ ΡΠ΅ Π½ΡΠΌΠ° Π³ΡΠ΅ΡΠΊΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π²ΡΡΠΊΠ° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ Π½Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ° Π²ΡΠ·Π½ΠΈΠΊΠ²Π° ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΌ, ΠΊΡΠ΄Π΅ΡΠΎ Π·Π°ΡΡΠ³Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ°.
ΠΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉ Π΅ Π΄ΠΎΠ±ΡΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° Π΄Π° ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΠΈΠ»ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Ρ/ΡΠΈΠ»ΡΡΠΈΡΠ°Ρ ΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ Π²Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ Π²Π»ΠΈΠ·Π°Ρ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ Π²ΡΠ½ΡΠ΅Π½ ΠΌΠΎΠ΄ΡΠ»/API, ΠΎΡΠ²Π΅Π½ Π°ΠΊΠΎ Π½ΡΠΌΠ° ΠΈΠ·ΡΠΈΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈ ΡΡΠ½ΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, ΡΠ΅ ΡΠΎΠ²Π° Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°.
ΠΏΠ΅ΡΠ°ΡΠ½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ
ΠΡ ΠΎΠΏΠΈΡ
Π½Π°Π³ΡΠ°Π΄Π° Π·Π° Π³ΡΠ΅ΡΠΊΠΈ β ΡΡΡΡΠ΅Π·Π°Π½ΠΈΠ΅ ΠΏΠΎ Π»ΠΎΠ² Π½Π° Π±ΡΠ±ΠΎΠ»Π΅ΡΠΊΠΈ
Π΄ΠΎΠΊΠ»Π°Π΄ Π·Π° Π³ΡΠ΅ΡΠΊΠ° - ΠΈΠ·Π²Π΅ΡΡΠΈΠ΅ Π·Π° Π³ΡΠ΅ΡΠΊΠ°
ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅ - ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅
ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ - ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄
Π΅ΡΠ°ΡΡΠΌ - ΡΠ°Π±ΠΎΡΠ° Π²ΡΡΡ
Ρ Π³ΡΠ΅ΡΠΊΠΈΡΠ΅
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com