보안 XSS
Cross Site Scripting 을 줄여서 XSS라고 부른다
사이트에서 update를 하고
본문에
<script>alert('hi')</script> 이런식으로 작성하게 되면 경고창을 띄울수도 있고
<script>Location.href='https:www.naver.com';</script> 이렇게 입력하면 다른 사이트로도 보낼 수 있다
이 문제점을 막으려면 htmlspecialchars를 이용하면 된다
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>XSS</title>
</head>
<body>
<h1>Cross site scripting</h1>
<?php
echo htmlspecialchars('<script>alert("babo");</script>');
?>
</body>
</html>
위와 같이 만들면 스크립트가 실행되지 않고 그냥 문자형태로 출력됨을 알 수 있다
이것을 페이지 소스보기로 보게되면
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>XSS</title>
</head>
<body>
<h1>Cross site scripting</h1>
<script>alert("babo");</script> </body>
</html>
이렇게 < > 같은 괄호들이 < > 이렇게 표현되었다
내부의 파일들도 보자
lib 디렉토리 내에 print.php 파일을 수정해야한다
<?php
function print_title(){
if(isset($_GET['id'])){
echo htmlspecialchars($_GET['id']);
} else {
echo "Welcome";
}
}
function print_description(){
if(isset($_GET['id'])){
echo htmlspecialchars(file_get_contents("data/".$_GET['id']));
} else {
echo "Hello, PHP";
}
}
function print_list(){
$list = scandir('./data');
$i = 0;
while($i < count($list)){
$title = htmlspecialchars($list[$i]);
if($list[$i] != '.') {
if($list[$i] != '..') {
echo "<li><a href=\"index.php?id=$title\">$title</a></li>\n";
}
}
$i = $i + 1;
}
}
?>
title이라는 변수를 만들고 $list[$i] 이것을 htmlspecialchars로 묶어준다
근데 막상 이렇게 해버리면 이미지 태그라든지 줄바꿈 이라든지 필수적으로 해야할 것들을 못할 수 있으므로
이 땐 스트립 태그를 이용하면 된다
보안 파일 경로 보호
password.txt 파일을 만들고 아무거나 적어보자
http://127.0.0.1/index.php?id=../password.txt 를 검색하면
password.txt의 정보가 그대로 노출되게 된다
이것은 아주 심각한 일이다
php에는 basename 이라는 함수가 있다
function print_description(){
if(isset($_GET['id'])){
echo $_GET['id'];
echo "<br>";
echo basename("data/".$_GET['id']);
echo "<br>";
echo htmlspecialchars(file_get_contents("data/".$_GET['id']));
} else {
echo "Hello, PHP";
}
}
이렇게 하면 ../password.txt 로 주소창에 검색 시
../password.txt
password.txt
적었던 내용
세가지의 경우를 알 수 있다
function print_description(){
if(isset($_GET['id'])){
$basename = basename($_GET['id']);
echo htmlspecialchars(file_get_contents("data/".$basename));
} else {
echo "Hello, PHP";
}
}
이러면 더이상 주소창을 이용해서 탐색할 수가 없다
UI API
UI 는 User Interface로 사용자가 보게 될 화면
API는 태그들 <a href="http://php.net"></a> 이러한 것들을 api라고 한다