加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2021-05-27 22:27:47 所属栏目:编程 来源:互联网
导读: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 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读