Home
cover of episode #485: Secure coding for Python with SheHacksPurple

#485: Secure coding for Python with SheHacksPurple

2024/11/15
logo of podcast Talk Python To Me

Talk Python To Me

Chapters

Threat modeling is described as 'evil brainstorming' where security experts, developers, and product owners identify potential threats and discuss mitigation strategies. It's crucial for developers to understand threat modeling to build more secure applications.
  • Threat modeling involves identifying potential threats and discussing mitigation strategies.
  • It's important to involve security experts, developers, and product owners in the process.
  • Threat modeling should be done during the design phase to minimize costs and risks.

Shownotes Transcript

开发人员需要了解关于应用安全 (AppSec) 和构建安全软件的内容。本期节目邀请 Tonya Janca(又名 SheHacksPurple)来分享相关知识。我们将讨论开发人员应该从威胁建模活动中期待什么,以及为应用程序和服务安全提供具体的建议。本期节目于 2024 年 11 月 15 日录制。

您正在收听 Michael Kennedy 的 Talk Python To Me,一个关于 Python 的播客。本期节目使用 Python 制作。

欢迎来到 Talk Python To Me,一个每周关于 Python 的播客。我是您的主持人 Michael Kennedy。请在 Mastodon 上关注我 @mkennedy,并关注播客 @talkpython。您可以在 talkpython.fm 上收听过去多年的节目集。

如果您想参与我们的直播节目,可以在 YouTube 上找到我们的直播。请订阅我们的 YouTube 频道 Talk Python To Me/youtube 以获取即将播出的节目的通知。本期节目由 Posit Connect 提供支持,由 Shiny 的创建者提供,用于共享和部署您创建的所有数据项目。使用 Posit Connect 轻松创建快速、交互式的数据可视化和报告。

Posit Connect 支持所有这些功能。访问 talkpython.fm/posit-connect 免费试用 Posit Connect。

本期节目由 Bluehost 提供支持。您需要一个网站吗?那就选择 Bluehost 吧。

他们可以在几分钟内建立一个网站,并提供内置工具来优化您的增长。不要等待。

访问 talkpython.fm/bluehost 开始使用。欢迎谈论这个话题。我很高兴能有您在这里。

哦,我太兴奋了能在这里。感谢您邀请我,Michael。

是的,非常欢迎您。我非常兴奋,既有好的也有坏的方面。我很兴奋能与您交谈,但我们讨论的一些内容可能会让一些人感到不安。他们可能会暂停节目,然后回去修改一些东西,然后再回来。这部分可能会以不同的方式让人兴奋。

是的。

您是否曾经有过在演讲或类似活动中,有人突然离开的情况?

我曾经参加过一次夺旗比赛,当时我正在向大家展示如何进行等号注入。然后,我们就像在没有密码的情况下进入系统。一位女士说:“天哪!”她真的站起来,说:“我必须走了。”第二天她告诉我,她在工作中修复了其中三个漏洞,并且整晚都在工作。

太棒了。您留下了深刻的印象。

这很酷。是的。

太棒了。我从未在安全领域遇到过这种情况,但我曾经为数据库做过一次线下课程,我们确实讨论了数据库和事务。我说:“如果以这种方式操作,它实际上不会使用事务,并且不会显示我做了什么。我会稍后回来。”他们就走了。

天哪,这不好。我们现在必须解决这个问题。希望没有人真的需要在这里这样做。

但我相信人们学习的时间总会到来。说到学习,让我们先了解您一些情况。您有一个名为 SheHacksPurple 的域名,这告诉我们很多关于您的事情。我认为紫色很有趣。

黑客很有趣。

加拿大能告诉我们更多关于您自己吗?

嗯,我曾经是一名软件开发人员,工作了很长时间,然后转行做安全。作为一名软件开发人员,我还喜欢在酒吧和音乐节演奏音乐,作为我的爱好,还发行过专辑,做过所有这些事情。这就是为什么我是一个相当出色的公众演讲者,因为我一生都在舞台上。我转行做安全,成为了一名红队渗透测试人员,也就是攻击系统并进行攻击性安全测试的人。我不是说我们对人发脾气,而是反过来。

我认为,这是黑客攻击的方向。

但是,当我进行渗透测试时,我经常与开发人员一起工作,我会与他们一起编程,帮助他们修复问题。我以前也做过威胁建模。我一直在做渗透测试。

人们说:“你一直在做蓝队工作,一直在做防御工作,你好像拿不定主意。”最终,有人建议我做紫队工作。我在欧洲的一个会议上,在会议期间,一位女士在小组讨论中一直玩手机,无视听众,我们都感到震惊。最后,她说:“非常抱歉,但我的公司无意中创建了一个恶意软件。”

它突然崩溃了,她说:“所以有一个病毒,我点击了这个按钮,攻击了医院等等,天哪!”于是每个人都惊慌失措地跑出房间,都去查看 Twitter,因为有人在谈论这件事。于是人们说:“你必须创建一个 Twitter 账户。”我说:“我该叫什么名字?”我说:“She Hacks Purple。”然后,它太长了,因为我的电子邮件地址是 [email protected],但它太长了。

有人说:“你知道,你一直在做紫队的事情。”我说:“好吧,我明白了。”有人关注我吗?所以我改成了 SheHacksPurple,结果我真的很喜欢。所以我的头发和牙齿上都有一些紫色。我的朋友 Kevin 和我从那以后一直坚持下去。

很多人说:“是的,现在这是她的一部分。”这太酷了。这是一个非常酷的故事。您曾经是程序员,然后转行做安全和渗透测试,您是如何做到这一切的?

这完全是意外。就像我说的,我曾经在一个乐队里,我们办公室里有一个渗透测试人员,他很酷。

有一天,我来到他的办公桌前,说:“嘿,我的乐队写了一首歌《强制性舞会》,我们想做一个移动应用程序,让附近的人知道有舞会,然后你们必须跳舞,否则……谁触发了手机最多次,谁就赢了。”你想和我一起做这个吗?我想做更多的事情,我们的友谊由此开始。然后,一年后,他只是建议我成为一名渗透测试人员,他认为我做得很好。

你做得很好。你已经做了 17 年了。是时候做点新事情了。

我说:“不,我是软件之王。这是最好的。我整天从无到有地创造东西。这比以前任何时候都酷。”

但后来我发现这很酷。嗯,你有时仍然会写出正确的代码,然后最终我意识到我不是为了成为渗透测试人员而生的,而是为了做威胁建模。所以我仍然可以整天和开发人员一起工作。我并不孤单。我晚上在数据中心工作。嗯,我更像是一个社交蝴蝶。

是的。寻找崩溃点。

你仍然可以偶尔在威胁建模中破坏东西,但这并非你所做的全部。你做了很多对话,很多头脑风暴,这对我来说更适合我的外向性格。

