본문 바로가기
그 외 프로그래밍 언어/php

php&MariaDB, 보안 (filtering과 escaping)

by Dreaming Coder 2022. 8. 23. 20:44

 


 

불순한 의도를 가지고 사이트를 공격해오는 사용자로부터 웹사이트를 안전하게 지키는 방법 두 가지를 공부해보겠습니다.

 

 

 

지난 포스트

 

php&MariaDB, 게시판 글 읽기

지금까지 공부했던 것들을 응용해서 CRUD 중에서 Read, 데이터를 읽어와서 화면에 출력하는 기능을 php와 MariaDB를 이용해서 구현해봅시다. 지난 포스트 php&MariaDB, 게시판 글 읽기를 위한 준비 (feat.

gogogameboy.tistory.com

 

 

 

저 혼자서 공부한 내용을 대충 정리하려고 쓰는 글입니다.

모든 내용은 다 생활코딩 강의를 기반으로 하고 있으니, 어쩌다가 검색으로 들어오신 분들도 제 글들을 보기보다는 유튜브에서 생활코딩의 강의들을 보시는 것을 권장드립니다.

 

 

 

보안 - filtering (mysqli_real_escape_string)

 

 

 

 

 

php&MariaDB, 게시판 글 생성

C - Create 생성 R - Read 읽기 U - Update 수정 D - Delete 삭제 이전의 생활코딩 php 수업에서는 CRUD의 기능을 데이터베이스 없이 파일을 생성하는 방식으로 했었습니다. 이제부터는 드디어 데이터베이스

gogogameboy.tistory.com

이전에 올렸던 이 포스트의 생활코딩 강의 영상 거의 마지막 부분에 이고잉 님께서 언급했었던 그 문제를 드디어 다루게 됩니다.

사용자가 악의적으로 사이트에 SQL문을 주입시켜서 공격하는 SQL Injection을 방지하는 방법입니다.

 

 

 

수정 전의 코드

$sql = "SELECT * FROM topic WHERE id={$_GET['id']}";

 

수정 후의 코드

$filtered_id = mysqli_real_escape_string($conn, $_GET['id']);
$sql = "SELECT * FROM topic WHERE id={$filtered_id}";

 

 

 

수정 전의 코드

$sql = "
	INSERT INTO topic
	(title, description, created)
	VALUES(
		'{$_POST['title']}',
		'{$_POST['description']}',
		NOW()
	)
";

 

수정 후의 코드

$filtered = array(
	'title'=>mysqli_real_escape_string($conn, $_POST['title']),
	'description'=>mysqli_real_escape_string($conn, $_POST['description'])
);

$sql = "
	INSERT INTO topic
	(title, description, created)
	VALUES(
		'{$filtered['title']}',
		'{$filtered['description']}',
		NOW()
	)
";

 

이렇게 $_GET이나 $_POST를 mysqli_real_escape_string( )을 이용해 변수나 Array 안에 넣은 다음에 원래 $_GET이나 $_POST가 있던 자리에 변수명을 넣어줍니다.

 

 

 

보안 - SQL Injection의 원리

 

 

SQL Injection의 원리를 설명하는 영상입니다.

 

 

 

보안 - escaping (htmlspecialchars)

 

 

이번에는 SQL문이 아닌, 자바스크립트로 하는 공격을 방지하는 방법입니다.

 

 

 

수정 전의 코드

while($row = mysqli_fetch_array($result)) {
	$list = $list."<li><a href=\"index.php?id={$row['id']}\">{$row['title']}</a></li>";
}

 

수정 후의 코드

while($row = mysqli_fetch_array($result)) {
	$escaped_title = htmlspecialchars($row['title']);
	$list = $list."<li><a href=\"index.php?id={$row['id']}\">{$escaped_title}</a></li>";
}

 

 

 

수정 전의 코드

$article['title'] = $row['title'];
$article['description'] = $row['description'];

 

수정 후의 코드

$article['title'] = htmlspecialchars($row['title']);
$article['description'] = htmlspecialchars($row['description']);

 

htmlspecialchars는 사용자가 입력한 내용이 출력되는 곳에 쓰는 함수입니다.

이 함수를 사용한다면, 사용자가 악의적으로 자바스크립트 코드를 심어도 무력화시킬 수 있습니다.

 

 

 


이 글이 도움이 됐다면 하단의 공감 버튼을 꾹 눌러서
빨간 하트로 만들어주세요.
지인에게 보여주고 싶은 글이었다면
공감 버튼 옆을 클릭해서 SNS 공유해주세요.
댓글은 블로그 운영에 큰 힘이 됩니다.

 


 


댓글