SQL 인젝션 공격을 방지하기 위해 Prepared Statements를 사용할 수 있다.
Prepared Statements는 데이터베이스와 상호 작용할 때
SQL 쿼리와 데이터를 분리하여 SQL 인젝션 공격을 방지할 수 있다.
일반적인 SQL 쿼리는 사용자가 입력한 값을 직접 포함한다.
이 때문에 공격자가 악의적인 입력을 삽입하면 데이터베이스가 오작동할 수 있다.
Prepared Statements는 쿼리와 데이터를 분리하여 이러한 문제를 해결한다.
SQL 인젝션에 취약한 코드를 보자.
$id = $_GET[‘id’]; //사용자가 입력한 값을 변수 $id에 저장한다. $query = “SELECT first_name, last_name FROM users WHERE user_id = ‘$id’;”; //쿼리문에 변수 $id를 적용한다. |
사용자가 입력한 값이 바로 쿼리문에 적용되는 것을 볼 수 있다.
위 코드를 개선해 보자.
$id = $_GET['id']; //$_GET으로 사용자가 입력한 데이터를 가져온다. 가져온 데이터는 $id에 저장한다. $stmt = $conn->prepare(“SELECT first_name, last_name FROM users WHERE user_id = ?”); //prepare 메서드는 데이터베이스에 보낼 SQL쿼리를 미리 준비한다. 나중에 실행될 때 실제 데이터와 결합한다. // ?는 자리 표시자로 나중에 $id 변수 값으로 대체된다. if($stmt) { $stmt->bind_param(“s”, $id); //bind_param 메서드를 사용해 자리 표시자 ?에 실제 값을 대입한다. 이를 바인딩이라고 한다. //s는 id 값이 문자열임을 의미한다. $stmt->execute(); //바인딩한 값을 포함한 쿼리를 실행한다. } $stmt->close(); } |
물론 위 코드만으로는 완벽하게 실행되지는 않는다.
지금은 prepared statements의 개념만 이해하는 것을 목표로 하자.
'모의 해킹' 카테고리의 다른 글
[웹 해킹] 6. 반사형 XSS(Reflected XSS) 공격과 방어 (0) | 2024.07.07 |
---|---|
[웹 해킹] 5. 크로스 사이트 스크립팅(XSS) 개요 (0) | 2024.07.05 |
[웹 해킹] 3. SQL Injection 공격 (0) | 2024.06.28 |
[웹 해킹] 2. DVWA 보안 난이도 조정하기 (0) | 2024.06.26 |
[웹 해킹] 1. 웹 해킹 연습을 위한 DVWA 설치하기 (0) | 2024.06.24 |