ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Step 3-2. Server side language PHP chap 2.
    2020/<programing> <coding> 2020. 3. 28. 15:37

    1. PHP 함수만들기

    https://youtu.be/XAVYo8uLlWM

    file : index.php

     

    함수를 만드는 것과 그 효과에 대한 간단한 설명

     

     

    2-1. PHP 함수의 형식 1

    https://youtu.be/gfCyAy_kE7M

    2-2. PHP 함수의 형식 2

    https://youtu.be/g1oXQ5hBDsc

    2-3. PHP 함수의 형식 3

    https://youtu.be/1JrU2jWH2h0

    file : function2.php

     

    python의 def와 같은 

    PHP의 function.

    함수 내에서 return을 만나는 순간 바로 break하기 때문에 

    적는 순서에 유의할 것

     

     

    3. PHP 함수의 활용

    https://youtu.be/P6tQrxmLkhY

    file : index.php

     

    프로그래밍에서는 중복의 제거가 중요한 의미를 가지며,

    함수를 이용할 수 있다면 이용해서 사용하자

     

    while ($a < count($list[$a])) 

    여기에서 count 함수 적용실수

    count() 함수는 리스트의 크기를 측정해주는 함수이기 때문에 리스트 자체를 설정해주어야 하는데

    $list[$a] 라고 설정해, 리스트가 아닌 하나의 값을 지정했기 때문에 count()함수가 정상적인 동작을 못함

     

    코드를 길게 적용하는것 보다 함수를 만들어서 적용하는것이 훨씬 깔끔하게 코딩할 수 있음을 재확인!

     

     

    4. 웹 완성예고

    https://youtu.be/PDtUg2rne8M

     

    CRUD 예고.

     

     

    5. Form and Post

    https://youtu.be/7tewXu5Zo2Q

    file : form.html, form.php

     

    form : 사용자의 정보를 서버쪽으로 전송할 때 사용하는 기능

    즉 사용자가 입력한 정보(data)를 URL파라미터로 만들어주는 기능

    그러나 보안상의 문제로 인해 URL에 정보가 포함되는 방식은 좋지 않은 방법.

     

    데이터는 URL을 통하지 않게 전송되어야 함.

     

    URL에 데이터가 포함될 때 좋은 경우는, 현재페이지를 바로 보여주고 싶을 때(북마크)

    ID값정도를 포함시키는 수준이 제일 좋다.

     

    data를 전송하는 방식을 method="post" 속성으로 정해주면, url을 사용하지 않고 은밀하게 데이터 전달가능

    이 방법을 사용하면 form 데이터가 헤더를 통해 url을 통하지않고 전달되기 때문에 사용자는 확인할 수 없게된다.

    이렇게 post로 전송된 데이터를 받을 때

    데이터를 받는 곳 에서는 $_POST[''] 코드를 통해 받아야 한다.

     

    form 태그에서 method값을 지정해주지 않으면 기본값이 "get"이고,

    이때는 url을 파라미터를 통해서 데이터가 전송.

     

     

    6. 글생성기능 구현하기

    https://youtu.be/ExLCGW51mk0

    file : index.php, create.php, create_process.php

     

     

    index.php 파일에 

    글생성기능 만들기

     

    이전시간에 사용했던 

    create_process.php 파일 내부에 file_put_contents() 함수를 이용해서 

    create.php 에서 전송한 내용을 토대로 파일 생성

     

    사용자로부터 정보를 받을 수 있는 상태가 됨.

     

    즉 

    index.php (메인화면) 에서 create 버튼을 누르면

    생성을 할 수 있는 create.php 파일로 <a> 태그를 통해 이동하고,

    create.php 에서 작성한 내용을 토대로 create_process.php 페이지는 
    입력받은 내용의 파일을 생성.

     

    리디렉션 : 다른페이지로 사용자를 이동시키는 기술.

    할일이 끝났을 때. 사용자는 create_process.php 화면에 남아있을 필요가 없으므로, 

    다른페이지로 이동시킨다.

    php 코드 : header('Location : /index.php'.$_POST['title']);

    위 코드는 index.php페이지에서 , id값을 가지는 페이지로 , 즉 

    방금 작성한 글을 확인할 수 있는 페이지로 이동할 수 있게 하는 코드

     

     

    7. 글 수정기능 구현하기

    https://youtu.be/vQnyPjih2dQ

    file : index.php, update.php, updata_process.php

     

    update버튼은 메인화면에서 나오는것이 아니라, 

    특정 글을 수정하기 위한것이므로, 글 내부로 들어갔을 때 등장하는것이 좋다.

     

    create.php에서 <form> 부분을 그대로 복붙, 

    update 버튼을 눌렀을 때 내용이 담겨있어야 수정이 가능하기 때문에 

    초기값(value) 를 설정해준다.

     

    and

     

    submit 버튼을 눌렀을 때
    수정한 내용을 파일에 저장하기 위한 역할을 update_process.php 가 수행한다.

    update_process.php는 ./data 폴더에 있는 값을(제목, 내용) 을 수정하는 역할을 한다.

     

    php file rename()

    rename(old name, new name); 함수는 각각 old / new 이름들을 변수로 받기 때문에,

    old name를 저장해줄 수 있는 변수가 필요함.

    이 old name은 사용자에게 노출되지 않으면서 데이터를 전송할 수 있게 ( rename() 함수에서 old name을 알기위함) 설정

     

    update_process.php를 통해 리디렉션해주어, 수정한 글을 바로 확인할 수 있게 설정하면

     

    작성된 게시글의 제목과 내용을 수정 할 수 있는 포맷 완성

     

     

    8. 글 삭제기능 구현하기

    https://youtu.be/jGWumB5EZ1o

    file : index.php, delete_process.php

     

     

    php delete를 구현하기 위한 코드, 함수

     

    unlink() : delete a file

    그런데 unlink() 함수에서 id 값을 get 이 아니라 post로 받으면 삭제가 안되고 리디렉션 되는데

    애초에 post로 전해주지 않고 get으로 데이터를 전송하기 때문이다. 

    그러면 form 태그를 쓰지 않고는 post로 데이터를 전송할 수 있을까?

     

     

    그러나 이렇게 삭제를 쉽게 두면 안된다. 아주나쁜방법임.

    만약 누군가 작성한 글에 접속한 뒤, 그 글에 있는 delete 링크를 복사해서 전송하면

    다른사람이 링크를 클릭하자마자 데이터가 삭제됨.

    ex : http://127.0.0.1:8080/delete_process.php?id=Vietnam

    위 링크를 눌러버리면 해당글이 삭제되어버림.

     

     

    영상 후반에 가니 

    결국 form 태그를 이용해서 데이터를 전송하는것을 알려줌.

    삭제기능을 가진 코드가 링크를 이용해서 전달되면 안된다.

     

     

    9. 모듈화, Require

    https://youtu.be/XmNzWGKe3wg

    file : lib, view, index.php, create.php, update.php

     

     

     

    refactring : 기능을 그대로 둔 채 만들어 놓은 코드를 효율적으로 개선하는 작업.

    처음부터 이상적인 코드를 짤 수는 없다.

     

    현재

    index.php, crate.php, update.php 이 세파일 모두 처음에 같은함수를 정의하고 시작하는데

    이 코드들이 중복된다.

     

    재사용할만한 함수나 로직을 정리정돈해두는 곳 lib

    출력되는 곳들을 보관해두는 곳 view 등

    각각의 부품들도 한곳에 묶어두고 관리하는게 좋다.

    또 각 코드들을 짠 후 꼭 다시 정리하는, 리팩토링 과정이 중요.

     

     

    10-1. PHP의 보안

    XSS

    https://youtu.be/8WV1Ym9BjEQ

    file : xss.php

     

    예를들어, 

    업데이트를 할 때

    내용에다 

    <script>

    alert('kkkk');

    </script> 

    이런 글을 작성해서 전송을 하면

    계속해서 경고창이 뜬다.

    location.href='http://naver.com'; 이런식으로 작성하면 광고처럼 원치않는 사이트로 이동되어버림

     

    이때 php 의 htmlspecialchars()함수를 이용하면, 

    태그적용이 되지 않고, 문자 그대로 출력됨.

    그러나 이 함수를 적용하면 줄바꿈 등 필요한 태그들도 다 날아감, 

    필요한 태그들을 살릴 수 있는 함수들도 존재

     

     

    그리고 이 코드에서 

     

    function print_list(){
      $list = scandir('./data');  
      $a = 0;
      while ($a < count($list)) {
        $title = htmlspecialchars($list[$a]);
        if($list[$a] != '.'){
          if($list[$a] != '..'){
            echo "<li><a href="index.php?id=$title\">$title</a></li>;
          }
        } $a = $a + 1;
      }
    }

     

    $title = htmlspecialchars($list[$a]); 

     

    $title은 결국 $list[$a] 함수인데, $a값이 while 문 에서 반복되면서 증가하게되고, 그 결과로 $list값이 바뀐다.

    그런데 이 줄이 while문 밖에 위치하게 된다면 $a값이 변경(증가)하지 못하고, $title에 대입된 값에 변경이 없게된다.

     

     

    10-2. 파일 경로 보호

    파일경로 보호

    https://youtu.be/t0qRL6BvkjE

     

    basename()

    : 파일의 경로에서 파일이름만을 추출해주는 함수.

    예를들어, url에 적혀있는 id값에 ../password.txt 라는 명령을 입력하면

    상위경로로 이동하여 password.txt 에 적혀있는 내용을 외부에서 읽어낼 수 있다.

    이때 위의 함수를 사용하면 ../ 이부분은 떼어버리고 password.txt 만 id값으로 인식, 

    파일의 경로를 보호할 수 있다.

     

    또,

    개발자도구에서 preserve log 옵션을 선택하면 

    어떻게 데이터를 주고 받는지 확인 할 수 있기 때문에 

    해킹의 용도로 사용할 수 있음.

    여기에서 어떤방식으로  파일을 삭제하는지 파악해 버리면

    ../ 기호를 사용해서 메인페이지인 index.php 파일을 삭제해 버릴 수도 있음.

    그렇기 때문에 delete_process.php파일에서는 삭제 가능한 폴더를 data폴더만으로 제한할 필요가 있다.

    이때에도 basement()함수를 사용하면 폴더경로를 이동할 수 없기 때문에
    조금 더 안정적인 운영이 가능하다.

     

     

     

     

     

     

     

     

     

     

     

     

     

    '2020 > <programing> <coding>' 카테고리의 다른 글

    Step 3-1. Server side language PHP chap 1.  (0) 2020.03.23
    step 2-2. database 언어 chap 2.  (0) 2020.03.21
    step 2-2. database 언어 chap 1.  (0) 2020.03.15
    step 2.  (0) 2020.03.13
    step 1.  (0) 2020.03.13

    댓글

Designed by Tistory.