[不做怎么知道系列之Android开发者的30天后端养成故事 Day29] - 你的Django安全吗?(下篇) #Se

http://img2.58codes.com/2024/201245481XfBtIQRgb.png

哈啰,我们又见面了,昨天提到了 XSSCSRFInjectionClickjacking 的安全议题,今天继续深入研究,在 Django 这个以 Python 为主的后端框架,帮我们做了哪些安全议题的防护措施,类此够 ~ (今天依旧是参考官方文件作为文章大纲)

1. SSL/HTTPS

不同于前面几个项目,SSL/HTTPS 不是一种攻击手法,反而是一种防御方法,透过加密的传输通道,让我们的资料传递过程更加安全。

1.1 什么是 SSL/HTTPS

SSL(Secure Sockets Layer) 是一种安全协定,也就是说浏览器和网站共同遵守这个协定的话,那么在浏览网站时,传输的资料就会受到加密保护,增加骇客要偷走你们资料的难度,目前提到的 SSL 其实是 TLS(Transport Layer Security),是 SSL 的进化版,但目前讲 SSL 都是指 TLS

浏览器和网站的沟通可以透过 HTTP(port 80)、也可以透过 HTTPS(port 443),这两个在于传输资料的安全性不同,现在的网站如果没有挂 HTTPS,通常浏览器都会警告使用者:「这是不安全的网站」,所以遵守 HTTPS 协定是目前的必备品了。

HTTPSSSL 是什么关係 ?

要解释这点,需要先科普一下网路结构,一般来说网路分为五层(TCP/IP)或七层(OSI),我们这边以七层来解释,HTTPS 在第七层-应用层(Application Layer),而 SSL 在第六层-表达层(Presentation Layer) 进行加密、解密。

http://img2.58codes.com/2024/20124548eBk7WTVzYt.png

还想更深入了解的话,可以参考 [Security] SSL — HTTPS 背后的功臣 | Medium。

1.2 Django 怎么做到 SSL/HTTPS ?

Django 提供四个设定的步骤,就能将原本的 http 封包转向 https,详细需要设定的项目,参考官方文件,而详细该怎么让 Django 挂上 https,可以参考 Django部署HTTPS | 掘金。

2. Host header validation

http://img2.58codes.com/2024/201245483VCFwwzSfv.png

2.1 什么是 Host header validation?

也就是 验证 header 内的 host 栏位,源自于 HTTP header injection 的 Host Header Attack,这个攻击简单来说,就是透过修改 HTTP request 中的 host 栏位,并且需配合 server 端有 Caching 机制时,把修改过的封包,暂存在 Cache Server 中,那其他不知情的使用者,就会从 Cache Server 抓到被污染(Poisoned)的封包。

那么被修改 host 栏位,会造成什么影响?

骇客可以把 host 改为自己的 server,然后改为执行某一支有危害的 javascript,严重性可以到作为钓鱼网站,只要能把 host 改为自己的 server 的话,就可能可以执行 上一篇所提到的 XSS 攻击。

2.2 Django 怎么做到 Host header validation?

要防止 Host header attack,就是 不要相信 从使用者发出 request 的栏位,而 Django 替开发者做的是,检查每个 request 的 host 栏位,是否有在 settings.py 中的 ALLOWED_HOSTS 里,但这个检查的功能,只有在你使用 django.http.HttpRequest.get_host() 这个 function 时,才会被检查,所以如果你不透过 get_host() 这个 function,来读取 request 中的 host 栏位,那么 Django 就帮不了你了。

还有一点,Django 预设把 X-Forwarded-Host 选项关掉,如果你要启用 X-Forwarded-Host 的 header 栏位的话,你必须要在 settings.py 中写下:

...USE_X_FORWARDED_HOST = True...

3. Referrer policy

http://img2.58codes.com/2024/201245485WLcYB0Ny6.png

3.1 什么是 Referrer policy ?

HTTP request 的 header 中,有一个栏位是 Referer,但其实正确的拼法是 Referrer,因为早期拼错了,所以沿用,这故事很瞎吧,竟然还被 wiki 给记录下来,总之他们两个是一样的东西,这个 Referer 的栏位,就是告诉后端 server 说:「我是从 referer 这个栏位的网站,连到你的网站的」,上图所显示的就是,我从 google 搜寻连到 iT 邦帮忙首页,所以 Referer 栏位就是 google。

