2020. 12. 31. 21:05ใ๐๐ปโ๏ธ Study/โ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ( Database )
์ด๋ฒ ํฌ์คํ ์์๋ ์ ๋ฒ ๊ธ์ ์ด์ด PreparedStatement ์ค์ต์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Docker์ MySQL์ ์ด์ฉํ JDBC ๊ธฐ๋ณธ ์ค์ต ๊ณผ์ ์ ์๋ ๊ธ์์ ์ค๋ช ํ์ฌ ์๋ตํ์์ต๋๋ค.
JDBC ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ๊ณผ Statement ์ค์ต์ ๋ํด ๊ถ๊ธํ์๋ค๋ฉด ์๋๊ธ์ ๋จผ์ ์ฝ๊ณ ์ค์๋ฉด ๋์์ด ๋ฉ๋๋ค : )
Statement ์ PreparedStatement ์ฐจ์ด์
SQL์ ์ธํฐํ๋ฆฌํฐ ๊ตฌ์กฐ๋ก, ๋งค ๋ผ์ธ์ ํ์ฑ์ ๊ฑฐ์ณ ์คํํ๋ ๋ฐ ๋์ผํ SQL์ ์ฌ๋ฌ ๋ฒ ์คํํ ๋ Statement์ ์ฌ์ฉํ๋ฉด ๋ถํ์ํ๊ฒ ์ฌ๋ฌ๋ฒ ํ์ฑํ ํ ์ฒ๋ฆฌํ๊ฒ ๋๊ณ , SQL Injection์ ์ทจ์ฝํ๋ค.
ํ์ง๋ง PreparedStatement๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฏธ๋ฆฌ SQL๋ฌธ์ DBMS์์ ์ฒ๋ฆฌํ๊ฒ ๋์ด ( Pre-compiled SQL ) Statement์ SQL Injection ๋ฌธ์ ๋ฅผ ์๋ฐฉ ํ ์ ์๋ค.
Statement๋ Dynamic SQL / PreparedStatement๋ Static SQL ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค : )
Prepared Statement๋ ๋ฏธ๋ฆฌ ํ์ฑํ์ฌ Pre - Compile ํด๋๊ณ ํธ์ถ๋ง ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ค๋ ํํ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
SQL Injection์ด๋?
SELECT * FROM Users WHERE id = ' ' OR 1=1; ๊ณผ ๊ฐ์ด where์ ๊ฐ์ 'OR 1 = 1' ์ ์ ๋ ฅํ์ฌ ๋ชจ๋ where ์ ์ ์ฐธ์ผ๋ก ๋ง๋๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
Prepared Statement๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ด์ค์ผ์ดํ์ฒ๋ฆฌ(ํน์ ๋ฌธ์ ๊ฐ์ ๋ค๋ฅธ ๋ฌธ์๋ก ๋ณํํ๋ ๊ฒ)๋ฅผ ํ์ฌ SQL Injection์ ์๋ฐฉํ ์ ์์ต๋๋ค !
JDBC ๋๋ผ์ด๋ฒ ์ค์น ๋ฐ Tomcat8 ์ค์น๋ ์ด์ ๊ธ์์ ์์ธํ ๋ค๋ค์ผ๋ฏ๋ก ์๋ตํ๊ฒ ์ต๋๋ค.
๐ JDBC PreparedStatement jsp ํ์ผ ๋ง๋ค๊ธฐ
๋จผ์ ๋ฏธ๋ฆฌ ์์ฑํ ubuntu๋ฅผ ์คํํด์ค๋ค.
docker exec -it ubuntu_new1 bash
tomcat์ ํ์ผ๋ก ์ด๋ํ๋ค, prestatement.jsp ํ์ผ์ ๋ง๋ค์ด์ฃผ์ธ์.
cd /var/lib/tomcat8/webapps/ROOT
nano prestatement.jsp
๐ PreparedStatement.jsp ์์ฑํ๊ธฐ
๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ํ์ธํ ์ ์๊ฒ Statement๋ฌธ๋ ๋ง๋ค์ด ์ถ๋ ฅํด์ฃผ์๋ค.
<%@ page import = "java.sql.*" %>
<% PreparedStatement pstmt = null; ResultSet rs = null; Statement stmt = null;
Class.forName("com.mysql.jdbc.Driver");
String dbUrl = "jdbc:mysql://172.17.0.2:3306/employees";
Connection conn = DriverManager.getConnection(dbUrl,"root","yunas");
String SQL = "insert into employees (emp_no,birth_date,first_name,last_name,gender,hire_date) values (?,?,?,?,?,?);";
try {
pstmt= conn.prepareStatement(SQL);
pstmt.setInt(1,10000);
pstmt.setString(2,"2020-12-31");
pstmt.setString(3,"kim");
pstmt.setString(4,"yuna");
pstmt.setString(5,"F");
pstmt.setString(6,"2021-01-01");
pstmt.executeUpdate();
out.println("recored Insert!");
stmt = conn.createStatement();
if (stmt.execute("select * from employees where emp_no = 10000;")) {
rs = stmt.getResultSet();
}
while(rs.next()) {
out.println("emp_no : "+rs.getInt("emp_no"));
out.println("birthdate : " + rs.getDate("birth_date"));
out.println("name : " + rs.getString("first_name") + " " + rs.getString("last_name"));
out.println("gender : " + rs.getString("gender"));
out.println("hiredate : " + rs.getDate("hire_date"));
}
rs.close(); pstmt.close(); stmt.close();
} catch(Exception e) {
out.println("PreparedStatement Error!"+e);
}
conn.close();%>
Statement๊ณผ ๋ค๋ฅด๊ฒ PreparedStatement๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ,
SQL๋ฌธ์ฅ์ ์คํํ ๋ pstmt.executeQuery() (select) / pstmt.executeUpdate() (insert , update, delete ... ) ๋ก ์คํํ ์ ์๋ค!
๐ Prepared Statement ์คํ ๊ฒฐ๊ณผ
localhost:8080/prestatement.jsp
โ๏ธ์ฃผ์ํด์ผํ ์ !
PreparedStatement์ Insert๋ฌธ์ ๋ฃ์๊ธฐ ๋๋ฌธ์ localhost:8080/prestatement.jsp๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค !
Statement์ PreparedStatement์ ๋ํด ๊ฐ๋จํ๊ฒ ์ค์ต์ ์งํํด๋ณด์๋๋ฐ์, ๋ค์ ํฌ์คํ ์์๋ 'ํธ๋์ญ์ '์ ๋ํ ๊ธ์ ์จ๋ณด๋ ค๊ณ ํฉ๋๋ค : )
'๐๐ปโโ๏ธ Study > โ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ( Database )' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker/MySQL] ํธ๋์ญ์ (Transaction) (0) | 2021.01.03 |
---|---|
[Docker/MySQL] JDBC - Statement ์ค์ต (0) | 2020.12.31 |
MySQL Launchpad(test-db) ๋ค์ด๋ก๋ ๋ฐ ์ค์น (0) | 2020.12.29 |