是的,你也有一个通讯邮件,人们可以访问网站并注册。我会提供所有这些链接。我想谈谈一些事情。首先,我看到您做过关于威胁建模的演讲。它告诉我们什么是威胁建模,以及一些关键要点,我们的听众主要包括 Python 开发人员、数据科学家以及围绕这些领域的其他相关人员。因此,他们可能对开发人员和数据科学家的威胁建模有很好的了解。它是什么,对开发人员来说意味着什么?

嗯,威胁建模有点像恶意头脑风暴。所以,你把像我这样的安全人员带到房间里,你把开发人员或系统技术负责人带到房间里,然后你把产品负责人带到房间里。

所以,这个人理解这个应用程序的业务,理解它为什么存在于世界上。至少有这三个人,如果有更多人更好,然后你讨论可能出错的地方,以及你将如何处理这些问题。如果有人,比如 Adam,写了一本关于它的书,他会问一些问题,然后我遇到了他。现在我问四个问题:我们正在做什么?然后我通常会在白板上画出来。所以,哦,有一个 API,它与这个交互,然后发生这种情况……

然后有人偷了自行车。好的。然后……

你问一系列问题,所以这里可能出错的地方是什么?然后,你知道,这两个东西在对话,我们应该先处理票据,还是直接与 API 交互?对吧?然后我们列出可能出错的地方。

然后我说:“好的,我们如何处理这些问题?”你讨论的是,这是一个严重的风险吗?这很可怕吗?或者,如果发生这种情况,这听起来似乎不是什么大事,但发生的可能性非常低。

所以,也许我们可以接受这个风险。但是很多时候,就像,如果我们在这里添加一个证书,或者在那里包含身份验证,我们可以进行一些小的更改。如果你在系统开发的设计阶段这样做,通常不会增加成本,或者成本很低。

所以,你基本上改进你的设计,然后把它全部写出来,然后希望有人批准这些更改。嗯,最后,Adam 问的是:我们做得怎么样?这是一个神奇的问题,因为我第一次在政府部门做这件事时,我没有意识到我在对我的主管做这件事。

我说:“这个怎么样?那个怎么样?这可能出错。”因为我认为这个项目很糟糕,我们最终取消了这个项目。

但我提出了所有这些巨大的生存风险,他们认为这个荒谬的项目很好,他们说:“没问题,我会管理这个风险。”我说:“管理风险意味着什么?你什么都不做。”

所以我提出了八个巨大的风险,而你们什么都不想做。我们正在做什么?你今天觉得做得怎么样?我感觉不好。

然后重新开始。然后,几个月后,我们取消了这个项目,因为我有点傻。嗯,我只是想说,我通常喜欢软件开发项目继续下去。这是一个非常特殊的情况,我不认为这符合纳税人的利益。啊,无论如何,我还有更多要说的,但是……

嗯,是的。

但是,我们通常会提出一些可以显著降低系统风险的更改。嗯,这很有趣,一旦你开始做这件事。我第一次做威胁建模时,带着我的开发背景来了,我说:“我会修复任何你想要的问题,我只需要写代码,我可以修复任何你想要的问题。”但当你想破坏东西时,情况就不同了。你必须学习一种新的技能,即如何让你做你不应该做的事情。这花了我一段时间,现在我变得很残酷。我带孩子们去看电影,我们本可以避免这种情况。

现在它甚至延伸到技术之外。哦,是的。

哦,现在它无处不在。我的另一半不工作,去度假。我只是在为孩子们威胁建模。如果我们去游泳池,你的泳衣会湿。

是的,很好。我认为有两种不同的看待方式。从开发人员的角度来看,你必须查看使用的包或库,以及如何验证所有这些输入。我认为威胁建模的范围可能更广。例如,我们是否在没有加密的情况下存储信息?

这让我感到不安。

我一开始就说过,我会对这些事情感到不安。让我对所有这些事情感到不安的是,作为开发人员或科学家,你必须始终正确。如果你有任何错误,那就像小鲍勃一样。

这就像一个目标。这就像一个目标。你制定规则,每个人都认为你很糟糕,但你对抗了这些东西,你什么也得不到。

没错。开发人员……

不应该独自面对这些问题,这就是重点。

所以,我认为安全人员的工作,在我看来,是支持开发人员构建更安全的应用程序。所以,在威胁建模期间与他们合作,或者提供堆栈分析工具或安全扫描器,以便他们编写更好的代码。帮助他们进行培训,在项目开始时提供非常明确的要求,而不是在项目结束时告诉他们哪里错了。这很重要。

例如,如果有人要构建 API,我更喜欢在公共访问的 API 前面有一个 API 网关。我想做的事情包括启用身份验证和授权,以及速率限制,以及其他一些很棒的功能。所以我会在项目一开始就告诉他们,而不是等到最后。我讨厌所有这些设计……

都错了。是的。

但我们以前就是这样做的。当我第一次进行漏洞评估时,我们建议在两天内完成,他们运行了动态扫描器,发现我的应用程序存在跨站脚本漏洞。这已经很久以前了,我在互联网上搜索跨站脚本,只有三页结果。所以,我老了,大家。

那时,这个东西叫什么?ASP?我说:“这是什么鬼东西?”我花了很长时间才弄清楚如何修复它。

我们已经取得了长足的进步。但是,开发人员不应该再孤军奋战了。他们应该得到帮助。并不是说每个公司都需要跳舞,但每个公司都应该有支持他们的安全人员。如果你有许多开发人员,最终应该有一个安全人员来支持他们。

对吧?也许每周或每月花几个小时和他们一起工作,或者像你说的那样,像蝴蝶一样在团队中穿梭,和其他人一起闲逛,比如,你负责API。好吧,今天早上让我和你一起工作一会儿。

理想情况下,这会很棒。而且,如果你是一家足够大的公司,可以开展类似安全冠军计划的活动,那么每个开发团队都有一个代表,你可以给他们更多的培训和更多的时间,并定期与他们沟通。如果我只需要和五十或六十名开发人员合作,我就能了解很多。

但我记得在一家公司工作过,那里的开发人员有两千人,而我一个人。我听到有人说,“好吧,那么我该如何做这件事?” 然后很快,每个团队中只有百分之几的人我会经常和他们交谈。我记得,讽刺的是,我在一次度假旅行中,我的行李卡在泥里,因为一场大暴雨。我当时想,“我应该在推特上发一条关于IT的推文,因为这太糟糕了。” 在我的推文之一中,一位朋友看到了,并帮我把行李拖了出来。我当时想,“他认识我。”

太棒了。这在大型公司中似乎很常见。

我知道我以前从未想过我会得到回复。他说,“嘿,我住在蒙特利尔。你需要帮助吗?” 我说,“是的,我需要。” 他说,“我希望我们总是能帮上忙。” 这就是全部。

本节由Posit(闪亮、正式的)制作商,以及我的工作室,特别是我的工作室,为您带来。让我问你一个问题。你是一个很棒的开发人员或数据科学家吗?当然,你是。

这就是我们所做的。你应该看看Posit Connect。Posit Connect是一种发布、共享和部署你使用Python构建的所有数据产品的工具。

人们经常问我同样的问题。迈克尔,我有一些很酷的数据科学项目或书,我构建了。我该如何与我的用户分享?利益相关者团队成员,我需要快速学习。

闪光,也许你会做出反应。这些被称为技术,我相信你会从中受益,但也许你应该专注于你的数据项目。让Posit Connect处理这些事情。

使用Posit Connect,你可以快速安全地部署你用Python构建的东西,包括流式处理、Dash、Shiny、快速Python库、Dash仪表板和应用程序。Posit Connect支持所有这些。Posit Connect附带所有功能和工具,以满足IT和其他企业的要求。

使用Posit Connect,让部署成为你工作流程中最简单的一步。在有限的时间内,你可以免费试用Posit Connect三个月。访问talkpython.fm/posit,链接在你的播客节目中。感谢Posit团队的合作。

所以你几乎管理了IT。

我不想深入探讨这个话题,但我喜欢一种类似敏捷开发的模式。你找到了一些人,或者来自不同部门或团队的人,并与这些小组一起工作。

是的,是的。当我开始处理安全问题时,我不知道该怎么做,因为我没有接受过任何培训,对吧?我只是想,“我们的所有应用程序都乱成一团。”

我直接转到安全团队。我需要解决这个问题。所以我试图和他们所有人交谈。

但是很快,就出现了一个人,他自认为愿意容忍我以及我所有的安全担忧。我感到很紧张。我会进行一些简短的学习,我当时想,“天哪,这是我的第一次。”

我记得,因为我曾经是开发团队的一员,然后转到安全团队。我当时想,“我午餐时间要闯入银行。谁想看?” 我带了甜甜圈,大家都说,“你不会的。” 我说,“这是一个假银行,但我还是要试试。” 他们说,“但别真的做。”

就像,只是得到正确的动机,我觉得。

就像披萨或任何类型的汽车,但它真的像自我膨胀,但是的,我慢慢地建立了越来越多的关系,然后这就是我完成很多安全工作的方式,因为我不是他们的老板。我不能强迫他们优先考虑安全。我需要说服他们,安全很重要。从我的第一个项目中,其中一个人成为了应用程序安全工程师,今年他刚刚开始他的第一个安全冠军项目。我为他们做了两个月的演讲。

老实说,我认为从软件开发的角度出发,可能会让你在软件团队中获得很多信誉。

是的,因为我可以阅读代码等等,而其他安全团队通常做不到。不过,我为此也惹过麻烦。我在一些地方和安全团队发生过冲突。我工作过的地方,你总是站在他们的立场上,而我错了,因为有时安全团队过于死板。

我当时想,“听着,这是我的新风险。如果你真的考虑一下,从业务的角度来看,IT并不会产生真正的业务风险。所以,我不会。”

升级依赖库,因为这实际上无法解释,并且存在这种预防措施。我们实际上很好,这将导致数月的时间浪费。所以我宁愿把我的社会影响力花在真正重要的事情上。我看到安全团队的人因为这样而对我生气。

此外,在用户名和查询之间,就……就是……你经常看到,无论是PM、pip还是任何包管理器,你可能会看到,“哦,或者升级”。这个库使用的这个库存在漏洞,听起来很可怕,但是如果这个漏洞是你根本不使用的部分,并且你从未将其暴露给互联网,那么你知道可能还有更重要的事情要做,也许不是,但很多时候很难。

决定安全问题,花时间,是的,我们在安全领域称之为可达性。所以我的建议,每个人都同意,基本上是,如果某些东西,让我们看看数学库,数学库有成千上万个不同的数学函数,因为我们喜欢数学,其中一个函数存在一个大漏洞。

但我们不会称之为漏洞。如果你给它一个奇怪的数字,你可能会造成拒绝服务攻击。

溢出,就像,真的不是坏事。这就像真正的代码执行,这很糟糕,但是如果它不是从你的代码内部表中调用,那么它可能实际上不是一个风险。所以,让我们说,最糟糕的情况是远程代码执行。

然后,我需要你用你的软件组成分析工具扫描它,每次你将代码提交到代码库时,确保你没有调用那个危险的函数。所以,如果你将它切换到生产环境,你就不必担心了。

但是只要它没有被触发,我们就不会造成业务风险。但我确实希望它在待办事项列表中,因为在某个时候,我想你可能会升级。但是,让我们说,这是一个中等风险,有很多漏洞我希望人们修复,其中一些甚至可能是严重的。

我希望你使用内容安全策略标头。这算是一个漏洞吗?你没有使用它?在我的心中,是的。但从技术上讲,不是。但这增加了安全层,基本上阻止了脚本执行,对吧?所以我宁愿在整个组织中推广安全策略,而不是升级大量的依赖项,这些依赖项实际上不会伤害任何人。是的,我同意。我认为这……

有意义。

是的,一旦解决了所有其他安全问题,你就可以回来处理那些不那么紧急的问题。

对吧?当然。是的。

我想深入探讨你的书,你之前提了一些很好的建议。我有一个快速的问题。你认为你知道白宫今年年初发布的关于内存安全语言的声明吗?

我知道你最初是用C和C++开始的。我也是用C++开始的。我被踢出了这个领域,然后又回到了这里,然后继续前进。但是,现在我们有很多选择,对吧?我知道你专注于与白宫的人员合作,鼓励他们将Python视为一种选择,但你对此做了什么,以及它的含义是什么?

所以,很多软件都是用C和C++编写的,我看到很多,也许一半,我了解到我们世界中编写了多少软件,它们都是用C和C++编写的,他们说,“哦,未来的软件。” 所以,如果我正在编写全新的软件,是的,我不会用C和C++编写,除非我绝对有必要,否则我会尝试使用Python。但我认为每个人都会突然重写所有东西吗?不,我不这么认为。

原因有很多。例如,我听说在Python中开发很困难,因为与C、C++等语言相比,Python的库很少,所以有很多选择。因为C、C++已经存在了很长时间,所以有很多代码示例可以复制并粘贴到你的代码中,但除非你完全理解,否则不要这样做。是的,有很多注释。

所以,内存安全,如果你要编写一个新的应用程序,你想使用内存安全语言吗?绝对是。我期望每个人都会这样做吗?不,没有人能负担得起。但是我希望看到一个在C/C++之上提供内存安全的框架。这将是惊人的。我会为此付费。就像一个库,它会收集你的垃圾,你不再需要考虑它,对吧?这将是美丽的。这将解决很多向后兼容性问题,如果我们开始在我们的系统中启用它。