Referrer policy 指的是,在传送 request 的时候,要放多少 referrer 的资讯在里头,可以详细放到是哪个 domain 的某个网页、也可以只放 domain、也可以什么都不放。

3.2 Django 的 Referrer policy

Django 预设有的 SecurityMiddleware,你可以透过在 settings.py 设定 SECURE_REFERRER_POLICY 变数,来告诉 SecurityMiddleware 该怎么制定 Referrer policy,详细可以参考官方文件。

4. Session security

Session(会话),你可以把它想成两个人之间的一次对话,两个人这次见面聊完了就算一个 Session 结束,而下次再见面就是不同的 Session,那么用在网路上,一个 Session 就是使用者造访了某一个网站,然后做了一些行为,可能是登入、结帐等等,都会记录在 Session 中。

4.1 什么是 Session security ?

例如攻击者可以利用 cookies 的机制,在一个正常的子网域底下正常登入,攻击者打下了另一个子网域,然后把这个攻击者登入的 cookies 传送给无辜的使用者,而使用者无意间就用了攻击者的帐号登入了,万一在这样的情况下,使用攻击者的帐号输入了自己重要的资讯,就被攻击者窃取成功。

听起来很绕口,参考官方文件举的例子应该会比较好懂 XD

4.2 Django 的 Session security ?

Django 预设有 SessionMiddleware,会帮你把使用者的 cookies 记录下来,cookies 包含了 session ID,会存在 DB 里的 django_session 表格中,详细的 session 可以参考官方文件。

5. User-uploaded content

简单来讲,就是不要相信使用者传上来的资料,作为一个称职的后端,必须好好检查从使用者接过来的资料、栏位或档案,从这两天的例子可以观察出,很多时候的安全漏洞,都是后端没有好好检查从使用者传来的资料发生的,像是 SQL Injection 就是没有检查资料、像 Host header attack 就是没有检查 host 栏位等等。

6. Additional security topics

官方列了六点,我大致翻译一下:

确保 python code 不是放在 web server 的 root注意任何使用者上传的档案Django 不会限制使用者验证的请求,为了防止被疯狂验证(被 authentication 的流量塞爆),需要安装 plugin 或 server module 来限制在 settings.py 里的 SECRET_KEY 别外洩用防火墙来防御 Caching System 和 Database注意 OWASP 公布的前十危险的网站弱点

单日心得总结

终于把这系列文件 K 完了 QQ,也算是多学习好几种的攻击手法跟防御方法,还有框架能替开发者做的防护有哪些,K 完之后有点像是一个大补帖的概念,会瞬间觉得自己好像懂了点什么哈哈,可是实际在网安的概念都还是太弱了,继续加油~

明天就是这系列的最后一天了,想好好整理一下经过这三十天,从 Android 转学习后端的综合感想,以及未来的走向。

今天是礼拜四,好想工作室固定下午都有「想知道吗」的讲座,创办人 Howard 今天分享了一个主题:「自学的重要性」,提到设定学习目标有两种,一种是 加法 的目标设定,一种是 减法 的目标设定,像我在这系列所订定的目标就是属于 减法 类的,每写完一篇就扣一,直到写完三十篇就算完结,这种 减法 的目标有风险,因为你可能挑战完了,你就失去了目标,进而停止前进,明天的完结篇再来好好聊聊目标订定的哲学。

我是 RS,这是我的 不做怎么知道系列 文章,我们 明天见。


喜欢我的文章吗? 赶快来看看我都发了什么文章吧:我的文章目录欢迎阅读我的上一篇: [不做怎么知道系列之Android开发者的30天后端养成故事 Day28] - 你的Django安全吗?(上篇) #SecurityInDjango #XSS #CSRF欢迎阅读我的下一篇: [不做怎么知道系列之Android开发者的30天后端养成故事 Day30] - 结束是新的开始 #学到了什么? #下一步 #后端?iOS?Android?

http://img2.58codes.com/2024/20124548meDsnCPamL.png


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章