jjzjj

每位开发人员都应该知道的安全编码实践

张增斌 2023-03-29 原文

​译者 | 张增斌

策划 | 徐杰承

目前,为了缩短软件的上市时间,几乎每一家企业都在寻找能够使软件开发过程提速的方法。但在这其中,大量企业并没有充分考虑软件安全性相关的问题。

那么作为一位软件开发人员,该如何确保开发过程的安全性呢?软件开发工程师可以使用多种方法来确保代码和数据的安全。

1、模块化编码

软件已经成为我们日常生活的重要组成部分,因此我们遵循安全编码实践才有意义。毕竟,软件开发工程师需要对代码的安全负责,我们需要确保不会危及到代码的安全性。

好消息的是,安全编码实践并不是一件新鲜事。事实上,大多数有经验的软件开发工程师已经熟悉其中的一些规则。

安全编码最基本的概念之一是处理异常的概念。异常可能由于多种原因而发生,包括输入错误、逻辑错误或配置错误。

为了使软件更加安全,必须假设在某些时候会出现异常。与其让这些事件发生,不如通过捕获它们并执行一些操作来阻止代码继续执行。

2、代码混淆

代码混淆是一种重要的做法,它可以防止黑客访问应用程序中的敏感信息。而代码混淆涉及各种技术,例如算术混淆,将正确的数值替换为具有误导性的数值。

字符串加密是另一种代码混淆方法,它将字符串隐藏存储在可执行文件中,然后在运行时显示原始值。

代码混淆使代码难以阅读,通过删除换行符和空格,降低代码的可读性。这种做法是提高程序性能的好方法,但同时代码混淆也存在很多风险。

虽然它看起来无危害,但它会带来严重的安全后果。例如,如果攻击者可以读取软件的代码,他们就可以使用它来提取敏感信息,例如API密钥或密码。

使用代码混淆的主要好处是它可以生成更轻便的应用程序和更高效的代码执行。此外,它还可以保护你的知识产权。在某些情况下,攻击者会通过泄露代码中的安全漏洞来敲诈行业巨头。

这是应用程序开发工程师用来保护不同程序代码的常用方法。因为直接用肉眼查看代码时,混淆代码几乎无法理解。

3、访问控制

安全编程最重要的方面之一是访问控制。它允许开发人员限制对敏感数据的访问,同时防止访问不受信任的数据。它还通过限制对具有正确权限的用户的访问来防止数据从系统泄漏。

除非经过身份验证,否则用户将无法登录到管理页面。

为确保安全的编码实践,开发工程师应评估其软件开发生命周期的成熟度以及开发工程师的技术栈。

安全编码实践只能由拥有足够能力和经验丰富的开发工程师实施。开发工程师应该能够在提交代码之前验证系统设计并验证输入。

访问控制是安全编码框架的一个重要方面,开发工程师必须了解如何实施它。缺乏适当的访问控制可能会导致灾难。幸运的是,有许多技巧和工具可以帮助开发工程师保护他们所开发的软件。

例如,开发工程师应始终加密敏感数据并以加密形式存储。为了进一步提高安全性,开发工程师应将敏感数据嵌入本地参数存储、var文件和代码存储库中,切勿让其处于不受保护的状态。

安全编码是开发工程师设计代码以遵循安全最佳实践的过程。此过程保护已发布的代码免受已知和未知漏洞的侵害。它还可以防止黑客利用安全漏洞并将其用作攻击系统的载体。

成功实施安全编码实践需要改变公司内部的文化。

4、阻止反射型XSS

XSS攻击有两种类型:持久型攻击和反射型攻击。持久型XSS攻击针对易受攻击的网站或应用程序的所有用户。当攻击者将恶意脚本注入链接,然后用户单击它执行它时,它就会起作用。

另一方面,反射型XSS只需要用户单击一次。