是的,远程代码执行问题,很多都是由于溢出、使用已释放的缓冲区,在指针消失之前。很多都是关于内存所有权和你在谈论的事情。

是的,有时还有对象管理。所以,基本上,你能解释一下吗?这是……是的?很好。

好的。所以,我们可以溢出堆栈、字符串或缓冲区。基本上,就像你声明了一个变量,比如,我的饮料。20。很酷。

如果你输入25,你认为那额外的5去哪里了?对吧?猜猜看,如果你这样做很多次,你会找到堆栈指针。猜猜堆栈指针做什么。它告诉你下一条指令在哪里。

如果我告诉它下一条指令在哪里,而它在我的溢出区域内?如果我在溢出区域中添加了自己的shell代码,包含执行恶意操作的指令,例如打开一个Web提示符?我希望看到演示。

演示会很好。谢谢。然后你可以在服务器上远程执行代码,这是我们最不想发生的事情。

这是因为内存安全,因为我们没有自动检查边界,因为我们自己没有进行完美的输入验证,这是一个很难做对的事情。我今天正在教授这个内容,我们花了1小时15分钟来讲解输入验证。他们有很多问题。

其中很多都是,“是的,但是如果它只是内部的,我们不需要进行输入验证,对吧?” 我说,“你是否处理员工薪资?你想让我看到员工薪资吗?那么你可能需要进行输入验证。”

是的。你是否从其他人可能已经入侵的数据库中读取数据?

是的,有很多。我的天哪,有很多……

这不好。

这是一个谈判,这是一个说服的过程,这取决于威胁模型是什么样的。因为如果你每天处理数百万美元,你的威胁模型与我以前工作过的地方大不相同。我以前工作过的地方,整个工作就是每月向护士和医生展示视频,以便他们继续获得认证。他们看了视频还是没看?威胁模型很低。

你不想让别人搞砸了,或者让它崩溃,但同时,它不会登上头条新闻。

对。

我们现在知道,每个人都知道,7.7.2.5没有更新。我不是说它很糟糕,但它不像社会安全号码那样。

完全正确。

让我们谈谈你的书。我认为你的书真的很好。是的。现在,要明确的是,特别是《爱丽丝和鲍勃的安全性》,因为我没有读过其他书,但如果它风格相同,那么它肯定很好。

谢谢。嗯,我的新书叫《爱丽丝和鲍勃的安全性》。我正在写这本书,我很快就要获得免费的HD了,为什么不呢?

它们在这里运行良好。

所以,当我读教科书时,我发现它很难。所以我读了大量的书,我爱读。我坐不住。

读教科书对我来说真的很难。我希望这些知识能牢牢地印在我的脑海里。但我坐不住,坐八个小时真的很难。

我发现传统的教科书真的很难。所以我开始……有人在微软工作时,用双重否定命令命令我。我还能做什么?

对吧?没有退路。他们已经做了。

我知道,就像,没有办法让我摆脱困境。但是我一直在写博客,人们一直在告诉我,我应该写一本书,出版商开始联系我,在博客上用非常轻松的语言。我使用了大量的爱丽丝和鲍勃的例子。爱丽丝和鲍勃是数学家用来向普通人解释图表的。

所以爱丽丝想告诉鲍勃一个秘密,鲍勃是怎么知道那是爱丽丝的?然后我就一直用它们,因为我们都用它们。所以基本上,他直接联系了我,他们说,是的,你可以写世界上最奇怪的教科书,因为爱丽丝要约见的人是,好的,嗯,我的第一本书是关于IT的,是给痴迷于引擎和想从事应用安全工作的人的,因为没有关于如何做这件事的书。

所以我写了一本给过去的我看的书。所以,当我想到爱丽丝和鲍勃拥有ACL时,我想,我想写一本给真正过去的我的书,也就是我当软件开发人员的时候。所以,我应该涵盖什么?所以我涵盖了十种最流行的编程语言和八种最流行的框架。所以,有些框架,很难选择框架,因为我当时是这样想的。

当我读到这些的时候,我对这件事很擅长。

并非易事,而是很难。我问过我的很多粉丝,所以你们可能会不同意我选择的框架。但是真的,像DT、Natta肯定会在里面。

Flask肯定会在里面。但我当时想,我应该把Pandas放进去吗?我应该放什么?我放了JQuery。我的建议是,不要使用JQuery。但是文档。

准备好了,真是太好了。

来吧。嗯,所以选择这些框架很难。然后我想涵盖所有不同的编程建议,因为要快速掌握有很多东西,比如输入验证,它适用于世界上每一种语言和每个框架,这根本无关紧要,我不在乎其中一些人说他们为你做了输入验证。

这还不够。相信我。所以我想要,所以这本书的前三分之一完全是诊断性的,我基本上从第一本书之前就开始提供安全编码培训。

我一直在不断改进和改进它。我想,我现在在这方面有很多话要说。所以我问了我的所有粉丝,你们想在书中看到什么?他们加起来。

他们说,我想看到这个主题。我能看到那个主题。所以我变得更大。但最终,这本书的最后三分之一是系统开发生命周期,所有安全步骤。

但是从开发人员的角度来看,当我还是开发人员的时候,我当时想,为什么我要接受这种液体?什么是威胁建模?我记得参加过一次会议,一个女人说,你想对我进行渗透测试吗?然后她脸红了,脸红了,说,我不知道我是否应该参加这次会议。你好。

快乐。

我知道我当时想说你的网站,你的网站。她说,你只是在这里说了很多不舒服的话,我很抱歉。所以,当渗透测试或威胁建模发生时,要期待什么,比如提出你如何攻击自己应用程序的绝妙想法,这可能就是我们期望你做的事情,以及为什么我们喜欢所有这些工具以及它们的作用以及你可能想如何使用它们。

因为我觉得有时我们只是听到很多安全团队对我说,他们应该知道。你认为如果他们知道他们会做那件事吗?不,你有没有明确告诉他们,我感觉这是暗示的。伙计,这不好,也不够。

这段Talk Python的节目由Bluehost赞助,有想法,但不知道如何建立一个网站,使用他们的AI设计工具,你可以快速生成高质量、加载速度快的网站,或者在你了解外观后立即上线。真的就这么简单。无论你是业余爱好者还是刚开始创业,Bluehost都为你提供内置的营销和电子商务工具,帮助你长期发展和扩展你的网站。

既然你听我的节目,你可能知道Python,但有时最好专注于你正在创建的内容,而不是自己构建网站,再增加一个月才能推出你的想法,当你很棒的时候,Bluehost云平台,你可以获得100%的时间和24/7的支持,以确保你的网站在高流量下保持在线状态。Bluehost确实让建立你的梦想网站比以往任何时候都更容易。还有什么阻碍你?你已经有了愿景。

