목차
1. SQL 인젝션 방어
1-1 바인드 변수
1. SQL 인젝션 방어
1-1 바인드 변수
바인드 변수는 sql 문장 실행 시 문장 파싱 이후 변수에 값을 넣는 방식으로, 이를 이용해 sql 인젝션 공격을 방어할 수 있다.
● 사용자 인증 수정
기존 사용자 인증 문장은 다음과 같다.
$id = $_POST["id"];
$userpasswd = $_POST["userpasswd"];
$sql= select * from id where id = '$id' and passwd = RAWTOHEX(STANDARD_HASH('$userpasswd'||'$id', 'SHA256'));
$result=oci_parse($conn,$sql);
$re=oci_execute($result);
$row_num=oci_fetch_all($result, $row);
oci_free_statement($result);
이때 아이디 입력 칸에 id' -- 혹은 id' or 1='1' -- 를 작성 시 해당 값이 sql 문장에 포함된 상태로 파싱되므로 sql 인젝션 공격에 취약하므로 바인드 변수를 사용하여 다음과 같이 수정한다.
$id = $_POST["id"];
$userpasswd = $_POST["userpasswd"];
$sql="select * from id where id = :v_id and passwd = RAWTOHEX(STANDARD_HASH(:v_pw || :v_id, 'SHA256'))";
$result=oci_parse($conn,$sql);
oci_bind_by_name($result, ":v_id", $id);
oci_bind_by_name($result, ":v_pw", $userpasswd);
$re=oci_execute($result);
$row_num=oci_fetch_all($result, $row);
oci_free_statement($result);
이 경우 sql 문장의 id와 passwd 부분에 값이 대입될 것이라는 문장 구조만을 가지고 파싱을 진행한 이후 변수에 값을 대입하ㅡ로 아이디 입력 칸에 id' -- 혹은 id' or 1='1' -- 를 작성하더라도 sql 문이 변형되지 않고 id' -- 혹은 id' or 1='1' -- 를 $id에 온전한 값으로써 대입하여 sql 인젝션 방어가 가능하다.
● 검색 기능 수정
기존 검색 기능 문장은 다음과 같다.
$search = $_GET['search'];
if (empty($search))
{
$sql="select bno, sub, cname, to_char(bdate, 'yyyy/mm/dd') bdate, hit
from board, id where id.ino = board.ino order by bno desc";
$result=oci_parse($conn,$sql);
}
else
{
$sql="select bno, sub, cname, to_char(bdate, 'yyyy/mm/dd') bdate, hit
from board, id where id.ino = board.ino and sub like '$search' order by bno desc";
$result=oci_parse($conn,$sql);
}
echo("sql = $sql<br>");
oci_execute($result);
$row_num=ocifetchstatement($result,$row);
이 또한 바인드 변수를 사용해 다음과 같이 수정한다.
$search = $_GET['search'];
if (empty($search))
{
$sql="select bno, sub, cname, to_char(bdate, 'yyyy/mm/dd') bdate, hit
from board, id where id.ino = board.ino order by bno desc";
$result=oci_parse($conn,$sql);
}
else
{
$sql="select bno, sub, cname, to_char(bdate, 'yyyy/mm/dd') bdate, hit
from board, id where id.ino = board.ino and sub like :v_search order by bno desc";
$result=oci_parse($conn,$sql);
$search="%".$search."%";
oci_bind_by_name($result, ":v_search", $search);
}
echo("sql = $sql<br>");
oci_execute($result);
$row_num=ocifetchstatement($result,$row);
검색 기능은 검색한 문자를 포함한 문자열을 검색해야하므로 $search="%".$search."%"; 문장을 통해 구현한다.
해당 코드의 .(온점)은 문자를 이어주는 역할로, [ab] 검색 시 $search에 [%ab%] 를 대입하여 ab를 포함하는 문자열 검색 기능을 구현하도록 한다.
'일일 정리' 카테고리의 다른 글
Docker Command, Docker Image & HUB (2) | 2025.05.19 |
---|---|
DOCKER (0) | 2025.05.16 |
SQL 인젝션 (1) | 2025.05.14 |
snort - rule 설정 (1) | 2025.05.12 |
보안 장비 운용, IDS(Intrusion Detection System), IDS - snort (0) | 2025.05.09 |