这种类型的XSS攻击使用JavaScript代码在被攻击者的浏览器中运行并利用各种漏洞。该代码还可用于获取对用户计算机的访问权限、加入僵尸网络或窃取用户敏感数据。大多数反射型XSS攻击都是基于社会工程技术。

攻击者可以通过制作伪造的登录页面来诱使用户相信他们正在登录安全网站。这允许攻击者窃取用户的密码管理器,从而导致安全漏洞。

反射XSS攻击更难检测。攻击者通过钓鱼邮件向被攻击者发送恶意URL。受害者的浏览器然后加载站点的搜索页面。后端处理搜索词,攻击者将恶意脚本插入到响应中。

另一种类型的XSS攻击涉及使用不受信任的输入。这些攻击是攻击者渗透网站并攻击其用户的好方法。出于这个原因,开发工程师应该采取措施通过遵循安全编码实践来保护他们的Web应用程序。

例如,使用OWASP编码项目库,开发工程师可以通过启用“X-XSS-Protection”标头来轻松保护他们的Web应用程序。

5、在开发过程前期发现漏洞

软件漏洞是应用程序设计或实现中的弱点,可能允许未经授权的用户运行命令或利用系统。

虽然并非所有软件安全缺陷都是实施错误,但大约一半的可利用安全缺陷是由于软件设计缺陷造成的。这意味着组织需要时刻保持警惕,以识别和修复潜在的漏洞。

漏洞按照严重性和风险分类,可能会影响软件、服务器和网络。如果没有修复漏洞,网络犯罪分子可能会利用这些漏洞窃取敏感数据、中断服务或破坏公司资产。

因此,在开发过程的前期识别和修复漏洞非常重要。

漏洞可分为高风险或低风险。这就是为什么对漏洞的严重性进行优先排序并以系统的方式对修复进行优先排序很重要。

一旦确定了漏洞,公司就可以使用漏洞评估来确定对此负责的组件,并确定哪些组件需要更新或配置更改。

漏洞是由不良的输入验证和过滤引起的。如果攻击者发现敏感输入,他们可以运行任意命令,包括JavaScript、SQL查询或SMTP参数。他们甚至可以远程控制服务器并访问底层应用程序数据。

6、记录安全编码实践

安全编码实践是网络安全的关键部分。他们要求开发工程师负责保护他们的代码免受恶意攻击和威胁代理。开发工程师应遵循几种不同的做法。以下只是几个例子。

无论你的平台、语言或实现如何,你都应该遵循安全编码实践。

通常,安全编码实践侧重于编写没有已知漏洞的代码,这些漏洞可能会暴露数据或对系统造成损害。当应用程序不安全时,黑客攻击者可以访问它们并使用它们包含的信息来渗透系统。

此外,不安全的应用程序会对公司的声誉产生负面影响。安全编码实践旨在检测和消除软件应用程序中的这些漏洞,最大限度地减少数据破坏的可能性并允许安全地使用应用程序。

开发工程师必须理解这些问题并适当地记录它们。大多数漏洞是由典型的编程错误引起的。

通过收集常见的编程错误和安全编码实践,开发工程师可以创建测试用例以确保他们的代码遵循这些规则。

此外,开发工程师可以使用代码签名过程来保护他们的软件代码免遭篡改。使用测试用例和实现日志记录,开发工程师可以帮助调试错误。

每个开发工程师都应该理解的记录安全编码实践应该包括指南和最佳实践。理想情况下,文档应包含示例和易于实现的语言。它还应包括有关手动测试和合规性测试的指南。

原文链接:https://hackernoon.com/secure-coding-practices-every-developer-should-know

译者介绍

张增斌,51CTO社区编辑,多年的安全攻防从业经验,主要研究方向:安全开发、逆向破解、漏洞挖掘、黑灰产攻防对抗。​

有关每位开发人员都应该知道的安全编码实践的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  3. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.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.\"\

  4. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  5. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  6. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  7. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  8. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  9. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  10. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩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

随机推荐