现在就访问talkpython.fm/bluehost,开始行动吧,感谢Bluehost对节目的支持。是的,我完全同意你的观点,让我快速搜索一下。事实上,至少从Python领域来看,如果你看看PSF和JetBrains最近的调查,你编程多久了?那里有一个地方,是的,你专业编程多久了?33%的人不到一年。

如果你看看不到两年的时间,那占了50%的人,他们刚开始。他们祈祷,甚至没有得到小鲍勃笑话。你。

D,K。

我知道,但是,你知道,认真地说,他们如何建议他们知道自己正在努力弄清楚编译器在哪里,我如何获得虚拟环境?为什么无法导入?他们只是还没有达到可以磨练它、保护它并拥有经验的地步。哦,我的网站在互联网上被黑了8秒钟。

你知道这有多伤人吗?我记得。所以,我的导师,他为我的死亡团队做了一个演讲,因为我负责我在工作场所的实践社区,这令人惊讶,我作为额外人员想要加入实践社区。我邀请他来谈谈。他拿了我们其中一个应用程序,他站在登录屏幕前,说,我将不使用密码进入你的应用程序,这只需要一分钟,因为我正在说话,然后他只是用SQL注入,他进来了,我说,不,不,不,不,不。然后他开始说,当然,所有SQL代码都在我的脑海中,天哪。

我的名字是什么?如果我的名字是引号破折号,没有引号,ma job tvs和破折号破折号,这很有趣。

名字在IT行业,我们都有特殊的名字。但是,是的,嗯,我忘记了,当你问到我的书时,我尝试使用一种非常容易理解的非正式语言,我做到了。

老实说,我没有,我没有把这些联系起来,但我读到这些内容时有这种经历。所以,你知道,谢谢。

我尝试使用不同的方式来解释相同的事情,比如用一个故事,然后是技术解释,也许还有爱丽丝和鲍勃的有趣故事,因为爱丽丝不会接受与海滩人进行不道德的约会,鲍勃真的很崇拜一个很酷的人,嗯,看到它如何应用于人们的真实生活,我觉得它对很多人来说很有共鸣,嗯,是的,我只是想,我觉得安全可能很难,我想,我该如何让它更容易,所以这就是我写这本书的目标,是的,是的。

我认为这非常积极主动。所以我想要从书中摘录一些我认为我们可以在此处进行讨论的引语,我认为这会很有趣。所以,你从书中开始谈论人类以及人类如何参与,普遍信任彼此,对吧?一般来说。

但是,你知道,这就是为什么我们有社会群体,而不是每次看到一个人都要逃跑,你知道,这根本不是做人的方式,对吧?这种信任并不一定能恰当地转移到计算机系统和通信系统中。你举了一些隐性信任的例子,你也有警告或重要新闻,也许你能告诉我们更多关于这些信息。

所以,基本上,当我们开始设计东西时,我们一开始甚至没有密码,就像我记得上大学时,我妹妹告诉她的朋友,我妹妹太疯狂了,她在电脑上设置了密码。就像,谁想登录这台愚蠢的电脑?

她,我是对的。

所以现在我们电脑上都有密码了,但是我们设计系统的方式与我们的社会运作方式一样,隐含着信任。想象一下,有人拿着包裹来到你的门口,按门铃,你打开门。但在动物界,我看了很多自然纪录片,因为家里有小孩子们,如果熊猫看到另一只熊猫,就会发生冲突。

他们可能会生或养育新的熊猫,或者两者兼而有之。这就是动物界发生的事情,嗯,所以,就像他们没有信任,有些会尝试在尝试养育熊猫后互相残杀,就像他们会独自待在某个地方。

所以,当我们开始设计网络时,我们做的事情之一是,我们经常在今天这个世界上建立扁平网络,这意味着外部只有一个防火墙,仅此而已。所以,如果你能访问网络中的任何东西,你就能访问网络中的所有东西,这是一种隐性信任。然后我们想出了分层,比如数据、数据库都在一个区域,周围有一个防火墙。

然后我们有一个公共访问区域,然后我们有一个军事区域,因为我们认为我们很聪明。这是正确的。但是,如果发生实际注入,你已经绕过了防火墙,现在你访问了整个网络中的每个数据库,你已经找到了金矿,这是不好的。

然后我们想出了零信任。所有东西默认都是关闭的,除非有业务需求,否则不要打开它,对吧?所以,假设你有一个数据库、一个API,它有一个前端,然后你有一个服务帐户。所以,服务帐户只与这三件事通信,哦,它与秘密管理工具通信以获取你的秘密。因为你将秘密存储在正确的位置。

你不会将这些秘密放在源代码中,然后检查。

你,当他们出现时。请不要这样做。我只有在尝试说明这一点时才会这样做,但是然后API检查调用它的东西是否是前端,而不是其他人,对吧?然后,如果它被授权访问数据库,我们只有它,没有其他人可以调用该API。

除非你是恶意行为者或测试人员,否则你为什么要调用它?所以,一旦测试阶段结束,在生产环境中,还有什么应该与它通信?所以,你只接受来自那里的连接。

如果我们完美地执行零信任,那就太棒了。但我们经常只部分实施,因为实施起来需要很多工作。如果你做错了,那会很痛苦。是的。

是的。你认为像这样的东西,比如要携带的东西,也许他给了我什么?

所以,风险业务一直在发生,这是部分原因。他们喜欢。

补丁、灰色和亚历山大。这个家伙的名字不是爱丽丝。是尼克吗?

他聊过的人?我没有听过,就像。

一年,是的,对不起,我忘了姓氏,但是名字,无论如何,他们做得很好。

是的,所以,是的,继续,这真的很好,而且有很多,比如凯蒂,我喜欢,他们会嘲笑一切。没有什么神圣不可侵犯的,所以很有趣,但是基本上,嗯,这些事情会影响她和她为之工作的公司,这就是为什么我听到这么多好消息,因为他在这档节目中。他们制作了,基本上,这些会出现在你的网络上的东西。

所以,例如,它可能是一个伪造的Word文件。嗯,它可能是在你的网络上的某个地方的伪造文件,然后你看看它是否被盗并出现在某个地方,因为它会打电话回家,所以人们会。想象一下,你有一个数据泄露,然后你可以看到,因为它打电话回家,或者你一直在搜索互联网以寻找它,然后你看到,哦,天哪,它实际上今天出现在Stack Overflow上,就像你一样,因为我一生都在做这件事。这是一个很长的故事。我试图在一天内提出所有真正的问题,他们不喜欢它。

我觉得他们应该仍然给你一个警告,而不是一个错误。

但是,好吧,我同意,对吧?有人以某种方式回答了他们不喜欢的东西,不要压制结果。你已经越过了界限,这就是你如何修复代码,尽管你没有回答他的问题,但无论如何。

你知道,这可能很严厉。你对信任有什么看法?

