[JAVA] SQL Query문 : Prepared Statement

2023. 11. 5. 18:29Β· π™ΉπšŠπšŸπšŠ
λͺ©μ°¨
  1. κ²°λ‘  
  2. Prepared Statement 
  3. ❓ μ–΄λ–»κ²Œ 해킹을 ν•˜λŠ”κ±ΈκΉŒβ“
  4. μ‘μš© 
λ°˜μ‘ν˜•

κ²°λ‘  

 

query문을 넣을 λ•ŒλŠ” 

String query = "select * from user2 where name like '" + userName + "'";

μ΄λ ‡κ²Œ λ„£μ§€ 말고 

String query = "select * from user2 where name like ?";

μ΄λ ‡κ²Œ λ„£μž 

 

β“μ™œβ“ β†’ λ³΄μ•ˆμ΄ μ·¨μ•½ν•΄μ§€κΈ° λ•Œλ¬Έμ΄λ‹€. 

 

 

 

 

 

 

 

 

 

 

Prepared Statement 

   public User getUser(String userName, String userPassword) {

        Connection connection = getConnection();
        String query = "select * from user2 where name like '" + userName + "'";

        User user = new User();
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            pstmt = connection.prepareStatement(query);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                String password = rs.getString(4);

                if (userPassword.equals(password)) {
                    System.out.println("λΉ„λ°€λ²ˆν˜Έ 일치 " + password);
                    user.setId(rs.getInt(1));
                    user.setName(rs.getString(2));
                    user.setFullName(rs.getString(3));
                    user.setPassword(rs.getString(4));
                    user.setEmail(rs.getString(5));
                    user.setAge(rs.getInt(6));
                    user.setCreateDate(rs.getTimestamp(7));
                }
            } else {
                user = null;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return user;
    }

μœ„κ°€ λ‚˜μ˜ 전체적인 μ½”λ“œμ΄λ‹€.

 

 

 

 

 

 

 

λ¬Έμ œκ°€ λ˜λŠ” λ°‘ μ½”λ“œλ₯Ό 보자. 

String query = "select * from user2 where name like '" + userName + "'";

userName으둜 μ‘°νšŒν•˜λŠ” 쿼리문이닀. 

userName에 "λ‚˜ '이 λ“€μ–΄κ°„λ‹€λ©΄ 였λ₯˜κ°€ λ‚  μˆ˜λ„ 있고, ν•΄ν‚Ή λ‹Ήν•  μˆ˜λ„ μžˆλ‹€.

(μ½”λ“œ 리뷰λ₯Ό ν•΄μ£Όμ…¨λŠ”λ°, 이 λΆ€λΆ„μ—μ„œ λ³΄μ•ˆ 취약성이 μžˆλ‹€λ©΄μ„œ μ•Œλ €μ£Όμ…¨λ‹€.)

 

 

 

 

 

❓ μ–΄λ–»κ²Œ 해킹을 ν•˜λŠ”κ±ΈκΉŒβ“

κ³΅κ²©μžκ°€ μ‚¬μš©μž μž…λ ₯ 데이터λ₯Ό μ‘°μž‘ν•˜μ—¬ μ›ν•˜μ§€ μ•ŠλŠ” 쿼리λ₯Ό μ‹€ν–‰ν•˜κ±°λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ— μ•…μ˜μ μΈ λͺ…령을 μ‚½μž…ν•  수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄, userName λ³€μˆ˜μ— '' OR '1'='1' 와 같은 값을 μž…λ ₯ν•˜λ©΄ SQL μΈμ μ…˜ 곡격을 μˆ˜ν–‰ν•  수 μžˆλ‹€. 

' OR '1'='1'λŠ” ν•˜λ‚˜μ˜ μ°Έ 쑰건을 λ‚˜νƒ€λ‚΄κΈ° λ•Œλ¬Έμ—, λͺ¨λ“  λ ˆμ½”λ“œκ°€ λ°˜ν™˜λ  수 μžˆλ‹€.

κ·Έλž˜μ„œ κ³΅κ²©μžλŠ” 이 방식을 μ‚¬μš©ν•΄μ„œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‘°μž‘ν•˜κ±°λ‚˜ λ―Όκ°ν•œ 정보에 μ•‘μ„ΈμŠ€ν•˜λ €κ³  μ‹œλ„ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

κ·Έλž˜μ„œ SQL μΈμ μ…˜ 곡격을 λ°©μ§€ν•˜λ €λ©΄ μ‚¬μš©μž μž…λ ₯ 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•˜κ³ , SQL 쿼리λ₯Ό ꡬ성할 λ•ŒλŠ” Prepared Statements λ˜λŠ” ORMκ³Ό 같은 μ•ˆμ „ν•œ 방법을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 

 

 

 

 

 

 

 

 

 

