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 |
'웹개발 > PHP- 홈페이지 구현' 카테고리의 다른 글
검색 게시판_XSS 대응_htmlspecialchars() (0) | 2023.01.04 |
---|---|
로그인 페이지 구현 (0) | 2023.01.01 |
회원가입 페이지 구현 (2) | 2022.12.30 |
데이터 전송 방식 GET & POST (0) | 2022.11.05 |
4일차_초보자를 위한 PHP 200제 (0) | 2022.10.25 |