是的。所以,基本上,就像这个人说的,他的网站正在被他的所有竞争对手抓取,而不是自己输入信息。所以,他将音乐艺术家放入数据库中,然后他去其他公司搜索这些伪造的音乐艺术家。

然后他发送停止和中止通知。所以,就像金丝雀的概念,就像代码中的金丝雀吗?但是基本上,有人偷了它。然后,如果我能,我相信其中一些人可以打电话回家,基本上,如果他们使用它,你就可以看到它是你的,然后你就会说,哦,我们有麻烦了。

是的,这是该区域的早期警报,在代码中。

我认为这是一个好主意。但是,我认为如果金丝雀飞走了,你已经很糟糕了,对吧?我认为这很酷,但它不会成为第一个安全措施。

我会像这样做的,我有一个高级程序,它很好,我想做得非常出色。是的,是的。

听起来不错。对吧?你说的,如果你从你的书或这个播客中学到一件事。

所以,让我们把它改成,我希望它。这是设计每个系统,尽可能少地使用隐性信任吗?我多年来一直强调这一点,这是真的。

这是我们想要的。所以,在我的第一本书中,我就像信任,即使你的妈妈,因为我的妈妈有一天不小心给我发送了一个病毒,我打开它,因为它是我的妈妈。所以你甚至不能信任你的妈妈,即使你的妈妈是一个天才数学家和化学家,因为她仍然可以在她的电脑上感染病毒。是的,因为他们把她。

变成了她的骄傲儿子。是的。她只是没有那么复杂的病毒。

它变成了他。但无论如何,所以,所以不要信任任何人。所以,当你收到你的API的输入时,无论它来自哪里。

所以这可能意味着从数据库中获取东西。所以,除非你确定某个静态表是可信的,否则你应该检查从数据库中获取的东西。假设有人填写表单,然后你将其保存到数据库中。

所以你想验证这些值。你将其保存到数据库中。然后假设一个 API 去获取一些数据来处理。我还会再次验证这些值。

然后他们将其放在一个武器上,并且其中包含一个方括号中的 JavaScript。是的。

然后在将其发布出去之前添加代码。我将拥有内容。当前策略还有很多其他内容,但我跑题了。

但是如果我们不能信任我们得到的一切,并且始终验证它,那这就是我们期望的。如果不是,我们拒绝。所以我们不会尝试修复它。

这就是我们期望的吗?所以这可能意味着,例如,生日。嗯,它是第一位。

它是一天吗?它是在过去吗?它是在过去一百五十年以上吗?因为那不太可能。它符合你预期的格式吗?这些是我们可能检查的一些内容。

如果任何一项不正确,则拒绝并说:“嘿,实际上我们期望的是这个,但是假设你需要一个人的姓名。我与一个名叫 Lugo Meli 的人合作。他的姓氏中有一个单引号,这是一个特殊字符。

如果我们要使用 SQL 数据库。那么我期望什么?我希望是小写和大写字母,我希望是连字符或单引号。

所有这些都在我的批准列表中,我的允许列表中。所以我将其与我的允许列表进行比较,而不是阻止列表,因为阻止列表包含不良字符。猜猜会发生什么?十年过去了。我的意思是。

使用 Unicode 转义序列或某些渲染内容。

是的,围绕它有很多东西。就像我记得。当我学习到这一点时,我对过去的所有应用程序感到多么悲伤。所以你使用一个好的内容的批准列表,你接受单字符,你接受,然后你对其进行沙箱化或转义。所以如果沙箱化意味着更改其值。所以你可能想要将连字符更改为管道,你可能在管道上,也许这是一个特殊字符,但是,例如,是插入符号,然后你将单引号更改为顶部符号,然后这些就不是问题,然后你将其传递给它,所以你验证了期望的内容。然后你使用转义,有时转义它们,或者转义它们以仅放置反斜杠。

在特殊字符前面,或者可能是 HTML 或 URL 编码为百分比、一些数字,即引号。我永远不会让它产生任何结果。

这取决于你想用它做什么。如果你要将其放入查询中,也许你想转义它。嗯,它会为你转义它。当它到达那里时,有很多选择,但单引号是关键。

好的,下一部分是 Python 部分。正如你所说,你有很多不同的技术,它们在今天很流行。

你没有 JavaScript,你没有 C#、C++、不是 Crust、仅限 Windows 的 .NET。你有 Python,我们自己也有 Python。我认为这很好。让我们谈谈一些应该做的事情。也许从这个列表中选择一些你想要谈论的。

好的,其中一些非常明显,例如,请使用 Python 3。是时候告别 Python 2 了。我知道我们仍然会在心中爱它,但是新应用程序应该在 3 上运行,嗯,更新我们的环境。

这通常适用于每个框架。一件事情是,如果你发现一个真正的安全漏洞,向 Python 的安全人员报告它。无论编程语言或框架是什么,这都是一件有价值的事情。

如果你觉得你发现了一个真正的漏洞,你应该支持它或报告它。因为结果是,当他们修复它时,他们正在为成千上万、成千上万的人修复它。而你,我们很棒的人类。

所以,为了你,我想感谢 Python 的维护者和贡献者。他们投入了大量时间和精力来增强 Python 的安全性。迈克·费弗和其他人都在努力,作为包索引背后的安全人员,以及更广泛的 Python 安全。

希望如此。但是我们现在有两个人全职致力于这项工作。以前我有点像志愿者,还有其他人贡献他们的业余时间。

希望他们能抓住它,你知道。所以这很好。并且你发布了 Python 中有安全工作的信息。电子邮件或合法的报告不会打扰忙碌的人。

是的,不要打扰他们。测试并确保它可重复。这些人非常忙碌。有很多事情。所以其中一件事情是,例如,如果你正在处理这些输入,我们正在谈论这些输入,我们正在从你的代码中获取页面输入,我们可以使用 string 模块中的模板类,而不是其他字符串操作函数。如果我们这样做,它会更安全。字符串溢出会减少,例如,如果我们避免使用字符串和 str.format 来处理用户输入,因为用户可以操纵它。所以听起来很累,但是使用 string 模块中的模板类不容易被操纵。是的,我知道我为此做了很多研究。

我,是的,他们刚刚向 Python 类型系统添加了一种名为文字字符串的新类型,它适用于不应接受用户输入的内容。如果你有一个小字符串,它是一个查询,并且你将其与来自普通字符串(例如用户输入)的内容组合在一起,它基本上会失败类型系统。它仍然在 Python 中运行,但是至少你可以使用我的类型检查器来检查它。

这太酷了。是的,是的,是的。真的有……

没有太多工具支持它,但是静态类型检查可以做到。我认为这里值得一提的另一件事是,你谈到了确保你的依赖项已锁定。

