반응형
SQL Injection
사용자에게 입력받은 문자열을 Query 에 포함하여 실행하게 되면, 공격받을 수 있습니다.
예를들기 위해 아래와 같은 코드를 만들어 봤습니다. ( 안좋은 코드 입니다. )
<?
include_once $_SERVER["DOCUMENT_ROOT"]."/inc/config.php";
$user = $_GET['u'];
$pass = $_GET['p'];
$conn = mysqli_connect(DB_HOST, DB_USER, DB_PWD, DB_NAME);
$result = mysqli_query($conn, "select * from tb_user where userId = '$user' and userPwd = '$pass'");
if ($result->num_rows > 0)
echo "로그인 성공";
else
echo "로그인 실패";
mysqli_close($conn);
?>
(이해하기 쉽게 하기위해 GET 방식으로)
http://hello-bryan.tistory.com/test.php?u=hello&p=bryan
이때 u 파라메터에 다음과 같이 입력하면 어떻게 될까요?
http://hello-bryan.tistory.com/test.php?u=%27or%201=1;%23&p=anything
// url encode가 되어 저렇게 보여지지만 다음과 같은 문자입니다. 'or 1=1;#
이렇게 url 로 날리면 로그인 성공이 뜹니다.
쿼리가 어떻게 되길래 성공이 될까요?
"select * from tb_user where userId = '$user' and userPwd = '$pass'"
// 위의 쿼리에 $user 값에 'or 1=1;# 을 대입하면 아래와 같이 됩니다.
"select * from tb_user where userId = ''or 1=1;#' and userPwd = 'anythong'"
Where 절은 userId = '' or 1=1 이기 때문에 무조건 true 가 됩니다.
그리고 그 뒤에는 # 이기 때문에 주석처리가 되어 무시됩니다.
간단히 select 문을 예제로 봤지만
Delete, update, insert 등 모든 쿼리에 파라메터를 입력해서 SQL 공격을 할 수 있습니다.
예를들면 u 파라메터에 '; delete from tb_user;# 을 입력하면? 모든 데이터가 지워지겠죠.
개발 시 대비를 해야합니다.
Prevent SQL Injection
- 입력받은 파라메터 문자를 치환하는 방법
- Prepared Statements 를 사용 <-- 추천
Prepare Statement 사용 설명
2021/01/09 - [php] - [PHP] MySQL How To Prevent SQL Injection #SQL 공격 방지
728x90
반응형
'php' 카테고리의 다른 글
[PHP] mysqli error / exception 처리 #mysqli_report (0) | 2021.01.09 |
---|---|
[PHP] MySQL How To Prevent SQL Injection #SQL 공격 방지 (0) | 2021.01.09 |
[PHP] 비밀번호 처리. password_hash, password_verify (0) | 2021.01.09 |
[PHP] Login, ajax 로 구현하기 (0) | 2021.01.09 |
[PHP] login, form submit으로 구현하기 (0) | 2021.01.09 |
댓글