본문 바로가기
개발/PHP

[시큐어 코딩] PHP - XSS 대응방안 - htmlspecialchars() 함수 사용

by m_.9m 2022. 2. 19.

 

XSS를 예방하기 위해서 HTML Entity로 이스케이프를 시켜줘야한다.

2021.11.20 - [N 스터디 👩‍💻/수업 기록] - [6주차]XSS 키로커 삽입과 대응방안

 

[6주차]XSS 키로커 삽입과 대응방안

* 참고사항 XSS 시 단순한 알림창에 위협을 느끼지 못하기 때문에 버그바운티나 실제 업무에서 보고서를 작성할 떄 위험하다는 것을 직관적으로 인지시켜주기 위해서 얼마나 영향력 있는 취약점

myungjjju.tistory.com

 

SQL 문 삽입 부분을 모두 Prepare Statement해주고 나서 추가로 변수에 htmlspecialchars() 함수를 사용했다.

아래는 코드 예시.

 

[게시글 작성 페이지]

 

 

DB에 이스케이프된 HTML문이 잘 삽입된 것을 확인할 수 있다.

 

예전처럼 XSS 공격을 시도해보아도 공격이 먹히지 않는 것을 확인했다.

간단한 함수 사용으로 XSS 사용을 막을 수 있다.

 

 

[글 쓰기 페이지] 부분 첨부

HTML Entity 치환을 위한 htmlspecialchars() 함수를 변수에 모두 적용해주고

SQL Injection 예방을 위해서 prepare 함수를 썼다.

파일 업로드 부분은 웹 경로와 분리하기 위해서 루트에 upload 파일을 만들어 구성 중이다,

 

if(isset($_POST['lockpost'])){
    $lo_post = '1';
}else{
    $lo_post = '0';
}

$name = htmlspecialchars($_POST['name']);
$pw = htmlspecialchars($_POST['pw']); 
$title = htmlspecialchars($_POST['title']);
$content = htmlspecialchars($_POST['content']);
$date = date('Y-m-d h-i-s');
$hit = 0;
$thumbup = 0;

$tmpfile =  $_FILES['b_file']['tmp_name'];
$o_name = $_FILES['b_file']['name'];
$filename = iconv("UTF-8", "EUC-KR",$_FILES['b_file']['name']);
$folder =  "../../../../../../../upload/".$filename;
move_uploaded_file($tmpfile,$folder);

$encrypted_pw = password_hash($pw, PASSWORD_DEFAULT);

if($name && $encrypted_pw && $title && $content){
$sql= "INSERT INTO board(name,pw,title,content,date, hit, thumbup, lo_post, file) VALUES(?,?,?,?,?,?,?,?,?)";
$stmt = $db->stmt_init();
$stmt = $db->prepare($sql);
$stmt->bind_param('sssssiiis', $name, $encrypted_pw, $title, $content, $date, $hit, $thumbup, $lo_post, $o_name);
$stmt -> execute();