웹 애플리케이션 만들기

보안

보안1

보안2

php/5.php

사용자가 입력한 script 태그를 무력화시키는 방법. (참고 : htmlspecialchars)

<html>
  <head>
    <title></title>
  </head>
  <body>
    <?php
       echo htmlspecialchars('<script>alert(1);</script>');
    ?>
  </body>
</html>

index.php

<?php
$conn = mysqli_connect("localhost", "root", 111111);
mysqli_select_db($conn, "opentutorials");
$result = mysqli_query($conn, "SELECT * FROM topic");
?>
<!DOCTYPE html>
<html>
<head>
     <meta charset="utf-8">
  <link rel="stylesheet" type="text/css" href="http://localhost/style.css">
</head>
<body id="target">
	<header>
    <img src="https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/course/94.png" alt="생활코딩">
		<h1><a href="http://localhost/index.php">JavaScript</a></h1>
  </header>
	<nav>
		<ol>
    <?php
    while( $row = mysqli_fetch_assoc($result)){
      echo '<li><a href="http://localhost/index.php?id='.$row['id'].'">'.htmlspecialchars($row['title']).'</a></li>'."\n";
    }
    ?>
		</ ol>
	</nav>
  <div id="control">
    <input type="button" value="white" onclick="document.getElementById('target').className='white'"/>
    <input type="button" value="black" onclick="document.getElementById('target').className='black'" />
    <a href="http://localhost/write.php">쓰기</a>
  </div>
  <article>
  <?php
  if(empty($_GET['id']) === false ) {
      $sql = "SELECT topic.id,title,name,description FROM topic LEFT JOIN user ON topic.author = user.id WHERE topic.id=".$_GET['id'];
      $result = mysqli_query($conn, $sql);
      $row = mysqli_fetch_assoc($result);
      echo '<h2>'.htmlspecialchars($row['title']).'</h2>';
      echo '<p>'.htmlspecialchars($row['name']).'</p>';
      echo strip_tags($row['description'], '<a><h1><h2><h3><h4><h5><ul><ol><li>');
  }
  ?>
  </article>
</body>
</html>

보안3

/phpjs/14.php

<?php
$conn = mysqli_connect("localhost", "root", 111111);
mysqli_select_db($conn, "opentutorials");
$name = mysqli_real_escape_string($conn, $_GET['name']);
$password = mysqli_real_escape_string($conn, $_GET['password']);
$sql = "SELECT * FROM user WHERE name='".$name."' AND password='".$password."'";
echo $sql;
$result = mysqli_query($conn, $sql);
?>
<!DOCTYPE html>
<html>
<head>
     <meta charset="utf-8">
</head>
<body>
  <?php
  if($result->num_rows == "0"){
    echo "뉘신지?";
  } else {
    echo "안녕하세요. 주인님";
  }
  ?>
</body>
</html>

process.php

원래는 process.php 파일에도 보안을 적용해야 합니다. 하지만 우리수업에서는 수업 시간을 줄이기 위해서 생략합니다. 참고로 아래와 같이 process.php  개선할 수 있습니다. 아래 파일을 그대로 적용해주세요.
<?php
$conn = mysqli_connect("localhost", "root", 111111);
mysqli_select_db($conn, "opentutorials");

$title = mysqli_real_escape_string($conn, $_POST['title']);
$author = mysqli_real_escape_string($conn, $_POST['author']);
$description = mysqli_real_escape_string($conn, $_POST['description']);

$sql = "SELECT * FROM user WHERE name='".$author."'";
$result  = mysqli_query($conn, $sql);
if($result->num_rows == 0){
  $sql = "INSERT INTO user (name, password) VALUES('".$author."', '111111')";
  mysqli_query($conn, $sql);
  $user_id = mysqli_insert_id($conn);
} else {
  $row = mysqli_fetch_assoc($result);
  $user_id = $row['id'];
}
$sql = "INSERT INTO topic (title,description,author,created) VALUES('".$title."', '".$description."', '".$user_id."', now())";
$result = mysqli_query($conn, $sql);
header('Location: http://localhost/index.php');
?>

소스코드

github

참고

보안의 중요한 주제인 암호화에 대해서 궁금하신 분은 아래 수업을 참고해주세요.

암호화를 이용한 보편적이지 않은 코딩

댓글