嗯,我喜欢查看所有笔记,你已经锁定它们了。所以,我与我的技术编辑就这个问题争论过。所以你想要锁定依赖项,就像你在所有不同的环境中进行操作时,不要让它在到达生产环境时更新。否则,如果你在测试不同的版本,对吧?所以你想确保你在测试中使用相同的版本,因为否则你的测试结果不准确,对吧?

是的,它可能相同,或者它可能是重要库在检查时和到达容器时之间更新的库。不同。

但另一件事是,你不想让它永久保持这种状态。所以,就像当你……所以这听起来很奇怪。所以你将其锁定在那里,但是我仍然知道它在哪里。

我认为最大的区别在于,你是在构建应用程序还是库?人们正在使用它来构建应用程序,因为你的应用程序应该选择其版本,但是如果你明确地为库选择它们,你就会强迫人们使用旧的、易受攻击的版本,对吧?这是一种关于我在其中扮演什么角色的紧张关系,我认为这很棘手。

是的。所以理想情况下,如果你要将某些内容投入生产,你不想在不同的环境中更改它,这可能非常糟糕。但是,正如你所说,锁定版本。

嗯,我只是在屏幕上阅读它。我记得我安装它时……我正在与一家公司进行概念验证。

为了安装它,它要求我降级 npm 依赖项。然后它向我展示了这些依赖项中存在巨大的漏洞,他们要求我使用这些依赖项。我说:“好吧,好吧,这很糟糕。”所以,当你为某人创建产品时,如果他们可以在编译方式中看到这一点,那对许多客户来说都是一个破坏交易的问题。客户现在非常精通安全问题。我喜欢它。

是的,这真的很好。即使不考虑安全性,如果你有两个库,它们都使用一个子库依赖项,并且它们具有不同的锁定版本,其中一个版本小于或大于或等于另一个版本,并且这些数字之间没有交集。你只是……好吧,你无法使用它。

我想我们只是不能使用它,因为它会说“我不能同时给你大于 2 和小于 2 的值”,对吧?这很棘手。但是安全性非常重要,很明显。让我们看看。是的,嗯,Bandit 这是一个有趣的工具。

Bandit 是一个免费的静态分析工具,专门为 Python 设计的。所以,例如,如果你使用 Ruby,则有 Brakeman,它专门为 Ruby 设计的。所以这太棒了,因为它只关注你的语言,因为它免费且开源。它没有庞大的安全团队来支持它,但是如果你从未使用过静态分析工具,这是一个很好的起点。

当我教授安全编码时,它一次又一次地被推荐,我有一个 Python 资源列表。人们喜欢它。人们为它制作了很多工具,因为他们喜欢它。

并且非常流行。它有一个……

很酷的界面。它非常可爱。我喜欢他们如何称呼它。他们称之为安全冬季。我会说它更像是静态分析,因为它确实试图找到源和汇,并进行流程分析。我不知道它是否使用符号执行,我还没有看到它内部是如何工作的。所以,当你购买测试工具时,它们有第一代和第二代,以及不同的工作方式。我很想知道它内部是如何工作的。

是的,是的。它看起来真的,看起来很酷。你知道,它会发现一些常见问题,例如 pickle 问题,解析可能更好。知道你仍然可以做所有不同的事情,但是人们决定不选择,但是我们将其保留在那里。所以我们不会破坏正在执行此操作但不要执行此操作的内容,并且有点像 C++ 中的指针安全字符串复制,你不再像以前那样复制……我如何……

甚至任何你我感觉到的,它被称为安全冬季,而不是静态分析。我觉得它也关注代码质量,而不仅仅是安全性。这也很有帮助。

因为如果你有更高质量的代码,它只会更安全。它会更容易维护,更容易调试。所以,如果当前存在问题,你可以更快地解决它。如果你有更高质量的代码,你将拥有更少的技术债务。所以这也是一个胜利。

当然。好的,让我们谈谈关系型数据库之类的东西。

我认为……

大多数人没有一个与数据库对话的应用程序,该数据库通常独立运行。当事情出错时,通常是数据泄露导致新闻报道。

并非总是如此,但通常如此。

是的。但是它会发生。

所以,在实际服务器上,对吧?所以这是一个服务器,你需要修补它。你需要保持它的运行。

你需要维护它。它附带了强化指南。你应该按照强化指南中的所有步骤操作。

你应该确保你与之合作的每个人都无法访问它,对吧?这看起来非常明显,但你会感到惊讶。嗯,像基本的服务器强化,以及应用于其上的 SQL 软件。

SQL 服务器软件本身也可以强化,这听起来可能很奇怪。但是它需要更新。嗯,所以你想确保你以你认为应该的方式锁定它。

然后我可以以不同的用户身份运行,对吧?如果我以 root 身份运行,它会更容易,但是如果有人进入并突破它,它会更好,对吧?你不想让他将其用作横向移动。首先,他们进入服务器,然后他们进入……谁知道哪里?

我们还希望确保人们不会以数据库所有者的身份访问它,除非有数据库所有者,对吧?理想情况下,DBO 用户很少使用。嗯,例如,如果你使用的是 MSSQL 服务器,是的,它具有数据库所有者权限。我明白,因为你是数据库管理员,但是如果你的 API 正在访问数据库,我们希望使用最小权限方法。

所以,如果你只是执行 select 语句,只需使用只读用户即可。如果你不需要创建、更新或删除,那么你应该使用一个更少的权限用户。但是,如果我们考虑它,DBO 几乎永远不需要。所以,如果你没有它,会发生更少的事情。

这会访问每个表或只是……

这 10 个表。完全正确。另一件事是,将每个表中的数据分类为敏感或非敏感,也许你正在为政府工作。所以也许它是机密或绝密或你的组织使用的任何内容。但是,如果你可以对这些内容进行分类并标记它们,那么许多数据库现在都具有敏感性标签,这太棒了。但是,如果它不是一个实际字段,如果它不是一个名为敏感性的字段,然后它只是公共的或未分类的或绝密的,不要显示给人们。当你这样做时,如果发生安全事件,它会让生活变得如此轻松,因为我知道如果我需要不同的级别,或者如果我需要不同的级别,并且如果没有标记,我必须在知道它具有较低威胁之前假设最坏的情况,这真的很糟糕。

是的,当然。你在这部分提到的另一件事是确保启用日志记录,你需要在发生问题之前这样做,因为日志会告诉你发生了什么。

是的。

我认为不仅仅是数据库,而是所有方面的日志记录。

我的书中有一整章关于应该记录什么、不应该记录什么、如何记录以及如何保护你的日志。我有一个客户,有 20 个客户的信用卡在 Visa 交易中被盗,他们希望我们证明这不是我们做的。然后,我们去获取日志,我们删除了这些……

你知道,很难备份。

我说啥,他们说我们四个月前刚换了服务器,所以就把旧服务器删了。所以,我们四个月来没有任何记录,嗯……幸运的是,同一栋楼里正好有一家特警队,他们打电话给员工,刷了卡。

