웹개발/PHP- 홈페이지 구현

로그인 페이지_prepared statement

duduranran 2023. 1. 2. 22:14

SQL Injection 공격의 대응방안의 시작이자 끝 

prepared statement.

이걸 하면 아예 SQL Injection 공격이 불가능하다는데, 

1) 귀찮아서 안 하는 곳

2) 제대로 구현을 안 해놓은 곳이 있단다.

 

검색을 해보니 객체지향 방식과 절차형?! 방식이 있다는데, 나는 일단 객체를 잘 모르니. 절차형 방식으로 구현해보았다.

 

기존 방식의 경우 SQL 쿼리문을 만들고, 바로 mysqli_카레를 주문 때렸고, 그결과를 변수에 담아 사용 했다.

그러다 보니 로그인  ID 창에 공격자가 SQL Injection 공격 을 위해 

(' or 1)등과 같은 값을 입력하면 이 값자체가 SQL 구문으로 인식되어 공격이 가능했다.

[아, 물론 이 SQL문에서는 위의 값으로는 우회가 되지 않는다. 식별 인증을 분리하는 쿼리문이기 때문이다.]

 

prepared statement 적용 방식의 경우 SQL구문의 사용자로부터 입력받는 곳을 "?"로 해두고, 입력 받는 값은 따로 바인딩 해 준다. 결과적으로 사용자가 입력한 값이 SQL 구문으로 인식되지 못하게 되어 SQL Injection을 방어할 수 있게 된다.

 

구문을 변경하고 로그인 기능자체는 살아 있는데, 아직 SQL Injection 공격이 안 되는지 확인은 안 해봤다...

내일 해봐야지...

 

 

아래의 네 가지를 보면 어느 정도 감은 오지만 아직 확실하게 공부가 된 게 아니기에 추후 추가하겠다.

(미래의 나야 부탁해!!)

mysqli_preapre()

mysqli_stmt_bind_param()

mysqli_stmt_execute()

mysqli_stmt_get_result()

 

1
2
3
4
5
6
7
8
9
10
11
// 기존 방식 //
$sql = "select db_id,db_pw from basic_table where db_id ='$id'"
$result = mysqli_query($conn$sql);     
 
 
// prepared statement 적용 // 
$query = "select db_id,db_pw from basic_table where db_id = ?";
$stmt = mysqli_prepare($conn$query);
$bind = mysqli_stmt_bind_param($stmt"s"$id);
$exec = mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
cs