본문 바로가기
Coding/WebApp

보안

by 그냥그렇듯이 2017. 8. 28.
반응형

모든 저작권은 <생활코딩>의 생산자인 <egoing>님에게 있습니다.

문제시, 비공개로 전환하겠습니다.


<보안>
데이터는 잃는다면 복구할 수 없다.
데이터의 집, 서버
서버에 접속할 때는 경건해야한다. (농담)

php/5.php
사용자가 입력한 scriopt 태그를 무력화시키는 방법 (참고:htmlspeialchars)
HTML ENTITY 구글 검색

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

 php.net을 활용!
예) strip_tags를 활용한 태그 벗겨버리기

SELECT * FROM user WHERE 1=1;   =>  언제나 참이다.
SELECT * FROM user WHERE name ="egoing" AND password="222" OR 1=1;     ====>    조건문이지만 1=1 때문에 만족한다.

SQL에서 '를 따옴표로 인식하려면 '앞에 \를 넣는다.
INSERT INTO user (name, password) VALUES('hoya','11\'11');

mysqli_real_escape_string($conn,"1111");     =>  1111
mysqli_real_escape_string($conn,"11\'11");    =>  11\'11    => \를 \자체로 인식한다. 문자열로 인식 X

객체지향의 코딩을 하자!


댓글