æ¬èšäºã¯2021幎9æ27æ¥ã«å ¬éããPython security best practices cheat sheetãæ¥æ¬èªåããå 容ã§ãã
2019幎ãSnykã¯æåã®PythonããŒãã·ãŒãããªãªãŒã¹ããŸããããã以æ¥ãPythonã®ã»ãã¥ãªãã£ã®å€ãã®åŽé¢ãå€åããŠããŸããéçºè åãã»ãã¥ãªãã£äŒæ¥ãšããŠåŠãã ããšããããŠPythonç¹æã®ãã¹ããã©ã¯ãã£ã¹ã«åºã¥ããŠãPythonã®ã³ãŒããå®å šã«ä¿ã€ããã«ããã®ææ°ã®ããŒãã·ãŒãããŸãšããŸããã
ãããŒãã·ãŒãã2021幎çPythonã»ãã¥ãªãã£ãã¹ããã©ã¯ãã£ã¹
æ¬èšäºã§ã¯ãäžèšã«é¢ããPythonã®ã»ãã¥ãªãã£ã«é¢ãããã³ãã玹ä»ããŸãã
- å€éšããŒã¿ãåžžã«ãµãã¿ã€ãºãã
- ã³ãŒããã¹ãã£ã³ãã
- ããã±ãŒãžã®ããŠã³ããŒãã«æ³šæ
- äŸåå ããã±ãŒãžã®ã©ã€ã»ã³ã¹ã確èªãã
- ã·ã¹ãã æšæºçã®Pythonã䜿çšããªã
- Pythonã®ä»®æ³ç°å¢åãæ©èœãå©çšãã
- æ¬çªã§ã¯
DEBUG = Falseã«èšå®ãã - æååã®æžåŒèšå®ã«æ³šæ
- (ã)ã·ãªã¢ã©ã€ãºãæ éã«è¡ã
- Pythonã®åã¢ãããŒã·ã§ã³ã䜿çšãã
ãã®åã«ãã²ãšã€ã ãæ³šæç¹ããããŸããSnykã®Pythonãšã³ã·ã¹ãã ã«é¢ããããŒã¿ãããã³åŠè¡ç ç©¶ã«ãããšãPythonã¯ä»ã®åºã䜿ãããŠããèšèªãšæ¯èŒããŠå®å šæ§ãé«ãïŒãŸãã¯äœãïŒããã§ã¯ãããŸãããå¿ã«ãšããŠãããŸãããããã®ããŒãã·ãŒãã¯ãç§ãã¡PythonistaïŒPythonéçºè ïŒã®ããã«ç¹å¥ã«çšæãããã®ã§ããä»ã®ãšã³ã·ã¹ãã ã§å®å šã§ããæ¹æ³ãåŠã¶ããã«ãåŒç€ŸãäœæããŠããä»ã®ãã¹ãŠã®ã»ãã¥ãªãã£ããŒãã·ãŒãããã§ãã¯ããããšããå§ãããŸãã
1. å€éšããŒã¿ãåžžã«ãµãã¿ã€ãºãã
ããããã¢ããªã±ãŒã·ã§ã³ã®æ»æãã¯ãã«ã®1ã€ã¯å€éšããŒã¿ã§ãããã€ã³ãžã§ã¯ã·ã§ã³ãXSSããµãŒãã¹æåŠïŒDOSïŒæ»æãªã©ã«å©çšãããå¯èœæ§ããããŸããPythonã®ã»ãã¥ãªãã£ãç¶æããããã®äžè¬çãªã«ãŒã«ã¯ãããŒã¿ããŠãŒã¶ãŒå ¥åãã©ãŒã ããŠã§ããµã€ãã®ã¹ã¯ã¬ã€ãã³ã°ããŸãã¯ããŒã¿ããŒã¹ãªã¯ãšã¹ãã«ç±æ¥ãããã«ããããããå€éšãœãŒã¹ããã®ããŒã¿ãåžžã«ãµãã¿ã€ãºïŒèŠæ³šæãªããŒã¿ãåé€ïŒããããšã§ãããŸããå®å šã§ãªãåŠçãé²ãããã«ãããŒã¿ãã¢ããªã±ãŒã·ã§ã³ã«å ¥ããšããã«ãµãã¿ã€ãºããŸããããã«ããããµãã¿ã€ãºãããŠããªãå±éºãªããŒã¿ã誀ã£ãŠã¢ããªã±ãŒã·ã§ã³ã§æ±ããããªã¹ã¯ãæžããããšãã§ããŸãã
å ¥åå€ã«ããåé¡ããã§ãã¯ããã®ã§ã¯ãªãããµãã¿ã€ãºãªã©ãå ¥åå€ãæ£èŠã®åœ¢ã§ããã®ã確ãããããšããçã«ããªã£ãŠããŸãããŸãããµãã¿ã€ãºã«ã¯ãã¡ããšæŽåãããŠããã©ã€ãã©ãªã䜿çšããããšããå§ãããŸãã以äžã¯ãã®2ã€ã§ãã
- schemaã¯ããèšå®ãã¡ã€ã«ããã©ãŒã ãå€éšãµãŒãã¹ãã³ãã³ãã©ã€ã³ããŒã¹ãªã©ããååŸãããJSON/YAMLïŒãŸãã¯ä»ã®äœãïŒããPythonããŒã¿åã«å€æãããPythonããŒã¿æ§é ã®æ€èšŒãè¡ãã©ã€ãã©ãªãã§ãã
- bleachã¯ããããŒã¯ã¢ãããšå±æ§ããšã¹ã±ãŒããŸãã¯é€å»ãããèš±å¯ãªã¹ãããŒã¹ã®HTMLãµãã¿ã€ãºã©ã€ãã©ãªãã§ãã
äž»èŠãªãã¬ãŒã ã¯ãŒã¯ã«ã¯ãFlaskã®flask.escape()ãDjangoã®django.utils.html.escape()ã®ãããªãç¬èªã®ãµãã¿ã€ãºé¢æ°ãä»å±ããŠããŸãããããã®é¢æ°ã®ç®çã¯ãäžèšã®ãããªãæœåšçã«æªæã®ããHTMLå
¥åããç¡å®³åããããšã§ãã
>>> import bleach
>>> bleach.clean('an XSS <script>navigate(...)</script> example')
'an XSS <script>navigate(...)</script> example'
ãã®æ¹æ³ã®éçã¯ãã©ã€ãã©ãªã¯äžèœã§ã¯ãªãããšã§ããã©ã€ãã©ãªã¯ãããé åã«ç¹åããŠããã®ã§ããè£è¶³ã§ãããæªæã®ããããŒã¿ãå«ãå¯èœæ§ã®ããXMLä»ã®ããŒã¿åœ¢åŒã«ãè§ŠããŠããŸãã®ã§ããã®èšäºã®æåŸãå¿ ãèªãã§ãã ããã
ãã1ã€ã®ãã䜿ãããæ¹æ³ã¯ãHTMLã®ã¬ã³ããªã³ã°ãJinjaã®ãããªãã³ãã¬ãŒããšã³ãžã³ã«ä»»ããããšã§ããããã¯å€ãã®æ©èœãæäŸããŸããããã®äžã§ãMarkupSafeã䜿çšããXSSãé²ãããã®èªåãšã¹ã±ãŒãæ©èœããããŸãã
ãµãã¿ã€ãºã®ããäžã€ã®åŽé¢ã¯ãããŒã¿ãã³ãã³ããšããŠäœ¿çšãããã®ãé²ãããšã§ããå žåçãªäŸãšããŠã¯ãSQLã€ã³ãžã§ã¯ã·ã§ã³ããããŸããæååã倿°ãã€ãªãåãããŠSQLã¯ãšãªãçæããã®ã§ã¯ãªããååä»ããã©ã¡ãŒã¿ã䜿ã£ãŠãäœãã³ãã³ããšããŠæ±ããäœãããŒã¿ãšããŠæ±ãããããŒã¿ããŒã¹ã«äŒããããšãæãŸããã§ãã
# Instead of this âŠ
cursor.execute(f"SELECT admin FROM users WHERE username = '{username}'");
# ...do this...
cursor.execute("SELECT admin FROM users WHERE username = %(username)s", {'username': username});
ãããã¯ãsqlalchemyãªã©ã®ORM(Object-Relational Mapping)ã䜿ãã°ãäžèšã®ãããªã¯ãšãªã«ãªããŸãïŒ
query = session.query(User).filter(User.name.like('%{username}'))
ããã§ã¯ãããèªã¿ãããã³ãŒããšããã£ãã·ã¥ãªã©ã®ORMã®æé©åãããã«ã»ãã¥ãªãã£ãšããã©ãŒãã³ã¹ãåäžããŠããŸã!
ãã£ãšè©³ããç¥ãããæ¹ã¯ãSQLã€ã³ãžã§ã¯ã·ã§ã³ã®ããŒãã·ãŒããã芧ãã ããã
2. ã³ãŒããã¹ãã£ã³ãã
éçºè ã¯ãPythonã®ã»ãã¥ãªãã£ãç¶æããããã«ãããŸããŸãªéçã³ãŒãè§£æããŒã«ãèªç±ã«äœ¿ãããšãã§ããŸããããã§ã¯ã3ã€ã®ç°ãªãã¬ãã«ã®ããŒã«ã«ã€ããŠèŠãŠã¿ãŸãããã
ãŸãããªã³ã¿ãŒã®ã¬ãã«ã§ããPEP8ã¯Pythonã®ã¹ã¿ã€ã«ã¬ã€ããšããŠãããäœå幎ã圹ç«ã£ãŠããŸããpep8ãpylintãflake8ãªã©ããã®ã¹ã¿ã€ã«ã¬ã€ããšç §ããåãããããã®ããŸããŸãªããŒã«ãå©çšå¯èœã§ãïŒIDEã«çµã¿èŸŒãŸããŠããããšããããŸãïŒã
次ã«ãbanditã®ãããªããŒã«ã¯ãã³ãŒããæœè±¡æ§ææšïŒASTïŒã«å€æããããã«å¯ŸããŠã¯ãšãªãŒãå®è¡ããŠãå žåçãªã»ãã¥ãªãã£åé¡ãèŠã€ããŸããããã¯ãæ§æã¬ãã«ã§åäœããäžè¬çãªãªã³ã¿ãŒãè¡ããã®ããäžæ®µé«ãã¬ãã«ã§ããããã§ããbanditã¯äžé衚çŸãšæ§èœã«éçããããŸããäŸãã°ããã³ãã£ããã¯ããŒã¿ãããŒã«é¢é£ããåé¡ïŒãã€ã³ãåæãšããŠç¥ãããŠããïŒãæ€åºã§ããããããã¯ç Žå£çãªæ¬ é¥ïŒäŸãšããŠSQLã€ã³ãžã§ã¯ã·ã§ã³ãXSSãªã©ã®ã€ã³ãžã§ã¯ã·ã§ã³ïŒã«ã€ãªãããŸãã
æåŸã«ãSnyk Codeã®ãããªéçã¢ããªã±ãŒã·ã§ã³ã»ãã¥ãªãã£ãã¹ãïŒSASTïŒããŒã«ã¯ãè€éãªãã¡ã€ã«éã®åé¡ãŸã§èæ ®ã«å ¥ããŠãæå³è«çåæãå®è¡ããŸãããã®ã¬ãã«ã®ä»ã®ããŒã«ãšã¯ç°ãªããSnyk Codeã¯é«éã«ã¹ãã£ã³ããIDEïŒãŸãã¯çŽæ¥ã³ãã³ãã©ã€ã³ïŒã«çµ±åã§ããã®ã§ãéçºè ãã¬ã³ããªãŒãªããŒã«ãšãªã£ãŠããŸããSnyk Codeã¯ãéåžžã«æ£ç¢ºãªèª¿æ»çµæã説æããPythonã®ã»ãã¥ãªãã£åé¡ãä¿®æ£ããæ¹æ³ã®äŸãå«ããã«ããæäŸããŸãããã®äžãç°¡åã«å§ããããšãå¯èœã§ãç¡æã§ãªãŒãã³ãœãŒã¹ã«å¯ŸããŠã¹ãã£ã³ãè¡ããŸãïŒããã«ããªãŒãã³ãœãŒã¹ãœãããŠã§ã¢ä»¥å€ã察象ã«ãããã¹ããå¶éã®ç¯å²å ã§å©çšã§ããŸãïŒã
3. ããã±ãŒãžã®ããŠã³ããŒãã«æ³šæ
ããã±ãŒãžãã€ã³ã¹ããŒã«ããã®ã¯ç°¡åã§ãããPythonã®ã»ãã¥ãªãã£è匱æ§ãå°å ¥ããç°¡åãªæ¹æ³ã§ããããŸããéåžžãéçºè ã¯Python Package Index (PyPI) ãå©çšãã Pythonã®æšæºããã±ãŒãžã€ã³ã¹ããŒã© (pip) ã䜿çšããŸãããã®ãããããã±ãŒãžãã©ã®ããã«PyPIã«è¿œå ãããããçè§£ããããšãéèŠã§ãã
PyPIã«ã¯ãã»ãã¥ãªãã£äžã®æžå¿µãå ±åããããã®æé ããããŸãã誰ããæªæã®ããããã±ãŒãžãPyPIå ã®åé¡ãå ±åããå Žåãããã«å¯ŸåŠããŸãããPyPIã«è¿œå ãããããã±ãŒãžã¯ã¬ãã¥ãŒãåããŸãã - PyPIãä¿å®ããã®ããã©ã³ãã£ã¢ã§ããããšãèæ ®ãããšãã¬ãã¥ãŒãæåŸ ããã®ã¯éçŸå®çã§ãã
ãããã£ãŠãPyPIå ã«æªæã®ããããã±ãŒãžãååšãããšä»®å®ããããã«åŸã£ãŠè¡åããããšãè³¢æã§ããåççãªæé ãšããŠã¯ãã€ã³ã¹ããŒã«ãããããã±ãŒãžã«ã€ããŠå°ã調ã¹ãããã±ãŒãžåãæ éã«ç¶Žãããã«ããŸãïŒäžè¬çãªããã±ãŒãžã®ç¶Žããééããããã±ãŒãžã¯ãæªè³ªãªã³ãŒããå®è¡ããå¯èœæ§ããããŸãïŒãããã±ãŒãžãããŠã³ããŒãããåã«ãå¿ ãSnyk Advisorã§ãã§ãã¯ããŠãã ããã
Snyk Advisorã§ããã±ãŒãžãæ€çŽ¢ãããšãããã±ãŒãžã«é¢ããå€ãã®æ å ±ãã³ãã¥ããã£ã§ã®ãµããŒãããã°ãä¿®æ£ã®æŽå²ããã®ä»å€ãã®æ å ±ãåŸãããšãã§ããŸãããŸããSnyk Advisorã¯çµæããŒãžã®äžéšã«ã€ã³ã¹ããŒã«ã³ãã³ãã衚瀺ããŸããURLãã€ãžã£ããã³ã°(typosquatting)ãé²ãããã«ããã®ã¹ãã«ãã³ããŒããŠè²Œãä»ããã®ããã¹ããã©ã¯ãã£ã¹ã§ããSnyk Advisor ã¯ãããã±ãŒãžãä¿¡é Œãã¹ããã©ãããæããŠãããŸããã»ãã¥ãªãã£åé¡ã®å±¥æŽãšããã®ä¿®æ£ã«èŠããæéãèŠãããšãã§ããŸãã
ããäžã€ã®ãã¹ããã©ã¯ãã£ã¹ã¯ãä»®æ³ç°å¢ã䜿ã£ãŠãããžã§ã¯ããäºãã«åé¢ããããšã§ãããŸããpip freezeãŸãã¯åçã®ã³ãã³ãã䜿çšããŠãç°å¢ã®å€æŽãrequirements.txtãã¡ã€ã«ã«èšé²ããŸãã
åžžã«ææ°ã®ãªãã¡ã¬ã³ã¹ãç¶æããSnyk Open Sourceã¯ãã»ãã¥ãªãã£åé¡ãšå¯èœãªä¿®æ£ãèšé²ããæ¥çæå 端ã®è匱æ§ããŒã¿ããŒã¹ãããŒã¹ã«ããŠããŸããSnyk Open Sourceã§ã¯ãrequirements.txtãã¡ã€ã«ã䜿çšããŠã¹ãã£ã³ãå®è¡ããçºèŠãããçŽæ¥ããã³æšç§»çãªäŸåé¢ä¿ã®è匱æ§ã«é¢ããå®çšçãªæ å ±ãæäŸããããããããã«ä¿®æ£ããããšãã§ããŸãã
4. äŸåå ããã±ãŒãžã®ã©ã€ã»ã³ã¹ã確èªãã
ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®å©çšãæ€èšããå Žåããããã®ãããžã§ã¯ããã©ã®ããã«ã©ã€ã»ã³ã¹ãããŠããããçè§£ããããšãéèŠã§ãããªãŒãã³ãœãŒã¹ã»ãããžã§ã¯ãã¯ç¡æã§äœ¿çšã§ããŸãããæ¡ä»¶ãé©çšãããå ŽåããããŸãããããã®æ¡ä»¶ã¯éåžžããœãããŠã§ã¢ã®äœ¿ç𿹿³ããœãããŠã§ã¢ã«å ãã倿Žãäžè¬ã«å ¬éããå¿ èŠããããã©ãããããã³ãã®ä»ã®é¡äŒŒã®èŠä»¶ã«é¢ä¿ããŸããããªããå©çšãããããžã§ã¯ãã«å¿ èŠãªãªãŒãã³ãœãŒã¹ã©ã€ã»ã³ã¹ã«ç²Ÿéããããªããæ³çã«åŠ¥åããŠããªãããšã確èªããå¿ èŠããããŸãã
ãããžã§ã¯ããæ³å®ããã峿 Œãªã©ã€ã»ã³ã¹(GPLãSSPL ãªã©) ãæ¡çšããŠããå Žåãã©ã€ã»ã³ã¹ã®æ¡ä»¶ãå®ããããã®ãããžã§ã¯ãã®äœ¿çšãäžæ¢ãããã®ã©ã¡ãããè¿«ãããèªåèªèº«ã远ãè©°ããçµæã«ãªãå¯èœæ§ããããŸããããã«ãã©ã€ã»ã³ã¹ã®ãªããããžã§ã¯ãã«å€æŽãå ããå¿ èŠãããå Žåãèäœæš©æ³ã«æµè§Šããå¯èœæ§ããããŸãã
ããªãã®ãããžã§ã¯ããæç¶å¯èœã§ãPythonã®ã»ãã¥ãªãã£ãªã¹ã¯ãæ³çãªã¹ã¯ã«äžå¿ èŠã«ãããããªãããã«ããããã«ãããªãã®ãããžã§ã¯ããäŸåããŠããããã±ãŒãžã®ã©ã€ã»ã³ã¹ãšè匱æ§ã®åé¡ãã¹ãã£ã³ããŠä¿®æ£ããŸãããã
Snyk Open Sourceã¯ããªãŒãã³ãœãŒã¹ã©ã€ã»ã³ã¹ã®ã³ã³ãã©ã€ã¢ã³ã¹ç®¡çã§ããµããŒãããããšãã§ããŸããæè»ãªã¬ããã³ã¹ãæäŸããªããããšã³ãããŒãšã³ãã®å¯èŠæ§ãåŸãããã®éçºè åãã®ããŒã«ãæäŸããŠããŸãã
5. ã·ã¹ãã æšæºçã®Pythonã䜿çšããªã
ã»ãšãã©ã®POSIXã·ã¹ãã ã«ã¯ãPythonã®ããŒãžã§ã³ãããªããŒããããŠããŸããã»ãšãã©ã®ãã«ãã€ã³Pythonãã£ã¹ããªãã¥ãŒã·ã§ã³ã®åé¡ã¯ãããããææ°ã§ã¯ãªãããšã§ãã
ã§ããããããªãã®ã·ã¹ãã ã§å©çšå¯èœãªææ°ããŒãžã§ã³ã®Pythonã䜿çšããŸããããPythonã®å ¬åŒã³ã³ããã䜿ããææ°ã®ããŒãžã§ã³ã«æŽæ°ããŠãããŸããããSnykã¯åžžã«ããªãããµããŒãããŸããSnyk Containerã䜿çšããŠã³ã³ãããã¹ãã£ã³ããŠå¿ èŠãªæŽæ°ãè¡ããSnyk Open Sourceã䜿çšããŠäŸåå ã®ããã±ãŒãžããã§ãã¯ããŠãã ããã
6. Pythonã®ä»®æ³ç°å¢åãæ©èœãå©çšãã
Pythonã¯ãã¢ããªã±ãŒã·ã§ã³ã®éçºãä»®æ³ç°å¢ã«åé¢ããæ©èœãåããŠããŸããä»®æ³ç°å¢ã¯ãããã«ã€ã³ã¹ããŒã«ãããPythonã€ã³ã¿ãŒããªã¿ãã©ã€ãã©ãªãã¹ã¯ãªãããåé¢ããŸããã€ãŸãããã¹ãŠã®ãããžã§ã¯ãã§ã°ããŒãã«ãªPythonã®ããŒãžã§ã³ãšPythonã®ããã±ãŒãžã䜿ã代ããã«ããããžã§ã¯ãåºæã®ä»®æ³ç°å¢ãçšæããŠãç¬èªã®Pythonãšããã±ãŒãžã®ããŒãžã§ã³ã䜿ãããšãã§ããã®ã§ãïŒ
ã»ãšãã©ã® IDEãCLIããããŠAnaconda Navigatorã®ãããªããã·ã¥ããŒãã«ã¯ãä»®æ³ç°å¢éãåãæ¿ããããã®ãã«ãã€ã³é¢æ°ããããŸãã
ã¯ã³ãã€ã³ãã¢ããã€ã¹ïŒPythonããŒãžã§ã³3.5 ã§ã¯ãvenvã®äœ¿çšãæšå¥šãããããŒãžã§ã³3.6ã§ã¯pyvenvã¯éæšå¥šãšãªããŸããã
ä»®æ³ç°å¢ã¯ãå®å šãªPythonã¢ããªã±ãŒã·ã§ã³ã®éçºãããã±ãŒãžåããªãªãŒã¹ãããç°¡åã«ããŸããä»®æ³ç°å¢ã®å©çšã¯åŒ·ãæšå¥šãããŸãã詳ããã¯Python venv docãåç §ããŠãã ããã
7. æ¬çªã§ã¯DEBUG = Falseã«èšå®ãã
éçºç°å¢ã§ã¯ã詳现ãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ããããšã¯çã«ããªã£ãŠããŸããããããå®çšŒåç°å¢ã§ã¯ãæ»æè ãããªãã®ç°å¢ãã©ã€ãã©ãªãã³ãŒãã«ã€ããŠãã詳ããç¥ãããã®æ å ±æŒãããé²ããããã®ã§ãã
ããã©ã«ãã§ã¯ãã»ãšãã©ã®ãã¬ãŒã ã¯ãŒã¯ã§ãããã°ã®ã¹ã€ããããªã³ã«ãªã£ãŠããŸããäŸãã°ãDjangoã¯settings.pyã§æå¹ã«ãªã£ãŠããŸããæ»æè
ã«ã¢ããªã±ãŒã·ã§ã³ã®æ©å¯æ
å ±ãæŒãããªãããã«ããããã«ãå®éçšã§ã¯ãããã°ãFalseã«åãæ¿ããããšãå¿ããªãããã«ããŸãããã
ã¯ã³ãã€ã³ãã¢ããã€ã¹ïŒæ¬çªç°å¢ã«ãããã€ãããšããCDïŒç¶ç¶çãããã€ã¡ã³ãïŒã·ã¹ãã ã«ããããã€åŸã¯ãã®èšå®ãç¡å¹ã«ãªã£ãŠããããšã確èªããããšäŸ¿å©ã§ãã
8. æååã®æžåŒèšå®ã«æ³šæ
Pythonã«ã¯ãããããæ¹ã¯ãã ã²ãšã€ããšããèãæ¹ããããŸãããå®éã«ã¯æååããã©ãŒãããããæ¹æ³ã4çš®é¡ãããŸãïŒPython 3.6ããåã®ããŒãžã§ã³ã§ã¯3çš®é¡ïŒã
æååã®æžåŒã¯åŸã ã«æè»ã§åŒ·åã«ãªã£ãŠããŠããŸããïŒf-stringã¯ç¹ã«è峿·±ãïŒãæè»æ§ãå¢ãã«ã€ããŠãæªçšãããå¯èœæ§ãé«ããªããŸãããã®ãããPythonã®ãŠãŒã¶ãŒã¯ããŠãŒã¶ãŒãæäŸããå ¥åã§æååãã©ã®ããã«ãã©ãŒãããããããæ éã«æ€èšããå¿ èŠããããŸãã
Pythonã«ã¯stringãšããååã®çµã¿èŸŒã¿ã¢ãžã¥ãŒã«ããããŸãããã®ã¢ãžã¥ãŒã«ã«ã¯Templateã¯ã©ã¹ãå«ãŸããŠããããã³ãã¬ãŒãæååãäœæããããã«äœ¿çšãããŸãã
次ã®äŸãèŠãŠãã ããã
from string import Template
greeting_template = Template(âHello World, my name is $name.â)
greeting = greeting_template.substitute(name=âHayleyâ)
äžèšã®ã³ãŒãã§ã¯ã倿°greetingã¯æ¬¡ã®ããã«è©äŸ¡ãããŸãã"Hello World, my name is Hayley." ãšè©äŸ¡ãããŸãã
ãã®æååãã©ãŒãããã¯importæãå¿ èŠã§ãåã«å¯Ÿããæè»æ§ã«æ¬ ãããããå°ãé¢åã§ãããŸããf-stringã®ããã«Pythonã®ã¹ããŒãã¡ã³ããè©äŸ¡ããããšãã§ããŸããããããã®å¶çŽã«ããããã³ãã¬ãŒãæååã¯ãŠãŒã¶ãŒå ¥åãæ±ãéã«åªããéžæè¢ãšãªããŸãã
æååãã©ãŒãããã«é¢ããŠæ³šæç¹ãããã²ãšã€ãäžã§è¿°ã¹ãããã«ãçã®SQLã®æ±ãã«ã¯ç¹ã«æ³šæããŠãã ããã
9. (ã)ã·ãªã¢ã©ã€ãºãæ éã«è¡ã
Pythonã«ã¯ãpickleã¢ãžã¥ãŒã«ã䜿ã£ãŠPythonãªããžã§ã¯ããã·ãªã¢ã©ã€ãº/ãã·ãªã¢ã©ã€ãºãã "pickling "ãšããä»çµã¿ãçµã¿èŸŒãŸããŠããŸããããã¯å®å šã§ãªãããšãç¥ãããŠãããéåžžã«æ éã«ãä¿¡é Œã§ããããŒã¿ãœãŒã¹ã«ã®ã¿äœ¿çšããããšãæšå¥šãããŸãã
ã·ãªã¢ã©ã€ãº/ãã·ãªã¢ã©ã€ãºã®ããã®æ°ããããã¡ã¯ãã¹ã¿ã³ããŒãã¯YAMLã§ããPyYAMLããã±ãŒãžã¯ãã«ã¹ã¿ã ããŒã¿åãYAMLã«ã·ãªã¢ã©ã€ãºããåã³æ»ãããã®ã¡ã«ããºã ãæäŸããŸããããããPyYAMLã¯ããŸããŸãªæ»æãã¯ãã«ãã¯ããã§ããŸããPyYAMLã®äœ¿çšãå®å
šã«ããã·ã³ãã«ã§å¹æçãªæ¹æ³ã¯ãããŒããŒãšããŠyaml.Loader()ã®ä»£ããã« yaml.SafeLoader()ã䜿çšããããšã§ãã
Data = yaml.load(input_file, Loader=yaml.SafeLoader)
ããã«ãããã«ã¹ã¿ã ã¯ã©ã¹ã®èªã¿èŸŒã¿ã¯ã§ããŸããããããã·ã¥ãé åãªã©ã®æšæºçãªåã¯ãµããŒããããŸãã
ããäžã€ã®å žåçãªãŠãŒã¹ã±ãŒã¹ã¯XMLã§ããæšæºçãªã©ã€ãã©ãªããã䜿ãããŸãããå žåçãªæ»æãããªãã¡DOSæ»æãå€éšãšã³ãã£ãã£å±éïŒå€éšãœãŒã¹ãåç §ïŒã«å¯ŸããŠè匱æ§ããããŸããé²åŸ¡ã®ç¬¬äžç·ãšããŠãdefusedxmlãšåŒã°ããããã±ãŒãžãããã§ããããããã¯ããããã®å žåçãªXMLã®ã»ãã¥ãªãã£åé¡ã«å¯Ÿããå®å šçãåããŠããŸãã
10. Pythonã®åã¢ãããŒã·ã§ã³ã䜿çšãã
ããŒãžã§ã³3.5ãããåãã³ããå°å ¥ãããŸãããPythonã©ã³ã¿ã€ã ã¯åã¢ãããŒã·ã§ã³ïŒå泚éïŒã匷å¶ããŸããããåãã§ãã«ãŒãIDEããªã³ã¿ãŒãSASTãªã©ã®ããŒã«ã¯ãéçºè ãããæç€ºçã§ããããšã§å©çãåŸãããšãã§ããŸãã以äžã¯ãã®ã¢ã€ãã¢ã匷調ããããã®äŸã§ãã
MODE = Literal['r', 'rb', 'w', 'wb']
def open_helper(file: str, mode: MODE) -> str:
...
open_helper('/some/path', 'r') # Passes type check
open_helper('/other/path', 'typo') # Error in type checker
Literal[...]ã¯ããŒãžã§ã³3.8ã§å°å ¥ãããã©ã³ã¿ã€ã ã«ãã£ãŠåŒ·å¶ãããããšã¯ãããŸããïŒãã®äŸã§ã¯å¥œããªæååãæž¡ãããšãã§ããŸãïŒããåãã§ãã«ãŒã¯ãã©ã¡ãŒã¿ãèš±å¯ãããç¯å²ã«å«ãŸããªãããšãçºèŠããŠèŠåããŠãããããã«ãªããŸãããããã¯çŽ æŽãããæ©èœã§ãPythonã»ãã¥ãªãã£ä»¥å€ã®é¢ã§ãæçšã§ãã
泚æïŒã©ã³ã¿ã€ã ã«ãã£ãŠåŒ·å¶ãããªãã®ã§ãåãã³ãã®ã»ãã¥ãªãã£äžã®äœ¿çšã¯å¶éãããŠããŸãã
æåŸã«
Snykã®å ¬åŒãŠã§ããµã€ããå ¬éããŸããããŸãSNSã«ãŠææ°ã®èåŒ±æ§æ å ±ãªã©ãçºä¿¡ããŠããã®ã§ããã²ãã©ããŒããé¡ãããŸãã
ãŸãSnykã¯ç¡æã§ã詊ãããã ããŸãããã²ã詊ããã ããïŒ
SnykãæŽ»çšããããã°ã¯ããã²Qiitaã¢ãã«ã¬2021ããåç §ãã ããã
(2022幎8æ31æ¥è¿œèšïŒ
ãã®åºŠãæ¥ããïŒïŒïŒïŒå¹Ž10æ14æ¥ïŒéïŒã«ãšã³ãžãã¢åãã®CTFç«¶æå€§äŒãSnyk Capture the Flag 101ïŒSnyk ãã£ããã£ãŒã»ã¶ã»ãã©ãã° 101ïŒããéå¬ããããšã«ãªããŸããããã¡ãã¯PythonãçšããŸãã
ãã£ããã£ãŒã»ã¶ã»ãã©ãã° (CTF) ã¯ãæ§ã ãªãã£ã¬ã³ãžãè§£ããŠããã©ãã°ïŒFlag/æïŒããç²åŸããç«¶æå€§äŒã§ãããã£ã¬ã³ãžããšã«é£æåºŠãèšå®ãããŠããã解決ãã課é¡ã®é£æåºŠã«å¿ããŠã¹ã³ã¢ãã²ããã§ããŸããCTFãéããŠã²ãŒã æèŠã§æ¥œãã¿ãªããã»ãã¥ãªãã£ã¹ãã«ã身ã«ã€ããããšãã§ããŸãã®ã§ããããããã°ãåå ãã ããã
ãã€ãã³ãæŠèŠã
æ¥æïŒ2022幎10æ14æ¥ïŒéïŒ15:00-17:00
å ŽæïŒã¢ããŸã³ ãŠã§ã ãµãŒãã¹ ãžã£ãã³ååäŒç€Ÿ ãªãã£ã¹ïŒç®é»ã»ã³ãã©ã«ã¹ã¯ãšã¢ ïŒæ±äº¬éœåå·åºäžå€§åŽ3äžç®1-1ïŒ
圢åŒïŒãã€ããªããïŒäŒå Žã§ã®åå ãšãªã³ã©ã€ã³åå ïŒ
ãç³ã蟌ã¿ïŒäºåç»é²å¶ïŒç¡æïŒ
URLïŒhttps://go.snyk.io/jp-ctf-aws-20221014.html