κ·Έλž˜μ„œ SQL 쿼리λ₯Ό 미리 μ»΄νŒŒμΌν•˜κ³ , μ‹€ν–‰μ‹œμ— λ§€κ°œλ³€μˆ˜ 값을 λ°”μΈλ”©ν•œλ‹€.

μ‚¬μš©μž μž…λ ₯을 μžλ™μœΌλ‘œ μ΄μŠ€μΌ€μ΄ν”„ν•˜κ³  SQL μ‚½μž…μ„ λ°©μ§€ν•œλ‹€.

 

 

κ·Έλž˜μ„œ λ°‘μ²˜λŸΌ λ°”κΏ¨λ‹€. 

 

    public User getUser(String userName, String userPassword) {

        Connection connection = getConnection();
        String query = "select * from user2 where name like ?";

        User user = new User();
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            pstmt = connection.prepareStatement(query);
            pstmt.setString(1, userName);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                String password = rs.getString(4);

                if (userPassword.equals(password)) {
                    System.out.println("λΉ„λ°€λ²ˆν˜Έ 일치 " + password);
                    user.setId(rs.getInt(1));
                    user.setName(rs.getString(2));
                    user.setFullName(rs.getString(3));
                    user.setPassword(rs.getString(4));
                    user.setEmail(rs.getString(5));
                    user.setAge(rs.getInt(6));
                    user.setCreateDate(rs.getTimestamp(7));
                }
            } else {
                user = null;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return user;
    }

 

 

 

String query = "select * from user2 where name like ?";
// λ°”κΎΌ λΆ€λΆ„

pstmt.setString(1, userName);
// μΆ”κ°€ν•œ λΆ€λΆ„

μ΄λ ‡κ²Œ λ°”κΎΈλ©΄μ„œ λ³΄μ•ˆμ„±μ„ 보쑴할 수 μžˆμ—ˆλ‹€. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

μ‘μš© 

 

%제λͺ©%으둜 κ²€μƒ‰ν•˜κΈ°. 

%κ°€ λ“€μ–΄κ°„ 제λͺ©μœΌλ‘œ 검색을 ν•˜κ³  싢을 μˆ˜λ„ μžˆλ‹€. 이럴 λ•ŒλŠ” %λ₯Ό \\%둜 λ°”κΏ”μ„œ 검색할 수 μžˆλ‹€.

 

 

 

쿼리문 : String subjectλ₯Ό 인자둜 λ°›λŠ”λ‹€. 

      if (subject == null) {
            query = "SELECT a.id, a.subject, a.content, a.createDate, b.id AS creatorId, b.name AS creatorName, b.fullName AS creatorFullName "
                            + " FROM boardpost a, user2 b " + " WHERE a.creatorId = b.id ";
        } else {
            query = "SELECT a.id, a.subject, a.content, a.createDate, b.id AS creatorId, b.name AS creatorName, b.fullName AS creatorFullName "
                            + " FROM boardpost a, user2 b " + " WHERE a.subject like ? and a.creatorId = b.id ";
            escapedSubject = (subject.contains("%")? subject.replace("%", "\\%"): subject);
        }

λ§Œμ•½ μ‚¬μš©μžκ°€ μž…λ ₯ν•œ λ¬Έμžμ—΄μ— %κ°€ λ“€μ–΄μžˆλ‹€λ©΄ //%둜 λŒ€μ²΄ν•΄μ£ΌκΈ°

 

 

 

 

 

  pstmt.setString(1, "%" + escapedSubject + "%");

그리고 μ•žλ’€λ‘œ %λ₯Ό λ„£μ–΄μ€˜μ„œ 포함 검색이 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€μ–΄μ£ΌκΈ° 

 

μ΄λ ‡κ²Œ ν•΄μ„œ λ³΄μ•ˆμ˜ 취약성이 μ‚¬λΌμ‘Œλ‹€.

 

 

 

