目录
根据开放 Web 应用程序安全项目(OWASP),大约三分之二的 Web 应用程序安全漏洞是由不安全的编码实践造成的。这意味着,如果你是一名开发人员,你编写的代码中至少包含一个安全漏洞的可能性很高。
好消息是每个开发人员都可以采用多种安全编码实践来帮助 降低 编写不安全代码的风险。本指南将分享每个开发人员都应该知道的十大安全编码实践。因此,无论你是在一家大型科技公司工作的领先开发人员,还是自由职业合同的学生开发人员,你都不必再担心编写不安全的代码!
在我们深入研究十大安全编码实践之前,了解网络风险的当前状态至关重要。毕竟,作为开发人员,你需要了解你所面临的风险,以便采取适当的措施来减轻这些风险。
ThoughtLab发现,随着网络犯罪分子在全球大流行期间变得更加狡猾,网络安全漏洞在 2021 年上升了 20.5%。
随着网络事件发生频率和成本的上升,开发人员采用安全编码实践比以往任何时候都更加重要。通过这样做,你可以帮助保护你的组织免受代价高昂的网络破坏。
为了让我们达成共识,让我们快速定义一些与网络风险相关的常用术语:
存在多种类型的网络攻击,但有些类型比其他类型更为常见。在本节中,我们将介绍你作为开发人员需要注意的最常见的攻击形式。
SQL 注入是最常见的攻击类型之一。当攻击者将恶意代码插入 SQL 数据库以获取对敏感数据的访问权限时,就会发生这种情况。
跨站点脚本 (XSS) 是一种将恶意代码注入网页的攻击。当用户访问受感染的页面时,恶意代码就会被执行,从而使攻击者能够窃取敏感信息或控制用户的浏览器。
拒绝服务 (DoS) 攻击试图使其合法用户无法使用计算机或网络资源。分布式拒绝服务(DDoS) 攻击是一种DoS 攻击,它使用多台计算机向目标充斥流量,使合法用户难以或不可能访问资源。
恶意软件是一种旨在损坏或禁用计算机的软件。它可以有多种形式,例如病毒、蠕虫、特洛伊木马和间谍软件。
网络钓鱼是一种社会工程攻击,涉及诱骗用户泄露敏感信息,例如登录凭据或财务信息。攻击者经常使用电子邮件或短信引诱受害者访问类似于合法网站的虚假网站,例如银行或社交媒体。
现在我们已经确定了安全编码实践的重要性,让我们来看看每个开发人员都应该知道的十大安全编码实践,以帮助抵御网络攻击。
查找和修复代码中安全漏洞的最佳方法之一是使用静态代码分析工具。静态代码分析工具扫描你的代码以查找潜在的安全漏洞,并为你提供可操作的见解,以便你修复它们。
例如,假设你正在开发用于来电显示的 Web 应用程序。静态代码分析工具会扫描你的代码以查找常见的 Web 应用程序安全漏洞,例如 SQL 注入和跨站点脚本 (XSS)。如果发现任何潜在漏洞,该工具将为你提供有关如何修复这些漏洞的信息。
这不仅包括你正在使用的操作系统,还包括你正在使用的任何第三方软件库和框架。过时的软件通常是造成安全漏洞的原因。随着软件的老化,新的安全漏洞会被发现并在更新的版本中得到修复。但是,如果你仍在使用较旧的软件版本,你就有被这些新发现的安全漏洞利用的风险。
这就是为什么必须始终使用你使用的所有软件的最新版本。通过这样做,你可以帮助保护你的代码免受已知安全漏洞的影响。
这意味着使用大小写字母、数字和特殊字符的组合。为每个帐户使用不同的密码也很重要。这样,如果你的一个帐户遭到入侵,攻击者将无法访问你的其他帐户。例如,假设你正在使用托管 PBX 电话系统并处理 PandaDoc 服务提案模板。为你的 PandaDoccommunications 平台帐户使用与电子邮件帐户相同的密码。然后,如果你的电子邮件帐户被黑客入侵,攻击者也将可以访问你的 PandaDoc 帐户通信平台帐户。
为了帮助你记住所有不同的密码,你可以使用密码管理器。密码管理器是一种软件应用程序,用于存储和加密你的密码。这样一来,你只需记住一个主密码即可访问所有其他密码。
在存储或处理数据之前,重要的是对其进行清理以删除任何可能有害的内容。数据清理是识别和消除或转换数据中潜在有害内容的过程。
例如,假设你正在开发一个允许用户提交文章评论的 Web 应用程序。在将这些评论存储在你的数据库中之前,你应该对它们进行清理以删除任何可能用于发起跨站点脚本 (XSS) 攻击的潜在有害 HTML 标记或脚本代码。
通过清理你的数据,你可以帮助保护你的应用程序免受安全漏洞的影响。
另一个重要的安全编码实践是加密你的通信。这意味着使用一种称为传输层安全性 (TLS) 的技术来加密两个系统之间传输的任何数据。
TLS 是较旧的安全套接字层 (SSL) 协议的继承者。TLS 比 SSL 更安全,因为它使用更强大的加密算法。
在加密你的通信时,使用仍然被认为是安全的 TLS 版本很重要。目前,最新和最安全的 TLS 版本是 1.3。
双因素身份验证 (2FA) 是一个额外的安全层,可用于保护你的帐户。使用 2FA,你需要提供密码和另一条信息,例如发送到你手机的代码。这使得攻击者更难访问你的帐户,即使他们以某种方式设法获取了你的密码。
假设你要通过电子邮件发送客户意向书模板的合规性测试结果。如果你的电子邮件帐户启用了 2FA,攻击者不仅需要你的密码,还需要访问你的手机以查看登录所需的代码。
使你的代码更安全的一种方法是尽量减少你使用的代码量。你拥有的代码越少,出现安全漏洞的可能性就越小。
有几种方法可以最大限度地减少你使用的代码量。一种方法是使用现有的库和框架而不是编写代码。另一种方法是使用设计简洁的编程语言,例如 Python。
渗透测试(也称为笔测试)是对你的系统进行模拟攻击,以发现安全漏洞。渗透测试可以手动执行,也可以借助自动化工具执行。
定期渗透测试是在攻击者利用它们之前发现并修复潜在安全漏洞的好方法。
防病毒软件可以帮助保护你的系统免受恶意软件的侵害。它通过扫描文件并识别任何受感染的文件来工作。如果文件已损坏,防病毒软件将删除恶意软件或隔离文件。
保持防病毒软件处于最新状态至关重要,因为新的恶意软件不断被创建。大多数防病毒软件都会自动更新,但你应该检查你的软件是否属于这种情况。
最小权限原则(也称为最小权限原则)是一项安全原则,它规定用户只应获得执行其工作所需的最少权限。
例如,如果你是开发人员,你可能不需要计算机的管理权限。但是,授予开发人员管理权限可能会导致潜在的安全漏洞,因为它们可能会无意中让攻击者访问敏感信息或系统。
所以你有它。这是每个开发人员都应该知道的十种安全编码实践。它们一起可以减少错误并保护你的系统免受恶意活动的侵害。通过遵循这些约定,你可以帮助确保代码安全、保护你的公司并减少被攻击者利用的机会。
《从零开始学Unity游戏开发》

【内容简介】
资深游戏开发者结合高校实际教学经历,汇总10余年游戏开发经验,专为初学者倾心打造少走弯路的Unity实用知识与全流程实践的丰富案例。书中穿插零基础小白学习Unity常踩的坑的注意事项,让学习事半功倍。附赠120多分钟案例详解视频+3GB的案例原始工程文件。
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha