ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SISS/웹 스터디] 2학기 3주차 스터디 - PHP
    24-2 SISS/웹 2024. 9. 22. 23:45

    2학기 3주차 스터디 - PHP

    3주차 09/16 ~ 09/22 [PHP] 23 ~ 30

     

    22. form과 POST


    • <form>
      • 속성
        • action → 보낼 곳
          • action=”form.php” → form.php에 주소 형식으로 정보가 전달됨 ($_GET[’이름’]으로 받을 수 있음)
      • <form> 안에서 사용할 기타 태그
        • <input>
          • type → 타입
            • text, submit, …
          • name → 전송할 이름
          • placeholder → 입력 시 보여줄 문구
        • <textarea> → 여러 줄을 입력할 수 있음

     

    • POST
      • form의 정보 전송 방식
        • GET
          • form은 기본적으로 GET을 이용하여 사용자가 입력한 정보를 전달 → URL 파라미터에 정보가 추가되므로 콘텐츠를 공유할 경우 적합
        • POST
          • GET의 문제점을 해결하기 위한 URL을 변경하지 않고 정보를 전송하는 방식 → 정보 입력 혹은 삭제의 경우 적합
            • 개발자 도구>Network>Headers에서 전송 내용을 확인할 수 있음
          • $_POST
            • php에서 POST 방식으로 전달된 데이터를 가져옴
    // form.html
    
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>form</title>
    </head>
        <body>
            <form action="form.php" method="post">
                <p><input type="text" name="Title" placeholder="title"></p>
                <p><textarea name="description"></textarea></p>
                <p><input type="submit"></p>
            </form>
        </body>
    </html>
    
    // form.php
    
    <?php
        file_put_contents('data/'.$_POST['title'], $_POST['description']);
    ?>
    

    22. form과 POST

     

    23. 글 생성


    • create
      • 입력 링크 생성
      • 제목 및 본문 입력
      • 입력 내용 파일 생성
      • 제출한 내용의 페이지로 이동 (redirection)
      // index.php (생성 링크 추가)
      ...
          <a href="/web1_html_internet-master/create.php">create</a>
      ...
      
      // create.php (입력 form, index.php 복사)
      <a href="/web1_html_internet-master/create.php">create</a>
      <form action="/web1_html_internet-master/create_process.php" method="post">
      	<p>
      		<input type="text" name="title" placeholder="Title">
      	</p>
      	<p>
      		<textarea name="description" placeholder="Description"></textarea>
      	</p>
      	<p>
      		<input type="submit">
      	</p>
      </form>
      
      // create_process.php (입력 내용 파일 생성, 페이지 이동)
      <?php
          file_put_contents('data/'.$_POST['title'], $_POST['description']);
          header('Location: /web1_html_internet-master/index.php?id='.$_POST['title']);
      ?>
      

    23. 글 생성

     

    24. 글 수정


    • Update
      • rename() → 파일 명 수정
      • <?= … ?> → <?php echo … ?>일 경우 사용

      • 수정 링크 생성 → 각 게시물 페이지에서만 생성됨 (홈 화면에서는 나타나지 않음)
      • 제목 및 본문 로드 및 수정 제출
      • 수정 내용 파일 저장
      • 수정한 내용의 페이지로 이동 (redirection)
      // index.php (주소에 id가 있을 경우 수정 링크 추가)
      ...
      <a href="/web1_html_internet-master/create.php">create</a>
      <?php if (isset($_GET['id'])) { ?>
      	<a href="/web1_html_internet-master/update.php?id=<?=$_GET['id']?>">update</a>
      <?php } ?>
      ...
      
      // update.php (원문이 담긴 form, index.php 복사 및 create.php의 form 복사)
      <form action="/web1_html_internet-master/update_process.php" method="post">
      	<input type="hidden" name="old_title" value="<?=$_GET['id']?>">
      	<p>
      		<input type="text" name="title" placeholder="Title" value="<?php print_title(); ?>">
      	</p>
      	<p>
      		<textarea name="description" placeholder="Description"><?php print_description();?></textarea>
      	</p>
      	<p>
      		<input type="submit">
      	</p>
      </form>
      
      // update_process.php (제목 및 본문 수정 후 저장, 수정 페이지로 이동)
      <?php
          rename('data/'.$_POST['old_title'], 'data/'.$_POST['title']);
          file_put_contents('data/'.$_POST['title'], $_POST['description']);
          header('Location: /web1_html_internet-master/index.php?id='.$_POST['title']);
      ?>
      

    24. 글 수정

     

    25. 글 삭제


    • delete
      • unlink() → 파일 삭제

      • 파일 삭제 form 추가 → (GET) 링크를 통해 삭제하면 문제가 발생할 수 있음 (타인이 악의적으로 링크를 이용하거나, 페이지를 미리 로드하는 플러그인이 해당 페이지를 로드하는 경우 등) → (POST) form을 이용해서 삭제
      • 삭제 후 홈으로 이동
      // index.php (파일 삭제 링크)
      <?php if (isset($_GET['id'])) { ?>
      	<a href="/web1_html_internet-master/update.php?id=<?=$_GET['id']?>">update</a>
      	<form action="/web1_html_internet-master/delete_process.php" method="post">
      		<input type="hidden" name="id" value="<?=$_GET['id']?>">
      		<input type="submit" value="delete">
      	</form>
      <?php } ?>
      
      // delete_process.php (삭제)
      <?php
          unlink('data/'.$_POST['id']);
          header('Location: /web1_html_internet/index.php');
      ?>
      

    25. 글 삭제

     

    26. 파일로 모듈화 - require


    • 폴더를 만듦
      • lib
        • print.php
      • view
        • top.php
        • bottom.php

     

    27.1. 보안 XSS


    • Cross Site Scripting (XSS) → 웹 사이트에 스크립트 태그(자바스크립트를 실행하는 코드)를 주입

     

    •  방지
      • htmlspecialchars() → 꺽쇠(태그)를 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;
            }
        }
    ?>

    27.1. 보안 XSS

     

    27.2. 보안 파일 경로 보호


    • 파일 경로 보안 → 중요한 정보가 저장되어있는 파일 위치를 알아내면 정보를 탈취할 수 있음
      • basename() → 파일 명을 추출하는 함수 → 파일 경로 대신 파일 명만 반환
      // lib/print.php
      function print_description() {
          if (isset($_GET['id'])) {
              $basename = basename($_GET['id']);
              echo htmlspecialchars(file_get_contents("data/".$basename));
          } else {
              echo "Hello PHP~!";
          }
      }
      

     

    • 개발자 도구 > Network > Preserve log → 서버와의 데이터 교환 기록을 저장 → 메소드 등을 알아내 위협을 가할 수 있음
    // delete_process.php
    <?php
        unlink('data/'.basename($_POST['id']));
        header('Location: /web1_html_internet-master/index.php');
    ?>

     

    29. UI API 그리고 공부 방법


    • UI (User Interface) → 사용자가 접하는 모든 것 (폼, 링크 등)
    • API (Application Programming Interface) → 함수, 태그 등등

     

    • 공부 방법 추천 → 최소한의 문법과 API를 이용하여 코드를 작성해보자 → 나중에 효율성을 추구하는 것으로…

     

    30. 수업을 마치며


    • PHP의 API
      • php 공식 문서 > Function Reference (함수 목록)
        • Compression and Archive Extensions
        • Cryptography Extensions
        • File System…
        • Image Procession and Generation
        • Mail…
    • PHP Composer → 패키지 관리자 (누군가가 만든 패키지를 사용할 때)
      • popular pakages 참고

     

    • DB → 파일 대신 데이터를 체계적이고 안전하고 빠르게

     

    • 회원 관리
      • 기본
        • cookie → 사이트 접속자 식별 (인증 시에는 사용하지 않음)
        • session → 인증 시 사용
      • 타사 인증 시스템 사용 → 카카오, 구글 로그인 등 (검색 예: federation authentication facebook php)
        • 장점: 보안 강도가 높아짐
        • 단점: 종속됨

     

    • 파일 업로드 → php file upload 검색
Designed by Tistory.