/* ì·¨ì½ì ê°ì SQL Injection URL 매ê°ë³ìì ê°ì ì¬ì©ì ì ê³µ ë°ì´í°ë íì ì 뢰í ì ìê³ ì¤ì¼ë ê²ì¼ë¡ ê°ì£¼ëì´ì¼ í©ëë¤. ì¤ì¼ë ë°ì´í°ìì ì§ì SQL 쿼리를 구ì±íë©´ 공격ìê° ì¿¼ë¦¬ ìì²´ì ì´ê¸° ì미를 ë³ê²½íë í¹ìíê² ì¡°ìë ê°ì ì½ì í ì ììµëë¤. ì±ê³µì ì¸ ë°ì´í°ë² ì´ì¤ 쿼리 주ì 공격ì ë°ì´í°ë² ì´ì¤ìì 민ê°í ì 보를 ì½ê±°ë ìì íê±°ë ìì í ì ìì¼ë©° ëë¡ë ë°ì´í°ë² ì´ì¤ë¥¼ ì¢ ë£íê±°ë ììì ì´ì ì²´ì ëª ë ¹ì ì¤íí ìë ììµëë¤. ì¼ë°ì ì¼ë¡ ì루ì ì ì¤ë¹ë ëª ë ¹ë¬¸ì ì¬ì©íê³ setString, ì ê°ì ì ì© ë©ìë를 ì¬ì©íì¬ ë³ì를 SQL 쿼리 매ê°ë³ìì ë°ì¸ë©íì¬ ì¬ì©ìê° ì ê³µí ë°ì´í°ê° ì ì íê² ì´ì¤ì¼ì´íëëë¡ íë ê²ì ëë¤. ë ë¤ë¥¸ ì루ì ì 쿼리를 ìì±íë ë° ì¬ì©ëë 모ë 매ê°ë³ìì ì í¨ì±ì ê²ì¬íë ê²ì ëë¤. ì´ê²ì 문ìì´ ê°ì 기본 ì íì¼ë¡ ë³ííê±°ë íì©ë ê°ì íì´í¸ë¦¬ì¤í¸ì ëí´ ì í¨ì±ì ê²ì¬íì¬ ë¬ì±í ì ììµëë¤. ì´ ê·ì¹ì JDBC, Java EE Entity Manager, Spring Framework, Hibernate, JDO, Android ë°ì´í°ë² ì´ì¤, Apache Torque, Apache Turbine, MyBastis, Rapidoid를 ì§ìí©ëë¤. */ // Noncompliant Code Example public boolean authenticate(javax.servlet.http.HttpServletRequest request, java.sql.Connection connection) throws SQLException { String user = request.getParameter("user"); String pass = request.getParameter("pass"); String query = "SELECT * FROM users WHERE user = '" + user + "' AND pass = '" + pass + "'"; // Unsafe // If the special value "foo' OR 1=1 --" is passed as either the user or pass, authentication is bypassed // Indeed, if it is passed as a user, the query becomes: // SELECT * FROM users WHERE user = 'foo' OR 1=1 --' AND pass = '...' // As '--' is the comment till end of line syntax in SQL, this is equivalent to: // SELECT * FROM users WHERE user = 'foo' OR 1=1 // which is equivalent to: // SELECT * FROM users WHERE 1=1 // which is equivalent to: // SELECT * FROM users java.sql.Statement statement = connection.createStatement(); java.sql.ResultSet resultSet = statement.executeQuery(query); // Noncompliant return resultSet.next(); } // Compliant Solution public boolean authenticate(javax.servlet.http.HttpServletRequest request, java.sql.Connection connection) throws SQLException { String user = request.getParameter("user"); String pass = request.getParameter("pass"); // Safe even if authenticate() method is still vulnerable to brute-force attack in this specific case String query = "SELECT * FROM users WHERE user = ? AND pass = ?"; // PreparedStatement ë°©ìì¼ë¡ SQL 쿼리문ì ê³ ì í í, user/pass íë¼ë¯¸í°ì ê°ì setString íë©´ ë³ì¡°ë SQL ì¿¼ë¦¬ë¬¸ì´ ì¤íëì§ ìë 구조ì. java.sql.PreparedStatement statement = connection.prepareStatement(query); statement.setString(1, user); // Will be properly escaped statement.setString(2, pass); java.sql.ResultSet resultSet = statement.executeQuery(); return resultSet.next(); }