보안 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>
    &lt;script&gt;alert(&quot;babo&quot;);&lt;/script&gt;  </body>
</html>

이렇게 < > 같은 괄호들이 &lt &gt 이렇게 표현되었다

 

내부의 파일들도 보자

 

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라고 한다

'휴지통 > PHP' 카테고리의 다른 글

공부(9)  (0) 2021.09.07
공부(8)  (0) 2021.09.07
공부(7)  (0) 2021.09.07
공부(6)  (0) 2021.09.06
공부(5)  (0) 2021.09.06

+ Recent posts