웹 애플리케이션 만들기

보안

보안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. changmin
    간과하기 쉬운 문제지만 중요한 보안. 좋은 강의 듣고 갑니다
  2. pass
  3. 이지훈
    잘 보았습니다.^^
  4. JUNY
    완료!
  5. 아사다마오리족
    Trying to get property of non-object in C:\Bitnami\wampstack-7.1.4-0\apache2\htdocs\phpjs\14.php on line 17
    이렇게뜨고 계속 안되서 강의내용만 보고 갑니다
  6. Amore Chang
    보안이 정말 중요한거였군요..
  7. 이인태
    와우~~~ 재미있습니다..
    보안.보안...해킹 해킹...ㅎ
    사용자들이 입력값으로 장난치지 못하게 입력하는 그대로를 출력하게 하는군요..
    해킹의 원리.. 참 궁금했는데...
    아주 기본적인 원리라도 배운거ㅅ 같아 뿌뜻 합니다...ㅎ

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

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

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

    감사합니다..ㅎ
  8. John
    ㅎㅎㅎ 적신다. 이번에 그냥보고 다시 2기 도전!!!
  9. 강응택
    아이고, 킹스맨이 생각나네요. 머리가 터져요. 빠-바바밤-빠-바..
  10. Bank in
    잘 받습니다.
  11. 학습완료
  12. 권광범
    야호
  13. 이시형
    감사합니다. 더 깊이있게 해보고싶네요!!
  14. 황성준
    잘봤어요!
  15. scarleaf
    이제부터라도 데이터님을 모실때는 목욕재계를 하고 모시겠습니다!! (_ _)
  16. sayboy1018
    감사합니다. 보안이란게 참 어렵네요 ㅜㅜㅜㅜㅜㅜ
  17. Kuon
    정말 여러곳에서 생각도 못한 방법들이 튀어나오네요 보안 정말 대단한것 같아요 ㅠㅠ
  18. 참빛바다
    mysqli_real_escape_string에 $conn이 필요한 이유가 무엇인가요?
  19. 고준일
    감사히 잘들었읍니다.
  20. 백곰몬
    완료 감사합니다 어렵네요 ㅠㅠ
  21. 치우천황
    기초적인 보안에 관련된 강의 잘 들었습니다.
    역시 개발할때 보안이 필수인걸 알 수 있었습니다.
  22. 보안 어렵습니다. 대단하신 분들이십니다.
    오늘 강의도 감사히 잘 들었습니다!
  23. 졸린 사슴
    합기도에서 낙법을 제일 먼저 배운다는 것이 재밌네요.

    어떤 책에서 읽었는데, 외노자가 많은 공장의 공장장 님이 외국인들에게 제일 먼저 가르치는 말이 있습니다. 안녕하세요, 반갑습니다 와 같은 말이 아닙니다. 불이야, 입니다. 불이야, 를 못 알아들어서 외노자들께서 사망하는 것이 많다는 그 이유입니다.
    바둑에서는 공피고아라 하여, 적을 공격하기 전에 자신을 먼저 돌보라고 합니다.

    IT 분야에서 보안의 중요성에 대해 egoing 님께서 말씀하시는 바가 이와 같은 게 아닐까 싶습니다.
    언제나 안전이 최우선이다.
  24. 스타일C
    보안은 철저히 ,,,감사합니다.
  25. Lydia
    where에 1=1과 같은 항상 '참'인 조건을 넣어 전체 값을 받아오는건 너무 충격적이었어요. 똑똑한 사람이 참 많군요.. 감사합니다! 좀 더 신경써서 코딩해야겠네요!
  26. qudwn
    완료!
  27. skekogo
    오늘도 감사합니다!
  28. 이희태
    6/24일 보안 강의 수강완료하였습니다. 하.... 다른분들 존경합니다
  29. 웹초보
    codeanywhere 에서는 자체적으로 escaping 처리를 함으로써 쓰기 페이지에서 스크립트 코드의 입력을 막는 조치를 한 듯 합니다.

    db에 값이 추가가 안되는 것을 보니 post로 전송할 때 혹은 db에 insert 할 때 값을 조사해서 스크립트 코드가 있으면 실행이 안되도록 한 것 같습니다.
  30. 정미정
    감사해요! 잘들었습니다!
  31. 헬리사우드
    저는 제가 제 웹사이트를 해킹하면서 그부분을 고치려는방법으로 보안을 높입니다.
    이런식으로 보안을 높여도 돼는건가요?
  32. booski
    같은 문제인데 이미 다른분이 질문하신게 있어서 복붙해서 올려봅니다..
    ---
    안녕하세요 질문있습니다.
    2번 강의에서 본문에 자바스크립트 내용을 입력하고 제출하면 데이터베이스에 추가가 안됩니다.
    유저 테이블에 새로운 id가 등록되긴 하는데 topic테이블에는 추가가 안되네요.
    본문에 그냥 일반 문서를 치면 잘 업데이트가 되는데 자바스크립트 내용을 쓰면 안됩니다.
    이건 왜 그런건가요?
  33. 김민성
    감사합니다 잘들었습니다
  34. 저도 아랫분처럼 데이터베이스부터 속도를 못 따라가겠네요.
    차라리 데이터 베이스는 잠시 쉬고 다음 강의를 넘어가도 될런지 모르겠습니다.
    아직은 데이터베이스까지 논스톱으로 이해하기 벅차네요
  35. seetower
    mysql 부터 멘붕이 오기 시작하더니 보안에서는 외계어를 듣는 듯 합니다..

    이해를 전혀 못하고 있네요..

    어떻게 해야 하나요?? ㅜ ㅜ;;
  36. 유혀누
    잘들었습니다.
  37. 나효진
    보안 마무리
  38. 개구리
    사용자의 입력을 받는 부분에 <xmp> <pre> <code>등의 태그를
    응용해도 스크립트 입력 방지 가능할 듯도 생각되네요.
    pre : 타자로 입력한 그대로 공백, 줄 바꿈 포함해서 출력, 단 태그는 적용된다.
    xmp : 타자로 입력한 그대로 공백, 줄 바꿈 포함해서 출력, 태그도 무시하고 그대로 출력된다.
    code : 말 그대로 코드를 그대로 출력한다. 태그 스크립트 적용되지 않는다.
  39. 삼나무숲
    객체지향으로 하는 것은 어떻게 하는 걸까요?
  40. Seo Yun Seok Tudoistube
    HTML Entity 라는 단어랑 'OR 1=1의 위험성과 역슬래시 Escaping 을 이제야 좀 알겠네요. 감사합니다^_____^
  41. 공삼이육
    강의시간 보다 오타 내서 헤매는 게 더 오래 걸린 것 같아요..ㅋㅋㅋ 재밌게 잘 봤습니다!
  42. 우탄
    재미따리 재미따~
  43. 14번째
    4.3.
  44. 보안까지 챙겨주셔서 감사합니다~
    역시 아무리 강조해도 지나치지 않네요.. ^^
  45. 세번째 영상의 2:13초에 패스워드를 asdfdsa' or 로 치면

    오류가 나는 sql문이 된다고 하셨잖아요.

    그러면 $result값이 NULL이 되고 if문 안의 값도 NULL이 되어서

    else에 해당하는 안녕하세요 주인님이 나오게 되는건가요?
  46. publicum
    혹시 다른 브라우저를 쓰시는 분들 참고하시라고 남겨드립니다.

    이고잉님께서 3번째 영상 중에 공격자가 URL 조작으로 SQL에 항상 참인 호출을 넣는 사례를 보여주셨는데, 기존 URL 뒤에 한칸 띄어서 OR를 붙이는 공격예제를 일부 브라우져에서는 제대로 인식하지 않고 잘못된 주소로 처리해서 구글 검색으로 넘어가버립니다. 찾아보니 본래 URL에서의 스페이스는 '+'기호나 '%20'로 표시되는 군요. 즉, 한칸띄기 대신 +를 입력하시면 똑같은 효과로 예제를 따라가실 수 있어요.
  47. Jaeeui Kwon
    20170317
  48. 170307
    감사합니다.
  49. <script>
    </script>
  50. 강경호
    감사합니다
    170228
버전 관리
egoing
현재 버전
선택 버전
graphittie 자세히 보기