当前位置: 首页 > 科技观察

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

时间:2023-03-20 22:45:19 科技观察

【.com快译】众所周知,软件安全正受到前所未有的重视。许多企业将安全性嵌入到其应用程序的开发阶段。这既促进了整体安全合规性,又在软件的不同级别创建了多个安全检查点。本文将如下图所示,通过各个方面,以实例的形式向大家展示各种安全代码实践。虽然主要示例是Java,但它们也可以应用于任何其他编程语言。1、转义/转义输入(EscapetheInput)所谓转义攻击,就是攻击者将执行的命令/查询,伪装嵌入到普通的文本输入中,使其能够通过欺骗执行引擎进行攻击应用程序。提供者具有各种信息和控制权。可以看出,为了避免此类攻击,我们需要对用户的输入进行转义,将其解释为文本,而不是一些命令。同样,我们也需要对数据库中存储的数据进行转义。试想一下,如果用户在其回复的文本输入中包含JavaScript,那么他就可以尝试从浏览器中窃取cookie。例如,当帖子的内容显示在其他用户的浏览器屏幕上时,一旦我们的程序代码没有逃脱帖子中包含的恶意代码。然后将执行JavaScript代码并为攻击者提取所有必需的信息和控制权。下面是有潜在风险的数据库查询代码,以及对应的带有逃生措施的Java代码。示例:包含潜在风险的Java代码createStatement(...);ResultSetresults=statement.executeQuery(query);}安全Java编解码器"))+"'anduser_password='"+ESAPI.encoder().encodeForSQL(ORACLE_CODEC,req.getParameter("pwd"))+"'";2.避免使用ID作为序列号在某些情况下,攻击者会试图获取比现有限制更多的信息。例如,某个API的用户只能查看ID号为1-100的用户信息。而如果系统采用按ID顺序递增的编号方式,那么我们可以预测下一个用户的序号为101。这样一来,攻击者就可以利用这个逻辑漏洞获取超出其权限的信息。示例:包含潜在风险的Java代码得到长(1);安全的Java代码//ThisexampleisforOracleStringsqlIdentifier="selectTESTING_SEQ.NEXTVALfromdual";PreparedStatementpst=conn.prepareStatement(sqlIdentifier);synchronized(this){ResultSetrs=pst.executeQuery();if(rs.next())longmyId=rs.getLong(1)+UUID.random();3.使用最小化方法为了减少攻击面,系统应该采用最小空间使用策略。从本质上讲,这意味着系统可以避免各种权限的暴露。例如,根据某种业务需求,系统需要使用代码“HTTP200”来响应所请求资源的存在。但是如果我们为RESTAPI提供get操作,那么它会增加攻击者的攻击面。相反,系统应该只通过HTTP协议的head方法提供现有资源的信息,而不提供更多无关信息。示例:包含有潜在风险的Java代码//Getisallowedwhereweneedtojustcheckuserexisthttp://localhost:8080/User/id/1安全的Java代码http://localhost:8080/User/id/1Head4。最小权限原则让我们想象一个场景:通常,客户服务部门用户的正常访问权限是一个可以访问订单数据的API。但是为了简单起见或者出于某种原因,系统给他分配了超级管理员的角色。那么一旦他的系统被黑或者他的账号被破坏,攻击者就可以利用他的超级管理员权限对系统发起一系列的攻击操作。可见,为了减少攻击面,我们应该只根据实际需要和建立的角色授予目标API相应的最小访问权限,而不应该设置所谓的可以访问所有内容的超级用户角色在系统中。5.尽量使用HTTPS或者双向SSL。永远不要以最原始的HTTP方式发布您的网站或节点。毕竟,现在大多数浏览器都会对纯HTTP站点显示警告。而且,业界建议对集成端点使用双向(2-Way)SSL,并通过HTTPS对网站或站点实施端到端加密。但是,由于HTTPS只能保护通信通道免受攻击,当通道密钥泄露时,它不能保护数据。因此,业界建议使用强加密算法对各种数据记录进行加密,然后再通过可信网络传输。6.不要使用不安全或弱的加密算法。在计算机计算能力不断迭代和提升的今天,弱密钥已经无法阻止那些暴力破解。一些知名组织甚至将以下不安全或弱的加密算法列入所谓的“黑名单”。因此,您应该尽量避免在日常安全编程中使用它们。SHA-11024位RSA或DSA160位ECDSA(椭圆曲线)80/112位2TDEA(双密钥三重DES)与其他各种旧算法一样,MD5从来都不是政府可接受的算法。7.白名单动态执行的代码如果你有一些代码是从API或APP的用户端传入的,或者是用户输入后生成的,为了让它们部分流程被执行,你需要有系统将那些挂起的命令列入白名单。例如,如果系统需要通告服务以列出服务器上的相应目录,那么我们需要将用户输入的ls或dir等命令和转义标志列入白名单。小结综上所述,我们从加密、编码、白名单、最小权限、逃避不受信任的用户输入等方面列出了日常软件开发过程中安全编码的七个实际例子。我们希望它们可以帮助您显着减少软件面临的各种安全威胁,并改善您自己的代码级安全状况。原标题:7PracticalSecureCodingPractices,作者:AwkashAgrawal