댓글 본문
작성자
비밀번호
  1. Gyoil Gu
    여러번 돌려봤어요! 보안은 어렵고 중요하네요.
  2. 다시시작
    완료
  3. jayxwoo
    잘봤습니다^^ 이런식으로 escaping을 한다는 감각을 조금은 알 것 같네요. 감사합니다~
  4. jayxwoo
    설명을 잘 못드린 것 같네요. (정확하진 않다고 말씀드리긴 했지만..)
    보안3 동영상을 보니 원화 표시는 역슬래시를 사용하는 것 같네요. 보안3 동영상 25분20초 부터 한번 보세요. ^^
    대화보기
    • jayxwoo
      맥os에서는..
      - 원화(₩) 표시 대신 키보드버튼 1 왼쪽에 위치한 ` 버튼을 사용하는 것으로 알고 있습니다.
      - 원화 표시를 해야 할 경우 키보드 인풋을 한글로 변경하신 후 위와 동일한 버튼 ` 을 누르시면 원화로 표시됩니다.

      (정확하진 않지만 한번 해보세요.)
      대화보기
      • forest
        완료
      • thank you so much ^^
      • 김태윤
        봤어요.. 근데 어렵네요. --;
      • Narrativi
        $_GET[] 으로 받으려고 하는 name과 password를 찾을 수 없다는 뜻입니다.
        아마 주소에 ?name=egoing&password=111111 를 덧붙이는걸 깜박하신 것 같네요!

        localhost/phpjs/14.php 로 이동하면 보시는 에러메시지가 뜨고
        localhost/phpjs/14.php?name=ㅁㄴㅇㄹ&password=ㅁㄴㅇㄹ 로 이동하시면, ㅁㄴㅇㄹ에 입력한 내용에 따라 '반갑습니다' 또는 '뉘신지'가 뜨게 됩니다.

        if문을 응용하시면 name 또는 password가 빠진 경우에도 에러메시지가 출력되는 대신 빈페이지를 보이게 한다거나 하실 수 있습니다!
        대화보기
        • 광길
          보안 실습 3번 코드를 작성하고 리로드를 하면

          Notice: Undefined index: name in C:\Bitnami\wampstack-5.6.31-0\apache2\htdocs\phpjs\14.php on line 4
          //(4번줄 내용 : $name = mysqli_real_escape_string($conn, $_GET['name']);)
          Notice: Undefined index: password in C:\Bitnami\wampstack-5.6.31-0\apache2\htdocs\phpjs\14.php on line 5
          //(5번줄 내용 : $password = mysqli_real_escape_string($conn, $_GET['password']);)
          SELECT * FROM user WHERE name='' AND password='' 뉘신지?

          자꾸만 이렇게 뜹니다ㅜㅜ 데이터베이스에 이름을 다르게 저장한것도 아닌데 왜그러는 걸까요??ㅠㅠㅠ 도와주세요ㅠㅠㅠ
        • 신시내티
          수업 듣고보니 보안 전문가는 암환자를 수술하는 외과의사 같다는 생각이 드네요 ㅎㅎ
          미국에서는 금융계 회사 보안 전문가가 IT 업계에서 가장 대우받는 직업중 하나 인것 같아요.
        • 신시내티
          이고잉님 수업에는 단순한 스킬뿐 아니라,철학도 담겨있어서 좋아요. 감사합니다.
        • jhpark
          Wow, safety is vary important.
          i think, i can see that.
        • chosu1202@naver.com
          원화 표시라는 것 보다는 역슬래쉬라는 것을 아셔야 할 것 같습니다.
          Enter 바로 위에 있는 버튼 누르시면 됩니다.
          대화보기
          • 가영
            완료!
          • Jayden贤宇
            맥북은 mysql monitor에서 원화표시를 어떻게해야하죠??

            control + command + space 단축기로 원화를 넣으면 오류가 뜹니다..ㅠㅠ
          • qhdgusdndn@naver.com
            맥북은 mysql monitor에서 원화표시를 어떻게해야하죠??

            control + command + space 단축기로 원화를 넣으면 오류가 뜹니다..ㅠㅠ
          • GoldPenguin
            완료했습니다.
          • milhouse
            도움이 될지 모르겠지만 일단 작성해볼게요.^^

            -> $sql 변수에 DB안에서 실행하고 싶은 명령어를 문자열 형태로 저장한 다음

            mysqli_query 함수를 통해 DB내에서 $sql에 저장된 문자열을 전달해서

            그 문자열을 명령어로 실행시키도록 하고 있는 거라고 알고 있습니다.
            대화보기
            • Baekkyu Han
              보안
              보안1~3
              낙법 실패하는법 성공을 자신있게 도전
              복구 불가능한것은 데이터
              적절힐 비극은 엔지니어의
              좋은 엔지니어는 비극속에서 피어나는 꽃
              좋은 습관은 자신을 지킨다.

              dbase 관련 보안
            • 박예지
              완료료료
            • 김경태
              잘 봤습니다~
            • Myeongjin Ko
              완료
            • 인재진
              수강완료합니다.
            • 완료 ^^
            • fatfat
              수업 잘 들었습니다 ㅎㅎ 수업을 듣다가 궁금한게 생겼는데요!

              DB에서 가져온 내용을 화면에 표시하기 전에 script 태그를 무력화 시키는 방법은 이제 앍았습니다.

              그런데 제 생각에 DB의 내용이 공격을 당했을 수도 있으니 DB에서 가져온 내용을 좀 더 꼼꼼하게 따져봐야 하는것 아닌지 하는 괜한 걱정이 드네요..

              실제 홈페이지를 만들 때 DB에서 가져오는 내용은 script만 무력화 시켜줘도 충분한가요??
            • 김코코
              $sql = "SELECT * FROM user WHERE name='".$_GET['name']."'AND password='".$_GET['password']."'";

              이 코드에서 sql에 들어가는건 문자열인가요 아니면 db를 이용하는 어떤 명령문인가요?
              " " 이것을 이용해 쭉 나열한 문자열이 sql 변수에 들어간 거같은데...
              음 저 코드가 사용자가 입력한 name과 password를 받아서 뭘 하는지 잘 모르겠어요
            • 지구촌
              보안이 어려워요.
            • 푸른바람9101
              열심히..
            • 김범진
              휴 보안에관해 한번하고싶었었는데 좋네요 완료
            • 한종운
              [보안]
              보안1
              정보 business 핵심 요소. code(x) data(o)
              서버는 data의 집. 서버에 접속할 때는 '경건'하라.
              서버 작업에서의 실수는 돌이킬 수 없는 경우가 있다.
              좋은 엔지니어는 '비극속에 피어나는 꽃'이다.
              적절한(?) 보안 비극은 보안 담당자에게는 '약'이다.
              보안 전문가는 만능이 아니다.
              보안은 포괄적인 보호수단.
              보안에 대한 좋은 습관이 필요.

              보안2
              HTML Entity

              text를 있는 그대로 표시하는
              php 함수
              echo htmlspecialchars(" ")
              사용자가 직접 입력한 정보는 공격 대상이 될수 있으므로
              htmlspecialchars()로 모두 감싸서 보호하라.

              php.net에서
              strip_tags 검색. 사용방법 확인 가는.
              strip_tags : 태그를 날리고, 허용태그를 직접 지정 할 수 있다.

              보안3
              dbase 보안
            • 좋은 강의 감사합니다!!
            • kong il
              보안3 실습할때,

              Notice: Trying to get property of non-object in C:\Bitnami\wampstack-5.6.31-0\apache2\htdocs\phpjs\14.php on line 15

              브라우저 창에 이거 같이 뜨면서 결과값은 똑같이 나오는데 맞는건가요?
            • 박재은
              사용자가 글쓰기로도 script 문을 쓸 수 있는 군요. 코딩을 할 때 보안 부분도 유념해야 한다는 것 꼭 명심하겠습니다
            • AND 앞에 한칸 띄어야 할것 같아요.
              대화보기
              • 코딩학습생
                잘 봤습니다.
              • 임영선
                강의 잘 보았습니다!
                보안에 관한 내용은 코딩을 접하면서 처음 배워본 내용이네요. 보안에 대해 막연한 생각만 가지고 있어서 엄청 어렵게만 생각했는데 이번 강의를 듣고나서 트인 기분이예요.
              • 완료!
              • 이창준
                $sql = "SELECT * FROM user WHERE name='".$_GET['name']."'AND password='".$_GET['password']."'";

                이부분에서 and가 예약어인 보라색으로 표현이 되는게 아니라 녹색으로 표현되는데 왜 이러죠..? 다른거 없는거 같은데

                14.php 7분10초
              • 김대관
                8/11 잘봤습니다
              • 김우진
                잘봤습니다
              • YeonHoon Jeong
                수강완료하였습니다.
              • jimmyzip
                mysqli_real_escape_string이라는 api를 통해
                '1'='1같은 공격을 해도
                '이 더이상 문자열시작을 의미하지 않고, 그저 문자인 따옴표로 인식되어 sql문에 오류를 내고 완성되지 않음으로써 방어가 된다....맞나요?
              • aimerthis(이성민)
                역시 보안이랑 PHP 신개념 ㅋㅋㅋ 잼있네요... 빠져드는 느낌....
              • 강동곤
                잘 봤습니다 ㅎ
              • 송연주
                보안에 대해 새삼 중요성을 느끼고 갑니다!
              • 네 그런방법이 좋은거죠 다만 합법적인 절차에 의해서 진행하여야합니다.
                대화보기
                • 박현수
                  오늘날에 와서야 보안은 중요한 요소중 하나로 인식되기 조금씩 시작하는것 같네요 보안관련 학업을 진행중인 학생으로 유심히 본 강의입니다! 좋은강의 감사합니다.
                • 안성현
                  와 정말 해킹을 당할 수도 있는 경우의 수가 엄청 많네요.. 오늘 소개한 방법들 모두 생각지도 못한 방법들이었습니다..! 신기하고 재미있었어요! 보안의 중요성도 잘 느꼈습니다! 오늘 강의에서는 명언이 참 많이 나온 것 같아요! 성공에 도전하기 위해서는 실패하는 방법을 알아야 한다..! 머릿속에 새기고 갑니다!! 오늘도 좋은 강의 감사합니다!
                • 산티아고
                  감사합니다. 보안 부분이 늘 궁금했는데 이해하기 쉽게 차근차근 설명해주셔서 너무 감사해요!! 정말 복받으실거에요!!
                버전 관리
                egoing
                현재 버전
                선택 버전
                graphittie 자세히 보기