생활코딩

Coding Everybody

코스 전체목록

닫기

보안

보안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. Baekkyu Han
    보안
    보안1~3
    낙법 실패하는법 성공을 자신있게 도전
    복구 불가능한것은 데이터
    적절힐 비극은 엔지니어의
    좋은 엔지니어는 비극속에서 피어나는 꽃
    좋은 습관은 자신을 지킨다.

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

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

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

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

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

    보안2
    HTML Entity

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

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

    보안3
    dbase 보안
  13. ggang
    좋은 강의 감사합니다!!
  14. 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

    브라우저 창에 이거 같이 뜨면서 결과값은 똑같이 나오는데 맞는건가요?
  15. 박재은
    사용자가 글쓰기로도 script 문을 쓸 수 있는 군요. 코딩을 할 때 보안 부분도 유념해야 한다는 것 꼭 명심하겠습니다
  16. shin
    AND 앞에 한칸 띄어야 할것 같아요.
    대화보기
    • 코딩학습생
      잘 봤습니다.
    • 임영선
      강의 잘 보았습니다!
      보안에 관한 내용은 코딩을 접하면서 처음 배워본 내용이네요. 보안에 대해 막연한 생각만 가지고 있어서 엄청 어렵게만 생각했는데 이번 강의를 듣고나서 트인 기분이예요.
    • charl
      완료!
    • 이창준
      $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 신개념 ㅋㅋㅋ 잼있네요... 빠져드는 느낌....
    • 강동곤
      잘 봤습니다 ㅎ
    • 송연주
      보안에 대해 새삼 중요성을 느끼고 갑니다!
    • 네 그런방법이 좋은거죠 다만 합법적인 절차에 의해서 진행하여야합니다.
      대화보기
      • 박현수
        오늘날에 와서야 보안은 중요한 요소중 하나로 인식되기 조금씩 시작하는것 같네요 보안관련 학업을 진행중인 학생으로 유심히 본 강의입니다! 좋은강의 감사합니다.
      • 안성현
        와 정말 해킹을 당할 수도 있는 경우의 수가 엄청 많네요.. 오늘 소개한 방법들 모두 생각지도 못한 방법들이었습니다..! 신기하고 재미있었어요! 보안의 중요성도 잘 느꼈습니다! 오늘 강의에서는 명언이 참 많이 나온 것 같아요! 성공에 도전하기 위해서는 실패하는 방법을 알아야 한다..! 머릿속에 새기고 갑니다!! 오늘도 좋은 강의 감사합니다!
      • 산티아고
        감사합니다. 보안 부분이 늘 궁금했는데 이해하기 쉽게 차근차근 설명해주셔서 너무 감사해요!! 정말 복받으실거에요!!
      • 기픈
        잘 봤습니다. 데이터가 중요하다는것...
        저는 눈감고 코끼리 만지는 기분 ~ 어렵군요~ 결론은 해킹에 노출되지않는 코딩방법인데....
      • 강호준
        항상 들으면서 느끼는거지만 개념설명부터 차근차근 설명해주시는 섬세함에 감사합니다! 아주 기본적인 원리지만 반드시 필요한 학습이었습니다!
      • 정지호
        수강완료
      • aga159
        완료
      • Kisoo Ahn
        보안을 위한 escaping, 열심히 배워가고 있습니다.
      • 홀로
        드디어 천명 아래로 왔어요!
      • Geonho Lee
        잘 보았습니다~~
      • Jaehyun Kim
        문제가 생기기전에는 아무도 중요성을 알지못하는 보안! Escaping! 잘 배웠습니다!^^
      • 이인규
        상당히 어려운 내용이네요 !!!! 여기까지는 아직 부족한거 같습니다 ! 개념만 배우고 만약 제작과정에 들어가게된다면 다시 들어야하는 부분이네요 ㅎㅎㅎ 감사합니다.
      • changmin
        간과하기 쉬운 문제지만 중요한 보안. 좋은 강의 듣고 갑니다
      • pass
      • 이지훈
        잘 보았습니다.^^
      • 완료!
      • 아사다마오리족
        Trying to get property of non-object in C:\Bitnami\wampstack-7.1.4-0\apache2\htdocs\phpjs\14.php on line 17
        이렇게뜨고 계속 안되서 강의내용만 보고 갑니다
      • Amore Chang
        보안이 정말 중요한거였군요..
      • 이인태
        와우~~~ 재미있습니다..
        보안.보안...해킹 해킹...ㅎ
        사용자들이 입력값으로 장난치지 못하게 입력하는 그대로를 출력하게 하는군요..
        해킹의 원리.. 참 궁금했는데...
        아주 기본적인 원리라도 배운거ㅅ 같아 뿌뜻 합니다...ㅎ

        서버신(?)을 접신해야 겠습니다..

        보안 1편에 경건을 표현하신 이유를 좀 이해 할듯요..

        매일 아침 목욕재게 하고 경건한 마음으로 구글신을 만나는데..
        서버신도.. 경건한 마음으로 만나야겠습니다.. ^^

        감사합니다..ㅎ
      • ㅎㅎㅎ 적신다. 이번에 그냥보고 다시 2기 도전!!!
      • 강응택
        아이고, 킹스맨이 생각나네요. 머리가 터져요. 빠-바바밤-빠-바..
      • Bank in
        잘 받습니다.
      버전 관리
      egoing
      현재 버전
      선택 버전
      graphittie 자세히 보기