我的编程空间,编程开发者的网络收藏夹
学习永远不晚

软件开发过程中安全代码的七大实践

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

软件开发过程中安全代码的七大实践

【51CTO.com快译】众所周知,软件的安全性如今已得到了前所未有的重视程度。许多企业会将安全性嵌入到应用程序的开发阶段。这样既能有利于整体安全性的遵守,又可以在软件的不同层面上创建多个安全性检查点。本文将通过如下图所示的各种方面,以实例的形式,向您展示各种安全代码的实践。虽然主要是以Java为例,但是它们也可以被运用到任何其他编程语言上。

1.转义/逃逸输入(Escape the Input)

所谓转义攻击是指攻击者将执行命令/查询,伪装并嵌入到普通的文字输入中,通过欺骗应用程序的执行引擎,而让其能够向攻击者提供各种信息与控制权。可见,为避免此类攻击的发生,我们需要对用户的输入进行转义,将其解释为文字,而非某些命令。同理,我们也需要对存储在数据库中的数据进行转义。

试想,如果某用户在其回帖的文字输入中带有JavaScript,那么他就可以试图从浏览器中窃取到Cookie。例如,当该回帖的内容被呈现在其他用户的浏览器屏幕上时,一旦我们的程序代码不去转义帖子中的包含的恶意代码。那么该JavaScript代码将被执行,并为攻击者提取各种所需的信息与控制权。以下是带有潜在风险的数据库查询代码,和相应的采取了转义措施的Java代码。

示例:

