안녕! SQL 인젝션이 불가능하도록 개선하는 방법을 가져왔어요!
근데 여러분들 식곤증 이겨내는 방법 아시나요? 카페인 없이요!
아시는 분 있으면 댓글 달아주세요. 저 주글 것 같으니깐요.
* SQL 인젝션이 가능한 문장
$sql = "insert into id (name, id) values ('$sname', '$id')";
insert into student (name, id) values ('김가인', 'st01')
insert into student (name, id) values ('황띠시엔', 'st07')
sname = 김가인, id = st01
sname = 황띠시엔, id = st07
- 위의 SQL 문장에 value 값만 변경해서 입력하면 같은 문장으로 인식될까, 다른 문장으로 인식될까?
→ 다른 문장으로 인식된다. 다른 문장으로 인식되기 때문에 parse 과정을 두 번 거친다.
즉, 한 번의 실행 계획을 생성해도 되는데 굳이 실행계획을 두 번 생성하는 꼴이다. - 다른 문장으로 인식되는 이유가 무엇인가?
→ SQL 문장을 해시코드로 저장하기 때문이다.
* SQL 인젝션이 불가한 문장
$sql="insert into id (name, id) values (:v_name, :v_id)";
$result=oci_parse($conn,$sql); // SQL문을 파싱해서 실행 계획을 생성한다.
oci_bind_by_name($result, ":v_name", $sno); // 바인드 변수에 값을 제공한다.
oci_bind_by_name($result, ":v_id", $sname);
* 기존 코드와 다른 점: insert문에 대한 실행계획을 먼저 생성하기 때문에 후에 어떤 값을 입력하든 동일한 실행계획을 이용하여 실행된다.
<공통 부분>
$re=oci_execute($result);
oci_free_statement($result);
oci_close($conn);
수업 내용 메모인데 무슨 소리인지 이해 불가. 정리 할 필요 있음. 언젠가 하겠지 머..
v_ : 관습임. database어쩌고 bind 변수가 어디있네..머?
db 안에서 ㅅㅏ용하는 변수. 프로그램에서는 해당 변수가 있는지도 모름.
파싱할 때 :v_sno, :v_sname 모름.그냥 문장보고 실행계획부터 세움.
파싱 끝나서 실행계획 세워진 후에 v_sno에 $sno v_sname에 $sname ㅈ무.
즉, 어떤 값을 넣든 sql 문장 구성과 연관어ㅏㅄ음.
> 효과: 인젝션이고 나발이고 하나도 안 먹힘.
문장 구성에 전혀 효과가 없음.
외부에 방화벽있으면 인젝션 공격 못 행.
프로그램 정상화가 더 중요.
먼솔?. 멘솔..
'인프라 7기 > 네트워크 보안 공격 기법' 카테고리의 다른 글
ICMP 리다이렉트 (0) | 2023.05.10 |
---|---|
ARP 스푸핑, ARP 리다이렉트 (0) | 2023.05.09 |
스니핑(Sniffing) //Tcpdump, Dsniff (1) | 2023.05.09 |
SQL 인젝션_실습 (0) | 2023.05.08 |
SQL 인젝션 (0) | 2023.05.04 |