생활코딩

Coding Everybody

코스 전체목록

닫기

PHP의 보안

수업소개

웹애플리케이션에게 일어날 수 있는 나쁜 일들을 알아보고, 이런 문제를 해결하는 사례를 알아봅니다. 

 

Cross site scripting (XSS)

 

XSS.php

<!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>

 

변경사항

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;
  }
}
?>

 

 

파일 경로 보호

 

변경사항


<?php
function print_title(){
  if(isset($_GET['id'])){
    echo htmlspecialchars($_GET['id']);
  } else {
    echo "Welcome";
  }
}
function print_description(){
  if(isset($_GET['id'])){
    $basename = basename($_GET['id']);
    echo htmlspecialchars(file_get_contents("data/".$basename));
  } 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;
  }
}
?>

 

댓글

댓글 본문
  1. Cpt.MJ
    I'm here~~~~
  2. 23.12.03 70%는 막을수 있다냥!!!
  3. heartsound2
    무섭네요
  4. 드림보이
    2022.02.26. WEB2 - PHP - PHP의 보안 파트 수강완료
  5. pmxsg
    2022.1.4.수강
  6. 뭉치우석
    호오...
  7. chimhyangmoo
    21.06.03
  8. jwoh
    21-04-25
  9. jeisyoon
    2021.04.14 보안(htmlspecialchars) - OK
  10. hanel_
    21.2.21
  11. kkn1125
    21.01.05.화 완료~!
  12. 111pixel
  13. 우성짱
    좋아요
  14. siver
    실사용한다면 basename을 적용해야할 곳이 생각보다 많겠네요
  15. クレヨンしんちゃん
    ㅇㄹ
  16. 이서연
    완료
  17. 이서연
    완료
  18. 아자요
    HTML, Java Script 완강 후 새로운 도전시작

    20.05.13일 / 완료
  19. Lucas Trowman
    완료!
  20. OneJae EE
    20.04.14 화 / 37세 비전공자 / 완료
  21. 스티븐잡숴
    완료
  22. 사용자가 제목을 script형식으로 만들면 script형식의 제목이 되니까 그런거아닐까요
    대화보기
    • moon
      정말 감사합니다.!!
    • 햄쮸맨
      와..비집고 들어올려고 하면 방법은 많이 있군요..무서운 세상...
    • 몽글몽글솜사탕
      감사합니다
    • 허공
      190508 감사합니다.
    • 웅이
      고맙습니다 !
      대화보기
      • 돌입
        웅이//
        프로그램은 순서대로 흘러가죠?
        while문 밖에 위치하게 된다면 $title에 대입은 한번 밖에 동작하지 않기 때문에
        $title에 대입된 값에 변경이 없게됩니당
        대화보기
        • Gihoon Pomme Ryu
          완료. 고맙습니다.
        • 웅이
          print.php 에서
          왜 $title = htmlspecialchars($list[$i]); 가 while문 안에 들어가야 하나요?
          $list = scandir('./data');
          $i = 0;
          처럼 왜 while문 밖은 안되고, 안에 있어야하는지 아는사람 누굽니꽈~~~~~~~~
        • 로버트한
          보안은 참 어려운 거군요 ㅠ,ㅠ
        • 로버트한
          감사합니다.^^
        • kissandlove
          print_list() 내에 있는 $list는 scandir함수에서 리스트를 개발자가 가져온 것이지 사용자가 입력한 것이 아닌것 같은데 xss 표적이 될수 있나요?
        • 유진희
          보안부분이 확실히 어렵네요 그래도 설명 정말 감사합니다 ^^
        • attack.html 파일만들어서 아래와 같이 만든뒤
          <form action="http://상대방주소아이피/delete_process.php" method="post">
          <input type="text" name="id" placeholder="뭘지울래" />
          <input type="submit" value="삭제" />
          </form>
          삭제하니 지워지네요 정말 재밌어요 이거 테스트한다고 잘안되서 40분 날렸지만... ㅎㅎ
        • 제갈량
          자바스크립트가 좋은 용도로 쓴다면 괜찮은 언어이지만,
          이 언어를 악용하면 않좋게도 쓰일 수가 있겠네요.
          예를 들어, 요즘 문제가 되고 있는 가짜 사이트로 오게 유도하는것도 가능하겠네요.
          그리고 보안이란게 첨예한 문제이기 때문에
          이런것까지 알아두면 유용하게 써먹을 수도 있겠다는 생각을 하게 됩니다.
          잘 봤습니다. 감사합니다. ^^
        • Mingi Son
          감사합니다
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기