**개인 필기용으로 작성된 포스트입니다
SQL Injection이란?
말 그대로 sql 쿼리문을 서버에 전송하는 것으로 보안 상의 허점을 노리는 공격방법
방지법?
mysqli_real_excape_string()을 통해 따옴표(')를 기호형태(\' 혹은 역슬래시')로 바꿔준다.
애초에 사용자로부터 따옴표 입력을 거절한다.
> 이는 권장되는 방법은 아니지만 일단 다른 방법들도 원리는 유사하다.
<?php
$conn = mysqli_connect("localhost", "root", "1234");
mysqli_select_db($conn, "user_DB");
$sql = "SELECT * FROM user WHERE username='".$_GET['name']."' AND password='"._GET['password']."'";
$result = mysqli_query($conn, $sql);
echo $sql;
?>
>> SELECT * FROM user WHERE username='aaa' AND password='bb' or '1'='1'
이 sql 서버로 전송된다.
이게 전송되면 뒤에 따라붙는 1=1조건이 항상 참이기 때문에 DB에 저장된 모든 자료가 다 노출될 수 있다.
<?php
$conn = mysqli_connect("localhost", "root", "1234");
mysqli_select_db($conn, "user_DB");
$name = mysqli_real_escape_string($conn, $_GET["name"]);
$password = mysqli_real_escape_string($conn, $_GET["password"]);
$sql = "SELECT * FROM user WHERE username='".$name."' AND password='".$password."'";
$result = mysqli_query($conn, $sql);
echo $sql;
?>
>> SELECT * FROM user WHERE username='aaa' AND password='bb\'or\'1\'=\'1'
이 sql 서버로 전송된다.
'bb\'or\'1\'=\'1' 전체를 password값으로 입력한 셈이기 때문에 공격이 먹히지 않는다.
'web > web' 카테고리의 다른 글
CSRF Attack (0) | 2021.07.11 |
---|---|
웹 서버 vs 어플리케이션 서버 (0) | 2021.01.10 |