전체 λ©”μ†Œλ“œ

  public List<BoardPost> getAllBoardPosts(String subject) {
        List<BoardPost> boardPosts = new ArrayList<BoardPost>();
        String query = "";
        String escapedSubject = "";

        // subject에 값이 μžˆλ‹€λ©΄ κ²°κ³Όκ°’ 보여주기 / μ•„λ‹ˆλΌλ©΄ 전체 λͺ©λ‘ 보여주기
        if (subject == null) {
            query = "SELECT a.id, a.subject, a.content, a.createDate, b.id AS creatorId, b.name AS creatorName, b.fullName AS creatorFullName "
                            + " FROM boardpost a, user2 b " + " WHERE a.creatorId = b.id ";
        } else {
            query = "SELECT a.id, a.subject, a.content, a.createDate, b.id AS creatorId, b.name AS creatorName, b.fullName AS creatorFullName "
                            + " FROM boardpost a, user2 b " + " WHERE a.subject like ? and a.creatorId = b.id ";
            escapedSubject = (subject.contains("%")? subject.replace("%", "\\%"): subject);
        }

        Connection connection = null;
        PreparedStatement pstmt = null;
        ResultSet resultSet = null;

        try {
            connection = getConnection();
            pstmt = connection.prepareStatement(query);
            if(subject != null) {                
                pstmt.setString(1, "%" + escapedSubject + "%");
            }
            resultSet = pstmt.executeQuery();
            while (resultSet.next()) {
                User creator = new User();
                long id = resultSet.getLong(1);
                String postSubject = resultSet.getString(2);
                String content = resultSet.getString(3);
                Timestamp dateString = resultSet.getTimestamp(4);

                creator.setId(resultSet.getLong(5));
                creator.setName(resultSet.getString(6));
                creator.setFullName(resultSet.getString(7));


                boardPosts.add(new BoardPost(id, postSubject, content, creator, dateString));

            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (connection != null)
                    connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (pstmt != null)
                    pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (resultSet != null)
                    resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return boardPosts;
    }

 

 

 

λ°˜μ‘ν˜•

'π™ΉπšŠπšŸπšŠ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] 10μ§„μˆ˜ ↔ 2, 8, 16μ§„μˆ˜ λ³€ν™˜  (0) 2023.11.19
[Java] "."을 κΈ°μ€€μœΌλ‘œ splitν•  λ•ŒλŠ” \\을 μ¨μ€˜μ•Ό ν•œλ‹€ / split(".")  (0) 2023.11.11
[JAVA] ArrayList removeIf / iterator.remove() / 리슀트 μš”μ†Œ μ‚­μ œν•˜κΈ°  (0) 2023.11.02
JUnit Test Case μž‘μ„±μ‹œ μœ μ˜ν•  점 : fail()  (0) 2023.10.30
[JAVA] java.lang.NumberFormatException  (0) 2023.10.29
  1. κ²°λ‘  
  2. Prepared Statement 
  3. ❓ μ–΄λ–»κ²Œ 해킹을 ν•˜λŠ”κ±ΈκΉŒβ“
  4. μ‘μš© 
'π™ΉπšŠπšŸπšŠ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Java] 10μ§„μˆ˜ ↔ 2, 8, 16μ§„μˆ˜ λ³€ν™˜
  • [Java] "."을 κΈ°μ€€μœΌλ‘œ splitν•  λ•ŒλŠ” \\을 μ¨μ€˜μ•Ό ν•œλ‹€ / split(".")
  • [JAVA] ArrayList removeIf / iterator.remove() / 리슀트 μš”μ†Œ μ‚­μ œν•˜κΈ°
  • JUnit Test Case μž‘μ„±μ‹œ μœ μ˜ν•  점 : fail()
ν•΄λ²„λ‹ˆ
ν•΄λ²„λ‹ˆ
κ°œλ°œν•˜λ©΄μ„œ 배운 것듀을 κΈ°λ‘ν•©λ‹ˆλ‹€.
ν•΄λ²„λ‹ˆ
DevNight
ν•΄λ²„λ‹ˆ
전체
였늘
μ–΄μ œ
  • 전체보기 (195)
    • πšπšŽπšπš›πš˜πšœπš™πšŽπšŒπšπš’πšŸπšŽπšœ (5)
      • πšƒπš’πš™πšœ (2)
      • 회고 (3)
      • μ‹€μˆ˜ λͺ¨μŒμ§‘ (0)
    • π™Ώπš›πš˜πš“πšŽπšŒπš (3)
      • π™Ίπ™Ύπš‚πšƒπ™° πš†πšŽπš‹ π™Ώπš›πš˜πš“πšŽπšŒπš (2)
    • π™Ώπš›πš˜πšπš›πšŠπš–πš–πš’πš—πš π™»πšŠπš—πšπšžπšŠπšπšŽ (16)
      • π™·πšƒπ™Όπ™» (6)
      • π™²πš‚πš‚ (1)
      • π™Ήπ™°πš…π™° (1)
      • π™ΉπšŠπšŸπšŠπš‚πšŒπš›πš’πš™πš (7)
      • πšƒπš’πš™πšŽπš‚πšŒπš›πš’πš™πš (1)
    • π™±πšŠπšŒπš”πšŽπš—πš (1)
      • πš‚πš™πš›πš’πš—πš π™±πš˜πš˜πš (0)
      • Spring (2)
      • 파일 처리 (1)
      • π™Ήπš‚π™Ώ (1)
    • π™΅πš›πš˜πš—πšπšŽπš—πš (5)
      • 𝚁𝚎𝚊𝚌𝚝 (3)
      • πš…πšžπšŽ.πš“πšœ (2)
    • π™°πš•πšπš˜πš›πš’πšπš‘πš– (32)
      • π™Ώπš›πš˜πšπš›πšŠπš–πš–πšŽπš›πšœ (6)
      • π™±πšŠπšŽπš”πš“πš˜πš˜πš— (24)
    • π™³π™°πšƒπ™°π™±π™°πš‚π™΄ (16)
      • πš‚πš€π™» (1)
      • π™Ώπš˜πšœπšπšπš›πšŽπš‚πš€π™» (1)
      • π™Όπš’πš‚πš€π™» (3)
      • π™Ύπš›πšŠπšŒπš•πšŽ (0)
      • π™Ώπš›πš˜πšπš›πšŠπš–πš–πšŽπš›πšœ (1)
    • π™³πšŽπšŸπšŽπš•πš˜πš™πš–πšŽπš—πš πšƒπš˜πš˜πš•πšœ (4)
      • π™Έπš—πšπšŽπš•πš•πš’π™Ή (0)
      • π™΄πšŒπš•πš’πš™πšœπšŽ (1)
      • πš…πš‚π™²πš˜πšπšŽ (0)
      • π™±πšžπš’πš•πš πš‚πšŒπš›πš’πš™πšπšœ (1)
    • πš…πšŽπš›πšœπš’πš˜πš— π™²πš˜πš—πšπš›πš˜πš• (0)
      • π™Άπš’πš (0)
      • π™Άπš’πšπ™·πšžπš‹ (0)
      • πš‚πš…π™½ (0)
    • 배포 및 인프라 (2)
      • π™°πš†πš‚ (2)
    • π™Έπšƒ (15)
      • πš‚πš…π™½ (3)
    • π™ΉπšŠπšŸπšœπš‚πšŒπš›πš’πš™πš (4)
      • πš…πšžπšŽ.πš“πšœ (0)
    • πš†πšŽπš‹ (9)
      • 𝚊𝚠𝚜 (0)
      • π™·πšƒπ™Όπ™» (0)
      • π™²πš‚πš‚ (2)
    • π™ΉπšŠπšŸπšŠ (56)
      • πš‚πš™πš›πš’πš—πš π™±πš˜πš˜πš (3)
    • π™Άπš’πšπ™·πšžπš‹ (10)
    • ν™˜κ²½μ„€μ • (10)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ
  • λ°©λͺ…둝

곡지사항

인기 κΈ€

νƒœκ·Έ

  • web
  • λ°°μ—΄
  • μ½”λ”©ν…ŒμŠ€νŠΈ
  • λ°±μ€€
  • React
  • μžλ°”μ˜μ •μ„
  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
  • spring
  • PostgreSQL
  • Java
  • ν‹°μŠ€ν† λ¦¬μ±Œλ¦°μ§€
  • μžλ°”
  • php
  • JavaScript
  • μžλ°”μŠ€ν¬λ¦½νŠΈ
  • 이클립슀
  • html
  • μ˜€λΈ”μ™„
  • database
  • μ•Œκ³ λ¦¬μ¦˜

졜근 λŒ“κΈ€

졜근 κΈ€

hELLO Β· Designed By μ •μƒμš°.v4.3.0
ν•΄λ²„λ‹ˆ
[JAVA] SQL Query문 : Prepared Statement
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”

단좕킀

λ‚΄ λΈ”λ‘œκ·Έ

λ‚΄ λΈ”λ‘œκ·Έ - κ΄€λ¦¬μž ν™ˆ μ „ν™˜
Q
Q
μƒˆ κΈ€ μ“°κΈ°
W
W

λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€

κΈ€ μˆ˜μ • (κΆŒν•œ μžˆλŠ” 경우)
E
E
λŒ“κΈ€ μ˜μ—­μœΌλ‘œ 이동
C
C

λͺ¨λ“  μ˜μ—­

이 νŽ˜μ΄μ§€μ˜ URL 볡사
S
S
맨 μœ„λ‘œ 이동
T
T
ν‹°μŠ€ν† λ¦¬ ν™ˆ 이동
H
H
단좕킀 μ•ˆλ‚΄
Shift + /
⇧ + /

* λ‹¨μΆ•ν‚€λŠ” ν•œκΈ€/영문 λŒ€μ†Œλ¬Έμžλ‘œ 이용 κ°€λŠ₯ν•˜λ©°, ν‹°μŠ€ν† λ¦¬ κΈ°λ³Έ λ„λ©”μΈμ—μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.