包含潜在风险的Java代码

  1. String query = "SELECT user_id FROM user_data WHERE user_name = '" 
  2.               + req.getParameter("userID"
  3.               + "' and user_password = '" + req.getParameter("pwd") +"'"
  4. try { 
  5.     Statement statement = connection.createStatement( … ); 
  6.     ResultSet results = statement.executeQuery( query ); 

安全的Java代码

  1. Codec ORACLE_CODEC = new OracleCodec(); 
  2. String query = "SELECT user_id FROM user_data WHERE user_name = '" 
  3. + ESAPI.encoder().encodeForSQL( ORACLE_CODEC, req.getParameter("userID")) 
  4. "' and user_password = '" 
  5. + ESAPI.encoder().encodeForSQL( ORACLE_CODEC, req.getParameter("pwd")) +"'"

2.避免将ID作为序列号

在某些情况下,攻击者会设法超过现有的限制,以获取更多的信息。例如,某个API的用户只被允许查看ID号为1-100的用户信息。而如果该系统采用的是以ID为顺序的递增编号方式,那么我们就可以预测到下一个用户的序列号将是101。由此,攻击者便可以利用这一逻辑上的漏洞,来获取在其权限之外的信息。

示例:

包含潜在风险的Java代码

  1. String sqlIdentifier = "select TESTING_SEQ.NEXTVAL from dual"
  2. PreparedStatement pst = conn.prepareStatement(sqlIdentifier); 
  3. synchronized( this ) { 
  4.    ResultSet rs = pst.executeQuery(); 
  5.    if(rs.next()) 
  6.      long myId = rs.getLong(1); 

安全的Java代码

  1. // This example is for Oracle 
  2. String sqlIdentifier = "select TESTING_SEQ.NEXTVAL from dual"
  3. PreparedStatement pst = conn.prepareStatement(sqlIdentifier); 
  4. synchronized( this ) { 
  5.    ResultSet rs = pst.executeQuery(); 
  6.    if(rs.next()) 
  7.      long myId = rs.getLong(1) + UUID.random(); 

3.运用极简主义方法

为了减少攻击面,系统应采用最小的空间使用策略。从本质上说,这就意味着系统能够很好地避免各种权限的暴露。例如,根据某项业务需求,系统需要使用代码“HTTP 200”,来响应存在着被请求的资源。但是如果我们为REST API提供了get操作,那么就会增加攻击者的攻击面。相反,该系统应该只通过HTTP协议的head方法,来提供有关现有资源的信息,而不必提供更多的无关信息。

示例:

包含潜在风险的Java代码

  1. //Get is allowed where we need to just check user exist 
  2. http://localhost:8080/User/id/1 

安全的Java代码

  1. http://localhost:8080/User/id/1 
  2. Head 

4.最小特权原则

让我们试想一个场景:通常,客服部门某个用户的常规访问权限是可以访问订单数据的API。但是为了简便起见或是某种原因,系统为其分配了超级管理员的角色。那么一旦他所处的系统被黑或遭到了帐号破坏,攻击者就可以利用他的超级管理员权限,来对该系统发起一系列的攻击操作。可见,为了减少攻击面,我们应当仅根据实际需求,以及既定的角色,来授予目标API相应的最小访问权限,不应该在系统中设置所谓可以访问所有内容的超级用户角色。

5.尽可能使用H​​TTPS或双向SSL

切勿以最原始的HTTP方式发布您的网站或是节点。毕竟如今大多数浏览器都会对那些单纯的HTTP站点显示警告。而且,业界建议针对集成的端点采用双向(2-Way)SSL方式,而对网站或站点通过HTTPS的方式,实现端到端加密。

不过,由于HTTPS只能保护了通信信道免受攻击,却无法在通道的密钥发生泄露时,保护数据。因此,业界建议使用强大的加密算法,对各种数据记录先进行加密,再通过可信的网络予以传输。

6.不要使用不安全的或弱的加密算法

如今,随着计算机算力的不断迭代与提高,弱的密钥已不再能够防止那些暴力破解的攻击手段。一些知名组织甚至将如下不安全的、或弱的加密算法,列入了所谓的“黑名单”。因此您在日常进行安全编程时,应当尽量避免使用到它们。

  • SHA-1
  • 1024位RSA或DSA
  • 160位ECDSA(椭圆曲线)
  • 80/112位2TDEA(双密钥三重DES)
  • 与其他各种旧算法类似,MD5从来都不是政府可以接受的算法。

7.将动态可执行代码(Dynamically Executed Code)列入白名单

如果您有一些代码是从API或APP的用户侧传入的,或者是在用户输入之后才生成的,那么为了让它们能够作为整体流程的一部分被执行,您需要让系统将这些待执行的命令列入白名单。例如,如果系统需要公布某项服务,以列出服务器上的对应目录,那么我们就需要将ls或dir之类的命令列入白名单,并转义用户输入的标志。

小结

综上所述,我们从加密、编码、白名单、最小特权、以及转义不可信的用户输入等方面,为您罗列了日常软件开发过程中的七种安全编码的实践示例。希望它们能够协助您大幅减少软件所面临的各种安全威胁,并提高自身的代码级安全态势。

原文7 Practical Secure Coding Practices,作者:Awkash Agrawal

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软件开发过程中安全代码的七大实践

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

软件开发过程中安全代码的七大实践

本文从加密、编码、白名单、最小特权、以及转义不可信的用户输入等方面,为您罗列了日常软件开发过程中的七种安全编码的实践示例。

软件开发安全应用实践中的十个误区

显然SCA系统只解决软件供应链环节中一个环节问题,就是在上线前检测软件包含的开源软件组件,并根据组件信息分析漏洞和许可协议风险。对比软件供应链的主要威胁:恶意篡改、假冒伪劣、供应中断、信息泄露、违规操作以及其他威胁等,能解决的问题实在有限。

定制软件开发中的六大优秀安全策略

数据安全在定制软件开发的过程中是至关重要的。本文将向您介绍6种安全策略,以便企业能够更好地保护数据及其应用程序本身,从而赢得用户的信任。

实现开源软件安全,开发人员需要考量的三大关键因素

当开发人员穿行于开源软件的动态环境中时,有一条基本原则至关重要 —— 安全必须渗透到软件供应链的方方面面。在软件开发生命周期的各个环节落实安全措施,就好比加固数字堡垒的城墙,防止入侵和漏洞。
JFrog2024-11-29

生成式人工智能在软件开发过程现代化中的作用

集成人工智能的独特功能可以在软件开发生命周期(SDLC)的每个阶段为开发人员提供帮助,从业务需求分析和创建敏捷的用户故事到软件设计、编码、测试、部署、监控和维护。这是组织可以使用生成式人工智能进行优化的地方。

中科院软件所在 Python 程序的构建依赖分析方面取得进展:帮助开发人员提高代码复用效率

近日,中国科学院软件研究所软件工程技术研究开发中心在 Python 程序构建中的依赖分析推断方面取得研究进展,提出知识驱动的 Python 程序依赖推断方法及工具, 帮助开发人员提高代码复用效率。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录