[PHP] 생활코딩 강의(3)

PM077·2022년 11월 30일
0

CS Study

목록 보기
12/27

Form (READ)

<!doctype html>
<html>
  <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>
  • action=”~”에 있는 php 파일로 옮겨짐, method는 post방식으로 지정
  • 이러면 보통 submit 과 같은 버튼을 눌렀을 때 form.php로 화면이 전환된다
// form.php
<?php
file_put_contents('data/'.$_POST['title'], $_POST['description']);
?>
  • form.php로 옮겨지면 $_POST[’title’], $_POST['description'] 로 이전 에서 정의한 input의 입력 값을 받을 수 있다.
  • file_put_contents로 link에 정보를 안담고 보내는것이 보안상 유리하다
  • 아래 링크와 같이 링크에 정보가 없음

CREATE

메인 html에서 해당 input에 name을 이렇게 지정해주면

<input type="text" name="number" size = 10>
<select name="unit">

php파일에서 밑에와 같이 값을 가져올 수 있다.

$number = $_POST["number"];
$unit = $_POST["unit"];

위와 같은 방식으로 READ를 했다면 만약 무언가를 추가하려면 file_put_contents로 CREATE하는 것이다. 여기서 첫 번째 매개변수는 제목, 두번째는 내용을 말한다. 이 후 사용자가 바로 그곳을 볼 수 있도록 header로 위치 표시 까지 해준다

<?php
file_put_contents('data/'.$_POST['title'], $_POST['description']);
header('Location: /index.php?id='.$_POST['title']);
?>

Update

//MAIN
<?php if(isset($_GET['id'])) { ?>
      <a href="update.php?id=<?=$_GET['id']?>">update</a>
    <?php } ?>
  • 업데이트를 하려면 해당 업데이트하려는 페이지의 ID를 물고 들어가야함
  • 즉, update.php에 가지만 GET[’id’]를 해서 해당 페이지를 업데이트 할 수 있도록 함
  • update.php는 기존의 메인.php를 그대로 복사하되 update하게끔 해줄 수 있는 란을 만든다
//UPDATE.PHP
<body>
    <h1><a href="index.php">WEB</a></h1>
    <ol>
      <?php
      print_list();
      ?>
    </ol>
    <a href="create.php">create</a>
    <?php if(isset($_GET['id'])) { ?>
      <a href="update.php?id=<?=$_GET['id']?>">update</a>
    <?php } ?>
    <h2>
     <form action="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>
  </body>
  • 위에 코드에서는 value값을 그대로 가져와서 수정 할 수 있게끔 한다. 즉, 기존에 있던 데이터를 가져와 수정할 수 있게끔 만든다
  • 이 후 update_process로 가게끔 해준다
//UPDATE_PROCESS.PHP
<?php
rename('data/'.$_POST['old_title'], 'data/'.$_POST['title']);
file_put_contents('data/'.$_POST['title'], $_POST['description']);
header('Location: /index.php?id='.$_POST['title']);
?>
  • form을 통해 update_process로 온다면 rename()을 사용해 기존의 title를 바꿔주고 content를 새로 넣어준다은 header로 사용자에게 보여준다

DELETE

//MAIN.PHP
<form action="delete_process.php" method="post">
        <input type="hidden" name="id" value="<?=$_GET['id']?>">
        <input type="submit" value="delete">
      </form>
  • form 에서 delete_process에 가게끔 만든다.
  • 즉, delete_process 에서 처리하겠다는 의미이다.
// DELETE PROCESS
<?php
unlink('data/'.$_POST['id']);
header('Location: /index.php');
?>
  • PHP에서 삭제는 unlink()를 사용한다
  • delete를 누른 페이지의 id 값을 form으로 받아왔을 거기에 unlink를 하면 해당 페이지가 사라진다
  • 이 후 header를 통해 메인 화면으로 가게 한다

리펙토링

  • lib 파일을 만들어서 중복되는 코드를 관리할 수 있다
require('lib/print.php')
  • 이런식으로 코드를 짠다면 lib파일의 print.php 문을 실행시킬 수 있다
  • 내부의 코드를 그대로 실행 시킴
  • 가독성이 좋다 (함수 같은 느낌이다)

보안

현재 배운 PHP를 그대로 사용하면 보안상 문제가 크다 (기본적인 제작 방법을 배운거기에)

XSS

  • JS의 문법을 input에 그대로 넣어서 내부를 동작하는 해킹 방법
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>XSS</title>
  </head>
  <body>
    <h1>Cross site scripting</h1>
    <?php
    echo htmlspecialchars('<script>alert("babo");</script>');
    ?>
  </body>
</html>
  • 이 코드를 보면 XSS를 막기 위해 htmlspecialchars()를 사용한다
  • 이는 <>가 문자 그대로 들어오기에 자바스크립트 문법에 영향을 안끼친다
  • 이런식으로 방지하는 방법이 있다

파일경로보호

  • 링크를 통해 파일 경로를 알 수 있다. 이로 인해 해킹이 일어날 수 도 있다
function print_description(){
  if(isset($_GET['id'])){
    $basename = basename($_GET['id']);
    echo htmlspecialchars(file_get_contents("data/".$basename));
  } else {
    echo "Hello, PHP";
  }
}
  • 파일경로를 감추기 위해 basename()을 PHP에서 사용한다
  • 이는 해당 파일경로만 보여주고 상위 디렉토리는 안보여주는 역할을 한다

UI vs API

UI

시각적으로 보이는 것은 모두 UI이다

API

  • 우리는 모든 것을 다 우리가 스스로 만들지 않는다
  • href로 링크를 사용하거나 scandir을 사용하여서 어플리케이션을 만든다
  • 부품과 같은 것

PHP API

  • 공식 홈페이지에 많음
  • 함수로 되어있음

이전 글

[PHP] 생활코딩 강의(1)
[PHP] 생활코딩 강의(2)

profile
PM/PO

0개의 댓글