π₯€π‘οΈ ΠΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ Flask-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ΡΡΠ·Π²ΠΈΠΌΡΠΌ: ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ Π·Π°ΡΠΈΡΠ΅ ΠΎΡ Ρ Π°ΠΊΠ΅ΡΡΠΊΠΈΡ Π°ΡΠ°ΠΊ
ΠΡΡΡΠΈΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ ΠΏΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ Flask-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π²ΠΊΠ»ΡΡΠ°Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ XSS ΠΈ CSRF.
Π ΡΡΠΎΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Escape ΡΠΎΠ±ΡΠ°Π»Π° ΡΠ°ΠΌΡΠ΅ Π²Π°ΠΆΠ½ΡΠ΅ ΡΠΎΠ²Π΅ΡΡ ΠΏΠΎ Π·Π°ΡΠΈΡΠ΅ Π²Π°ΡΠΈΡ Flask-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΡ Π±ΡΠ΅ΡΠ΅ΠΉ, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠΏΠΎΡΠΎΠ±Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ CSRF-Π·Π°ΡΠΈΡΡ.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Flask?
Flask β ΡΡΠΎ ΠΌΠΈΠΊΡΠΎΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π΄Π»Ρ Python, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΠ½ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΎΠ±Π»Π΅Π³ΡΠ°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΈΡ Π·Π°Π΄Π°Ρ, ΠΊΠ°ΠΊ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ URL-Π°Π΄ΡΠ΅ΡΠΎΠ², ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΈ ΠΎΡΠ²Π΅ΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ². Flask ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΡΠ²ΠΎΠ΅ΠΉ ΠΏΡΠΎΡΡΠΎΡΠΎΠΉ ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΌ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΈΡΠΎΠΊΠΎΠ³ΠΎ ΡΠΏΠ΅ΠΊΡΡΠ° Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ β ΠΎΡ ΠΏΡΠΎΡΡΡΡ Π²Π΅Π±-ΡΠ°ΠΉΡΠΎΠ² Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ-ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΈ API.
Flask ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠΉ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°. Π’Π°ΠΊΠ°Ρ Π³ΠΈΠ±ΠΊΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎΠΌ, Π½ΠΎ ΠΎΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΠ°ΡΡ Π½Π° ΡΠ΅Π±Ρ Π±ΠΎΠ»ΡΡΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ Π·Π° ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ.
ΠΠΎΡΠ΅ΠΌΡ Π²Π°ΠΆΠ½ΠΎ Π·Π°ΡΠΈΡΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Flask?
Flask ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΡΠΎΡΠΎΠ½Π½ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΡΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΠΈΡΠΊ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. ΠΠ΅Π· Π½Π°Π΄Π΅ΠΆΠ½ΡΡ ΠΌΠ΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠ°ΠΊΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ ΡΡΠ·Π²ΠΈΠΌΡΠΌΠΈ Π΄Π»Ρ ΡΠ΅Π»ΠΎΠ³ΠΎ ΡΡΠ΄Π° ΡΠΊΡΠΏΠ»ΠΎΠΉΡΠΎΠ², Π²ΠΊΠ»ΡΡΠ°Ρ ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠΎΠ½Π½ΡΠ΅ Π°ΡΠ°ΠΊΠΈ, ΠΌΠ΅ΠΆΡΠ°ΠΉΡΠΎΠ²ΡΠΉ ΡΠΊΡΠΈΠΏΡΠΈΠ½Π³ (XSS) ΠΈ ΡΡΠ΅ΡΠΊΡ Π΄Π°Π½Π½ΡΡ .
ΠΠ°ΠΊ Π·Π°ΡΠΈΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Flask
OWASP Top 10
Π‘ΠΏΠΈΡΠΎΠΊ OWASP Top 10 2023 β ΡΡΠΎ ΠΎΡΠ»ΠΈΡΠ½Π°Ρ ΠΎΡΠΏΡΠ°Π²Π½Π°Ρ ΡΠΎΡΠΊΠ° Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π²Π°ΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Flask.
ΠΠ½ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ΅Π½Π΅Π½ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΎΡ Π²Π°ΡΡΠ²Π°Π΅Ρ ΡΠΈΡΠΎΠΊΠΈΠΉ ΡΠΏΠ΅ΠΊΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΡ ΠΈ ΡΠ΅ΡΡΠ΅Π·Π½ΡΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ. ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ² OWASP Top 10 ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅. Π‘ΠΎΠ³Π»Π°ΡΠΎΠ²ΡΠ²Π°Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π²Π°ΡΠ΅Π³ΠΎ Flask-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ OWASP Top 10, Π²Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΠ΅ Π·Π°ΡΠΈΡΡ ΠΎΡ ΡΠ°ΠΌΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΈ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ OWASP β ΡΡΠΎ Π±ΠΎΠ³Π°ΡΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π·Π½Π°Π½ΠΈΠΉ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΠΊ OWASP Slack, ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΠΎΡ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π° ΠΈ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠΉ Π±Π°Π·ΠΎΠΉ Π·Π½Π°Π½ΠΈΠΉ ΠΈ ΠΎΠΏΡΡΠ°.
Π₯ΠΎΡΠΈΡΠ΅ ΡΡΠΎΠ²Π΅ΡΡΠ΅Π½ΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ Π½Π°Π²ΡΠΊΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° ΠΏΡΠΎΠ½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ? ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠ²ΠΎΠΈ ΡΠΈΠ»Ρ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ OWASP Vulnerable Flask App.
ΠΠ½ΠΎ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ: HTML Injection, XSS, SSTI, SQL Injection, Information Disclosure, Command Injection, Brute Force, Deserialization, Broken Authentication, DOS, File Upload.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π²ΠΎ Flask: ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ Python
ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠ²Π»ΡΡΡΡΡ ΠΎΡΠ½ΠΎΠ²ΠΎΠΏΠΎΠ»Π°Π³Π°ΡΡΠΈΠΌΠΈ Π΄Π»Ρ Flask. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π°Π΄Π΅ΠΆΠ½ΡΡ ΠΊΡΠΈΠΏΡΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ Ρ ΡΡΠ΅ΠΉ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ, ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π·Π°ΡΠΈΡΡ ΠΎΡ ΠΏΠΎΠ΄Π΄Π΅Π»ΠΊΠΈ ΠΌΠ΅ΠΆΡΠ°ΠΉΡΠΎΠ²ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² (CSRF) ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈΠ· ΡΠ°Π·Π½ΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² (CORS), Π° ΡΠ°ΠΊΠΆΠ΅ Π·Π°ΡΠΈΡΠ° ΠΎΡ Π°ΡΠ°ΠΊ SQL-ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠΉ.
ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄Ρ ΠΊ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°ΡΡ ΠΎ Π½ΡΠ°Π½ΡΠ°Ρ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅Ρ
ΠΈΠ»ΠΈ ΠΈΠ½ΡΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². Π₯ΠΎΡΠΎΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΠΆΠΈΡΡ Π²ΡΠ±ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄Π° safe_load
Π²ΠΌΠ΅ΡΡΠΎ load
Π² pyyaml, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΡ
ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
Π ΡΡΠΎΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅ ΠΊΠΎΠ΄Π° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ load
Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½ΡΡ
YAML. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΈΡΠΊΠΎΠ²Π°Π½Π½ΡΠΌ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π½Π΅ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½Π½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄, ΡΡΠΎ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡΠΌ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. ΠΠ°ΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅Π³Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ load
Ρ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ.
ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π·Π°Π³ΡΡΠ·ΠΊΠΈ yaml-ΡΠ°ΠΉΠ»Π° Π±ΡΠ΄Π΅Ρ:
ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΡΠΈΠΏΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ β Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π²Π°ΠΆΠ½ΡΠΉ Π°ΡΠΏΠ΅ΠΊΡ. ΠΠ½ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΠ°ΠΊΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ safe_load
Π² pyyaml, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΡΠΈΠΏΠ° defusedxml
Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° XML ΠΈ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ Π²ΡΠ΅Π΄ΠΎΠ½ΠΎΡΠ½ΡΡ
ΠΈΡΡ
ΠΎΠ΄Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
JSON, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΌΠ½ΡΠ΅ ΠΌΠ°ΡΡΠΈΠ²Ρ.
Π‘Π½Π°ΡΠ°Π»Π° Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ElementTree
ΠΈ Π·Π°Π΄Π°ΡΡ Π²ΡΠ΅Π΄ΠΎΠ½ΠΎΡΠ½ΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ XML.
ΠΠ΄Π΅ΡΡ ΠΌΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ defusedxml
Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ Π²ΡΠ΅Π΄ΠΎΠ½ΠΎΡΠ½ΡΡ
XML-Π΄Π°Π½Π½ΡΡ
. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° defusedxml
ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π°ΡΠ°ΠΊΠΈ Π½Π° Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ XML (XXE).
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΎΡΡΠ°ΡΠ»ΠΈ. Π ΡΠ΅ΠΊΡΠΎΡΠ΅ ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ Π±ΠΎΠ»ΡΡΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ Π·Π°ΡΠΈΡΠ΅ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ (PII), ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠΎΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΡΠ°Ρ ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π΄Π°Π½Π½ΡΠ΅ Π±Π°Π½ΠΊΠΎΠ²ΡΠΊΠΈΡ ΡΡΠ΅ΡΠΎΠ². ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΈ ΡΡΠ΅ΡΡ Π·Π΄ΡΠ°Π²ΠΎΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌ HIPAA, Π³Π°ΡΠ°Π½ΡΠΈΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΡΡΡ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΌΠ΅Π΄ΠΈΡΠΈΠ½ΡΠΊΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π½ΠΈΡ , Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ Π² ΡΡΠ΅ΡΠ΅ ΠΊΠΈΠ±Π΅ΡΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΆΠ΅ΡΡΠΊΠΈΡ Π½ΠΎΡΠΌΠ°ΡΠΈΠ²Π½ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΡΡΠΎΠ³ΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠ² Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΡΡ ΠΎΠΆΠΈΡ Ρ ΡΠ΅ΠΌΠΈ, ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π² ΡΠ°ΠΊΠΈΡ ΡΠ΅Π³ΡΠ»ΠΈΡΡΠ΅ΠΌΡΡ ΠΎΡΡΠ°ΡΠ»ΡΡ , ΠΊΠ°ΠΊ ΡΠΈΠ½Π°Π½ΡΡ ΠΈ Π·Π΄ΡΠ°Π²ΠΎΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅.
ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΠ΅ΡΡΡΡΡ, ΠΊΠ°ΠΊ Flask-Security, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½Ρ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Flask Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠ²Π½Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ.
ΠΠ°ΡΠΈΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ ΡΠΎΡΠΌ Π²ΠΎ Flask
ΠΠ»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π³ΠΎΠ². ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ CSRF (Cross-Site Request Forgery) Π΄Π»Ρ Π²Π°ΡΠΈΡ ΡΠΎΡΠΌ. ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ wtforms, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΡΠΆΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π°.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ FlaskForm
ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ flask_wtflibrary
:
ΠΠΎ-Π²ΡΠΎΡΡΡ
, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΏΠΎΠ²ΡΡΠ°Π΅Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΠ²ΡΠ·Ρ β ΠΊΡΠ°ΠΉΠ½Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΈ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌΡ Π²Π²ΠΎΠ΄Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π΄ΠΎΠ²Π΅ΡΡΡΡ Π½Π°ΠΏΡΡΠΌΡΡ. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΏΠΎΠ»Π΅Π·Π½Π°, Π½ΠΎ Π½Π°ΡΡΠΎΡΡΠ°Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ Π²Π²ΠΎΠ΄ΠΈΠΌΡΡ
Π΄Π°Π½Π½ΡΡ
Π½Π° Π²Π°ΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅. ΠΡΠ»ΠΈ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ Π·Π°Π³ΡΡΠ·ΠΊΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΡΡΠ΅ Β«ΡΠ°Π½ΠΈΡΠ°ΡΠ½ΡΠΉΒ» ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΠΏΡΡΠ΅ΠΉ ΠΊ ΡΠ°ΠΉΠ»Π°ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΡΠΈΠ»ΠΈΡΡ, ΠΊΠ°ΠΊ secure_filename
.
ΠΠΎΡ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ:
ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΠΎΠ³ΠΎ, Π² ΡΠΈΡΡΠ°ΡΠΈΡΡ , ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ HTML, ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΠΎΠ½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΊΡΡΠ²Π°Π΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΠΊΡΠΈΠΎΠ½Π½ΡΡ Π°ΡΠ°ΠΊ. Π Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°, ΠΊΠ°ΠΊ Talisman, Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π΄ΡΡΠ³ΠΈΡ Π°ΡΠΏΠ΅ΠΊΡΠΎΠ² Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ. Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½Π°Π΄Π΅ΠΆΠ½ΡΡ Π·Π°ΡΠΈΡΡ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π²Π΅Π±-ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ.
ΠΠ°ΠΊ Π·Π°ΡΠΈΡΠΈΡΡ Flask ΠΎΡ XSS ΠΈ CSRF
XSS: ΠΌΠ΅ΠΆΡΠ°ΠΉΡΠΎΠ²ΡΠΉ ΡΠΊΡΠΈΠΏΡΠΈΠ½Π³
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ XSS ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΡΠ°ΠΉΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΊΡΠΈΠΏΡΠΈΠ½Π³Π° Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π²Π½Π΅Π΄ΡΡΡΡ Π²ΡΠ΅Π΄ΠΎΠ½ΠΎΡΠ½ΡΠ΅ ΡΠΊΡΠΈΠΏΡΡ Π½Π° Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΡ, ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΡΠ΅ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄ Π² ΡΠ²ΠΎΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΠ² ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π².
Π ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, ΡΡΠΎ Ρ Π²Π°Ρ Π΅ΡΡΡ ΡΠ°ΠΉΡ Ρ ΡΠ°Π·Π΄Π΅Π»ΠΎΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π². ΠΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ Π½Π°ΠΏΠΈΡΠ΅Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠΊΡΠΈΠΏΡ, Π° Π²Π΅Π±-ΡΠ°ΠΉΡ Π½Π΅ ΠΎΡΡΠΈΠ»ΡΡΡΡΠ΅Ρ ΡΠΊΡΠΈΠΏΡ ΠΈΠ· ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΡΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΏΡΡΡΠΈΡΡΡΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΊΡΠ°ΠΆΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ² cookie ΠΈΠ»ΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΡΠ΅Π°Π½ΡΠ°, ΠΈΠ»ΠΈ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΎΡ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ.
ΠΠ°ΡΠΈΡΠ° Flask ΠΎΡ XSS
ΠΡΠΎΡΠΈΠ²ΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π°ΡΠ°ΠΊΠ°ΠΌ XSS (Cross-Site Scripting), ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ Flask, Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ², ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΠΎΠ±Π΅Π·Π·Π°ΡΠ°ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ . ΠΠΈΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ:
1. ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°
ΠΡΠ΅Π³Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄ ΠΏΠ΅ΡΠ΅Π΄ Π΅Π³ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Flask ΠΈ Π΅Π³ΠΎ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ Jinja2 Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΊΡΡΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΠ΅ Π² ΡΠ°Π±Π»ΠΎΠ½Π°Ρ
. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Jinja2 {{ variable }}
, ΠΎΠ½ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΠ°ΠΊΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ, ΠΊΠ°ΠΊ <
, >
ΠΈ &
Π² ΠΈΡ
HTML-Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΡ.
2. ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Jinja2 ΠΈΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠ»ΡΡΡΠ° |safe
ΠΈΠ»ΠΈ ΠΊΠ»Π°ΡΡΠ° Markup
Π±Π΅Π· ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ·Π²ΠΈΠΌΡΠΌ Π΄Π»Ρ XSS, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠΈΠ² ΡΡΡΠΎΠΊΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ HTML.
3. ΠΠΎΠ»ΠΈΡΠΈΠΊΠ° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ (CSP)
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ Π·Π°ΡΠΈΡΡ. CSP β ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ°ΡΠ·Π΅ΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΡΠΈΠΏΡ Π°ΡΠ°ΠΊ, Π²ΠΊΠ»ΡΡΠ°Ρ XSS ΠΈ Π°ΡΠ°ΠΊΠΈ Ρ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ . ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ CSP Π²ΠΎ Flask Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Flask-Talisman.
4. ΠΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² JavaScript
ΠΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² JavaScript, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ . ΠΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ JavaScript ΠΌΠΎΠ³ΡΡ Ρ Π»Π΅Π³ΠΊΠΎΡΡΡΡ ΡΡΠ°ΡΡ ΠΊΠ°ΡΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠΎΠΌ XSS, Π΅ΡΠ»ΠΈ Ρ Π½ΠΈΠΌΠΈ Π½Π΅ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ.
5. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ HttpOnly ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ cookie
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ»Π°Π³ HttpOnly Π½Π° cookies, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ JavaScript ΠΊ Π½ΠΈΠΌ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ΅ΡΠ°ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΈΠΏΠΎΠ² XSS-Π°ΡΠ°ΠΊ, Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΡΠΎΡΡΡ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΏΡΡΠ°Π΅ΡΡΡ ΡΠΊΡΠ°ΡΡΡ ΡΠ΅ΡΡΠΈΠΎΠ½Π½ΡΠ΅ cookies.Ρ
6. ΠΠ±Π½ΠΎΠ²Π»ΡΠΉΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
Π Π΅Π³ΡΠ»ΡΡΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠΉΡΠ΅ Flask ΠΈ Π²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Ρ Π²Π°Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ XSS-Π°ΡΠ°ΠΊΠ°ΠΌ.
7. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ
Π Π°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Flask, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Flask-SeaSurf, Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ CSRF, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ²ΡΠ·Π°Π½Ρ Ρ XSS-Π°ΡΠ°ΠΊΠ°ΠΌΠΈ.
CSRF: ΠΏΠΎΠ΄Π΄Π΅Π»ΠΊΠ° ΠΌΠ΅ΠΆΡΠ°ΠΉΡΠΎΠ²ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ²
ΠΠΎΠ΄Π΄Π΅Π»ΠΊΠ° ΠΌΠ΅ΠΆΡΠ°ΠΉΡΠΎΠ²ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² (CSRF) ΠΎΠ±ΠΌΠ°Π½ΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π·Π°ΡΡΠ°Π²Π»ΡΡ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π² Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π³Π΄Π΅ ΠΎΠ½ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½. ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅, ΡΡΠΎ Π²Ρ Π·Π°ΡΠ»ΠΈ Π½Π° ΡΠ°ΠΉΡ ΡΠ²ΠΎΠ΅Π³ΠΎ Π±Π°Π½ΠΊΠ° ΠΈ ΡΠ΅Π»ΠΊΠ½ΡΠ»ΠΈ ΠΏΠΎ Π²ΡΠ΅Π΄ΠΎΠ½ΠΎΡΠ½ΠΎΠΉ ΡΡΡΠ»ΠΊΠ΅ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ·ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΡ. ΠΡΠ»ΠΈ ΡΡΠΎΡ ΡΠ°ΠΉΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΊΡΡΡΡΡ ΡΠΎΡΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΠ°ΠΉΡ Π²Π°ΡΠ΅Π³ΠΎ Π±Π°Π½ΠΊΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°ΡΠ²ΠΊΡ Π½Π° ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ Π΄Π΅Π½Π΅Π³), ΡΠ°ΠΉΡ Π±Π°Π½ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΅Π³ΠΎ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ ΡΡΠΎ Π±ΡΠ» Π²Π°Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ.
ΠΠ°ΡΠΈΡΠ° ΠΎΡ CSRF Π² Flask
Π§ΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π°ΡΠ°ΠΊΠΈ CSRF (Cross-Site Request Forgery) Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ Flask, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ:
1. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Flask-WTF
Flask-WTF β ΡΡΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠ΅ΡΡΡ Ρ ΡΠΎΡΠΌΠ°ΠΌΠΈ Flask. ΠΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ CSRF, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡ CSRF-ΡΠΎΠΊΠ΅Π½Ρ. ΠΠΎΠ³Π΄Π° Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Flask-WTF Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΡΠΌΠ°ΠΌΠΈ, ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Π½, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠ°ΠΌΠΎΠΉ ΡΠΎΡΠΌΠΎΠΉ. ΠΡΠΎΡ ΡΠΎΠΊΠ΅Π½ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅, ΡΡΠΎΠ±Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠ°Π²ΠΎΠΌΠ΅ΡΠ½ΠΎΡΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΡΠΌΡ.
2. ΠΠ΅Π½Π΅ΡΠΈΡΡΠΉΡΠ΅ CSRF-ΡΠΎΠΊΠ΅Π½Ρ
ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Flask-WTF, ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΠΎΡΠΌΠ°, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π²Π°ΡΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ CSRF-ΡΠΎΠΊΠ΅Π½ β ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΡΠΎΡΠΌΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Flask-SeaSurf Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ CSRF-ΡΠΎΠΊΠ΅Π½ΠΎΠ².
3. ΠΡΠΎΠ²Π΅ΡΠΊΠ° CSRF-ΡΠΎΠΊΠ΅Π½ΠΎΠ²
ΠΠΎΠ³Π΄Π° ΡΠΎΡΠΌΠ° ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π°, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ CSRF-ΡΠΎΠΊΠ΅Π½Π°. ΠΡΠ»ΠΈ ΠΎΠ½ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ΅Π½, ΠΎΡΠΊΠ»ΠΎΠ½ΠΈΡΠ΅ Π·Π°ΠΏΡΠΎΡ. ΠΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Flask-WTF ΠΈΠ»ΠΈ Flask-SeaSurf.
4. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π°ΡΡΠΈΠ±ΡΡ SameSite Π΄Π»Ρ ΡΠ°ΠΉΠ»ΠΎΠ² cookie
RΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ cookies Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΌΠΈ ΠΈΠ»ΠΈ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π΄Π»Ρ Π°ΡΡΠΈΠ±ΡΡΠ° 'SameSite'
Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 'Lax'
ΠΈΠ»ΠΈ 'Strict'
. ΠΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ CSRF-Π°ΡΠ°ΠΊΠΈ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΡ, Π² ΠΊΠ°ΠΊΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π±ΡΠ°ΡΠ·Π΅Ρ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ cookies.
5. ΠΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ GET-Π·Π°ΠΏΡΠΎΡΠΎΠ² Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ GET-Π·Π°ΠΏΡΠΎΡΡ (ΠΈΠ»ΠΈ Π»ΡΠ±ΡΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ HTTP-ΠΌΠ΅ΡΠΎΠ΄Ρ) Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΠ΅ΠΉΡΡΠ²ΠΈΡ, ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ POST, PUT, DELETE ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΡ HTTP-ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π·Π°ΡΠΈΡΠ΅Π½Ρ CSRF-ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ.
ΠΠ°ΠΊ Π·Π°ΡΠΈΡΠΈΡΡ API, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Flask
Π§ΡΠΎΠ±Ρ Π·Π°ΡΠΈΡΠΈΡΡ API, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Flask, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΡΡΠ΅Π²ΡΡ Π°ΡΠΏΠ΅ΠΊΡΠΎΠ² Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ:
1. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ HTTPS
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ HTTPS ΡΠΈΡΡΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ Π½Π΅ΡΠ°Π½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ Π½ΠΈΠΌ ΠΈ ΡΠ½ΠΈΠΆΠ°Ρ ΡΠΈΡΠΊ Π°ΡΠ°ΠΊ ΡΠΈΠΏΠ° Β«ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ ΠΏΠΎΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅Β».
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Flask-SSLify
β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ HTTPS Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Flask. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π²ΡΠ΅ HTTP-Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΈΡ
HTTPS-Π°Π½Π°Π»ΠΎΠ³ΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ HTTPS, ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ API-Π·Π°ΠΏΡΠΎΡΠΎΠ², ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠΎΠΊΠ΅Π½Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈΠ»ΠΈ ΡΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ β ΡΠΈΡΡΡΡΡΡΡ, ΡΡΠΎ ΡΠ½ΠΈΠΆΠ°Π΅Ρ ΡΠΈΡΠΊ ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΠ° ΠΈ ΡΠ°Π»ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ
.
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΉΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ ΡΡΠ΅Π΄Ρ Π΄Π»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ HTTPS Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ SSL/TLS. ΠΡΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΏΠΎΠ²ΡΡΠ°Ρ ΠΎΠ±ΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ Π²Π°ΡΠ΅Π³ΠΎ Flask API.
2. ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Flask-RESTful
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Flask-RESTful β ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Flask Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ RESTful API, Π²ΠΌΠ΅ΡΡΠ΅ Ρ Flask-HTTPAuth Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ.
ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡ HTTPBasicAuth
Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ verify_password
Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½Π° ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ Π»ΡΠ±ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΠΊ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠ΅ SecureResource
. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ verify_password
Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ ΡΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅Π΄ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π·Π°ΡΠΈΡΠ΅Π½Π½ΠΎΠΌΡ ΡΠ΅ΡΡΡΡΡ.
3. ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ²
ΠΠ»Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ², ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΄Π»Ρ API, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
Flask-JWT-Extended, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ Flask.
JWTManager
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΡΡΡ Ρ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ, Π° ΠΊ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠ΅ /protected
ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ @jwt_required()
, Π³Π°ΡΠ°Π½ΡΠΈΡΡΡΡΠΈΠΉ, ΡΡΠΎ Π±ΡΠ΄ΡΡ Π΄ΠΎΠΏΡΡΠ΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΡΠΎΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ JWT. Π€ΡΠ½ΠΊΡΠΈΡ get_jwt_identity
ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ (ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅) ΠΈΠ· ΡΠΎΠΊΠ΅Π½Π°, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ Π΄Π°Π½Π½ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² Π·Π°ΡΠΈΡΠ΅Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠ΅.
ΠΠ»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠ΅Π½ΡΠΉΡΠ΅ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ JWT. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²Π²Π΅Π΄Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°, ΡΡΠΎΠ±Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π²Π·Π»ΠΎΠΌΠ°Π½Π½ΡΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ². Flask-JWT-Extended ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Π³ΠΈΠ±ΠΊΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ², ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ Π½Π°Π΄Π΅ΠΆΠ½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ.
4. ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠΎΡΠΎΡΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Flask-Limiter
Flask-Limiter ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π΄Π»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠΊΠΎΡΠΎΡΡΠΈ β Π²Π°ΠΆΠ½ΠΎΠΉ ΠΌΠ΅ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ ΠΌΠΎΡΠ΅Π½Π½ΠΈΡΠ΅ΡΡΠ²Π°, DDoS-Π°ΡΠ°ΠΊ ΠΈ Π½Π΅ΠΏΡΠ΅Π΄Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΡΠ΅Π·ΠΌΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ API. Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Limiter
, ΠΈ Π΄Π»Ρ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ /limited
ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠΎΡΠΎΡΡΠΈ Β«5 Π·Π°ΠΏΡΠΎΡΠΎΠ² Π² ΠΌΠΈΠ½ΡΡΡΒ». ΠΡΠΈΠΌΠ΅Π½ΡΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ @limiter.limit
, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΡΠΊΠΎΡΠΎΡΡΡ, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ Π΄Π΅Π»Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΡΡΠΎΠΉ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠ΅, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π»ΠΎΡΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΡ ΡΠ΅ΡΡΡΡΠΎΠ².
ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠΊΠΎΡΠΎΡΡΠΈ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌΠΈ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡΠΌΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ IP-Π°Π΄ΡΠ΅ΡΠ°. Π Π΅Π³ΡΠ»ΡΡΠ½ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠΉΡΠ΅ ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΡΠΉΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠΊΠΎΡΠΎΡΡΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ Π±Π°Π»Π°Π½Ρ ΠΌΠ΅ΠΆΠ΄Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΡ ΠΈ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΉ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠΊΠΎΡΠΎΡΡΠΈ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π²Π½Π΅Π·Π°ΠΏΠ½ΡΡ ΠΏΠ΅ΡΠ΅Π±ΠΎΠ΅Π² Π² ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠΈ ΠΈΠ·-Π·Π° Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΡ ΡΠΊΠ°ΡΠΊΠΎΠ² ΡΡΠ°ΡΠΈΠΊΠ°.
5. Π£ΡΠΈΠ»Π΅Π½ΠΈΠ΅ Π·Π°ΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°
Π Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΡΡΠΈΠΌ ΠΌΠ΅ΡΠ°ΠΌ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠΈΠ»ΠΈΡΡ Π·Π°ΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π΅Π½ΡΠΆΠ½ΡΡ ΡΠΈΡΠΊΠΎΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ SSH ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ IP-Π°Π΄ΡΠ΅ΡΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ Π΅Π³ΠΎ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΈΠ΅ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊ Heroku, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ ΡΡΠ΅Π΄Ρ, Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
6. Π‘ΡΡΠΎΠ³ΠΈΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²
ΠΡΠ»ΠΈ Π²Π°Ρ API ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ Π·Π°Π³ΡΡΠ·ΠΊΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΡΡΡΠΎΠ³ΠΈΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΎΠ³ΡΠ°Π½ΠΈΡΡΡΠ΅ ΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π²ΠΈΡΡΡΡ, Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Π΄ΠΎΠ½ΠΎΡΠ½ΡΡ Π·Π°Π³ΡΡΠ·ΠΎΠΊ.
7. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ CORS
ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ CORS: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ Cross-Origin Resource Sharing (CORS), ΡΡΠΎΠ±Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½Ρ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π²Π°ΡΠ΅ΠΌΡ API. ΠΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π΅Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Π΄ΠΎΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ ΠΏΠΎΠ²ΡΡΠΈΡ ΠΎΠ±ΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ.
8. ΠΠ°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅
ΠΠ°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅: Π΅ΡΠ»ΠΈ Π²Π°Ρ API ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ , ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΡ. Π‘ΡΠ΄Π° ΠΎΡΠ½ΠΎΡΡΡΡΡ ΡΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΠΊΠ»ΡΡΠΈ API ΠΈ Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
9. Π Π΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π°ΡΠ΄ΠΈΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ
Π Π΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π°ΡΠ΄ΠΈΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ: ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅ Π°ΡΠ΄ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΎΡΠ΅Π½ΠΊΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΡΡΠΎΠ±Ρ Π²ΡΡΠ²ΠΈΡΡ ΠΈ ΡΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΠΊΠΎΠ½ΡΠ΅ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π·Π°ΡΠΈΡΠ° API, ΡΠΎΠ·Π΄Π°Π½Π½Π°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Flask, β ΡΡΠΎ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½Π°Ρ Π·Π°Π΄Π°ΡΠ°, ΡΡΠ΅Π±ΡΡΡΠ°Ρ Π²ΡΠ΅ΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΠΊ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΠΈΡΠΊΠΎΠ² ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΡΡΠΈ, ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ Π΄Π°Π½Π½ΡΡ . ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ HTTPS, Π½Π°Π΄Π΅ΠΆΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ, Π·Π°ΡΠΈΡΡ Π½Π° Π±Π°Π·Π΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠΎΡΠΎΡΡΠΈ β ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π·Π°Π»ΠΎΠΆΠΈΡΡ ΠΏΡΠΎΡΠ½ΡΠΉ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½Ρ Π΄Π»Ρ Π·Π°ΡΠΈΡΡ API. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ Flask, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ Flask-SSLify, Flask-RESTful, Flask-HTTPAuth, Flask-JWT-Extended ΠΈ Flask-Limiter, ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΡΡΠΈΡ ΠΌΠ΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Flask.
ΠΡΠ±ΠΈΡΠ΅Π»ΡΠΌ Flask, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΌ ΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΡΡΠΎΠΈΡ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠ²ΠΎΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Gunicorn β ΡΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ²ΡΡΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, Π½ΠΎ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π²Π°ΠΌ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΠΊ Π»ΡΡΡΠΈΠΌ ΡΠ΅Π½Π΄Π΅Π½ΡΠΈΡΠΌ Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡΠΌ Π²Π°ΡΠ΅Π³ΠΎ API, ΡΡΠΈΡΡΠ²Π°Ρ ΡΠ°ΠΊΠΈΠ΅ ΡΠ°ΠΊΡΠΎΡΡ ΠΊΠ°ΠΊ Ρ Π°ΡΠ°ΠΊΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Π΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ , ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΡΡΠ΅ΠΏΠ΅Π½Ρ ΠΏΠΎΠ΄Π²Π΅ΡΠΆΠ΅Π½Π½ΠΎΡΡΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΡΠΌ ΡΠ³ΡΠΎΠ·Π°ΠΌ. Π Π΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π°ΡΠ΄ΠΈΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ API ΠΈ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎ Π½ΠΎΠ²ΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°Ρ ΠΊ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π² ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π΅ Flask ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π°Π΄Π°ΠΏΡΠΈΠ²Π½ΠΎΠΉ ΠΈ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ.
Π‘ΡΠ°ΡΡΠΈ ΠΏΠΎ ΡΠ΅ΠΌΠ΅
- πβ©οΈπ₯€ Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π΄Π»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ ΠΏΠΎ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌ Jinja Π² Flask
- π Π‘Π°ΠΌΠΎΡΡΠΈΡΠ΅Π»Ρ ΠΏΠΎ Python Π΄Π»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ
. Π§Π°ΡΡΡ 23: ΠΡΠ½ΠΎΠ²Ρ Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π½Π° Flask
- ππ₯€ Flask Π·Π° ΡΠ°Ρ. Π§Π°ΡΡΡ 1: ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π°Π΄Π°ΠΏΡΠΈΠ²Π½ΡΠΉ ΡΠ°ΠΉΡ Π΄Π»Ρ GitHub Pages
- ππ Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π°Π½Π°Π»ΠΎΠ³ LiveLib.ru Π½Π° Flask. Π§Π°ΡΡΡ 1: ΠΎΡΠ½ΠΎΠ²Ρ ΡΠ°Π±ΠΎΡΡ Ρ SQLAlchemy