所以我们弄清楚了这件事,然后心想太好了,我们都得被解雇,因为他们知道了。但是,如果你利用IT技术,你的主要赚钱方式是通过互联网收费,那么你刚刚降低了你从事资本主义主要目标的能力。是的,生活就是你不想拿走VISA或Master卡。别这么做。

这绝对、绝对、绝对令人不安。让我们看看你使用ORM时有什么更多建议,如果你能的话,因为它们基本上是免疫的。但是,它们有很多自动保护措施,防止你进行提取操作。

所以要找到这些东西比较难。而且,它们还会根据你使用的ORM为你编写很多代码。我用过带有点NAND的实体关系框架。就像我要为你写get和sad,以及为你做这些和那件事,哦,天哪。

太好了。谢谢,伙计。甚至包括你的迁移。

这很不错。

我很好。我相信。我知道有些人说,不,这有点……随便吧,嗯,我喜欢把事情做好,晚上睡个好觉。我认为另一个非常重要的点,尤其是在数据库方面,但一般来说也是个好主意,就是要有周全的、经过深思熟虑的备份计划,至少尝试备份一次,至少尝试恢复一次。

是的,我在一家公司工作过,我们遇到过电脑问题,整个两千百分部门所有人的工作都丢失了,持续了一整周。所以,在接下来的三天里,我……他们已经丢失了我们所有人的工作。

虽然所有人的工作都没有保存,但已经消失了,我们去备份,然后说,好吧,你们去做吧,他们说,哦,这至少要花一个月,我们以前从来没有尝试过,我们也不认为真的会成功,所以你们应该重新做一遍,我的老板说,哦,我想我们得重新做一遍。我说,嗯,我可以雇用新的软件开发人员吗?为什么?因为那些家伙显然要被解雇了。

太好了。然后我可以雇用两名新开发人员。这太好了。

他说,托尼娅,回你的房间。我们不需要他们来做他们的工作。他们只是证明他们的工作完全没有价值。

所以,就让他们走。他说,别说话,走开。

我很沮丧。

但这没有建设性。

我要解雇他们。他们要解雇我,因为我刚刚……你刚才说的,是的,现在想到的一件事是,在过去,我们有Subversion和CVS,以及所有其他东西,如果其中一个出了问题,我们……有人可能会有上百份副本。从软件人员的角度来看,这不太糟糕。

我工作过三次,他们都丢失了他们的代码。是的,有一次我刚开始工作,一个初级员工不小心删除了它,我设法访问每个人的电脑,恢复了大量的代码,并重新组合了一段时间。另一次是有人删除了它,我觉得是恶意删除的,然后另一次,基本上,我们不想等待共享服务。

所以加拿大政府决定成立一个部门,成为整个政府的IT部门,但他们就是不给我们服务器。

所以我们从另一个房间里拿了一个服务器,决定将其作为我们的代码库。然后我建立了一个完整的网络,建立了活动目录等等,我安装了团队基础服务器。

我做了所有的事情,我告诉他们,听着,但我做了。但是你需要每天晚上备份它。他答应我他会创建一个环境。后来,它崩溃了。

他说,你会让它重新运行吗?这是一个红色服务器,它很可能删除了一切。是的。所以我当时说,我们会帮你恢复……

备份……他……

五个月来一次也没有备份,我们丢失了十一个承包商长达五个月的工作。我说,我太生气了,他说,你能否花这个周末帮我们?我说,不,我对你太生气了,你做不到,我不知道该怎么做,我对你很严厉。

你会学到的,以艰难的方式学习。是的,所以我们几乎一直都在这样做,但是我给你,安娜,也许只是想指出,Flask有一个很棒的部分,你谈到了很多不同的扩展,你可以使用它们,例如Flask-Secrets进行秘密管理,或者Flask-WTF进行CSRF保护等等。所以里面有很多东西。人们想检查输出,我想我们可能需要打电话给IT部门,看看是否有好的东西。

如果你想了解更多信息。显然,购买我读过的所有在线书籍,学院,一些抓取开发人员。我不知道你是否想让我拼写它,因为那很糟糕。而且那里……

哦,就像它通过……

这是我的全职工作。所以我一边学习,一边为他们做全职工作。但我把它放在我们的私人聊天室里,基本上……我有一个免费的安全性编码课程,已经有一两年了,就像这本书是全新的内容,但它涵盖了这些内容。

你知道如何进行输入验证,如何进行输出编码,如何确保你使用的是主要尝试查询,如何配置每个安全帽子,这完全是免费的。我这么做是因为我们需要做得更好。真的吗?是的。

谢谢。这就是全部。

谢谢。

是的,这真是一个非常有趣的谈话,我觉得我们可以再聊两个小时。但是……

嗯,也许明年我们再回来,如果你有……

是的,是的,这太棒了。让我们用最终的行动号召来结束这次谈话。人们,你们已经吸引了他们的注意力。

我想,嗯,也许我应该验证一下,或者了解更多。你想告诉他……

在我们结束之前?我希望你看看你正在使用的任何框架,看看它们的安全功能,并在你的代码中开始使用它们。所以,如果你使用的是Flask,Flask中有很多很棒的东西。请使用它们。你的生活会更好。

是的,绝对。感谢你分享你的经验和故事。这很有趣。

非常感谢你。让我开车……是的,你。

但这又是另一期Talk Python to Me。感谢我们的赞助商。请务必查看他们的产品。这真的有助于支持节目。

本期节目由Posit Connect赞助,由Shiny Public、Share和部署你创建的所有数据项目的制造商提供,使用Pipon Streaming Dash、Shiny Book、快速第一季度报告仪表板和APS。Posit Connect支持所有这些。通过访问talkpython.fm/posit,免费试用Posit Connect。

本期节目由Bluehost赞助。你需要一个网站吗?那就用Bluehost吧。

他们的AI可以让你在几分钟内建立一个网站,并且他们内置的工具可以优化你的增长。不要等待,访问talkpython.fm/bluehost。开始提升你的Python技能。

我们拥有最大的Python视频课程目录,涵盖了我们最棒的Python课程。我们的内容涵盖从真正的初学者到深入高级主题,例如内存和异步。最棒的是,没有订阅,自己去看看talkpython.fm/training。

请订阅本节目,打开你最喜欢的播客应用,搜索Talk Python to Me。我们应该在顶部。你也可以找到iTunes feed(talkpython.fm/itunes),Google Play feed(talkpython.fm/play)和直接RSS feed(talkpython.fm/rss)在顶部。

Talk Python to Me的直播流,我们现在的大多数录制,如果你想成为节目的一部分,并让你的评论在节目中播出,请务必订阅我们的YouTube频道talkpython.fm/youtube。我是主持人Michael Kennedy。非常感谢收听。我真的很感激。现在出去写一些Python代码吧。