站长网 资讯 开发过程中安全代码的实例项目分析

开发过程中安全代码的实例项目分析

1.转义/逃逸输入(Escape the Input) 所谓转义攻击是指攻击者将执行命令/查询,伪装并嵌入到普通的文字输入中,通过欺骗应用程序的执行引擎,而让其能够向攻击者提供各种信息与控制权。可见,为避免此类攻击的发生,我们需要对用户的输入进行转义,将其解释

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

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

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

示例:

包含潜在风险的Java代码

String query = "SELECT user_id FROM user_data WHERE user_name = '" 

              + req.getParameter("userID") 

              + "' and user_password = '" + req.getParameter("pwd") +"'"; 

try { 

    Statement statement = connection.createStatement( … ); 

    ResultSet results = statement.executeQuery( query ); 

安全的Java代码

Codec ORACLE_CODEC = new OracleCodec(); 

String query = "SELECT user_id FROM user_data WHERE user_name = '" 

+ ESAPI.encoder().encodeForSQL( ORACLE_CODEC, req.getParameter("userID")) 

+ "' and user_password = '" 

+ ESAPI.encoder().encodeForSQL( ORACLE_CODEC, req.getParameter("pwd")) +"'"; 

2.避免将ID作为序列号

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

示例:

包含潜在风险的Java代码

String sqlIdentifier = "select TESTING_SEQ.NEXTVAL from dual"; 

PreparedStatement pst = conn.prepareStatement(sqlIdentifier); 

synchronized( this ) { 

   ResultSet rs = pst.executeQuery(); 

   if(rs.next()) 

     long myId = rs.getLong(1); 

安全的Java代码

// This example is for Oracle 

String sqlIdentifier = "select TESTING_SEQ.NEXTVAL from dual"; 

PreparedStatement pst = conn.prepareStatement(sqlIdentifier); 

synchronized( this ) { 

   ResultSet rs = pst.executeQuery(); 

   if(rs.next()) 

     long myId = rs.getLong(1) + UUID.random(); 

3.运用极简主义方法

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

示例:

包含潜在风险的Java代码

//Get is allowed where we need to just check user exist 

:8080/User/id/1 

安全的Java代码

:8080/User/id/1 

本文来自网络,不代表站长网立场,转载请注明出处:https://www.tzzz.com.cn/html/biancheng/zx/2021/0526/6868.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部