开发过程中安全代码的实例项目分析
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 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |