웹해킹 1주차 PHP
<!doctype html>
<html>
<body>
<h1>Number & Operator</h1>
<h2>1+1</h2>
<?php
echo 1+1;
?>
<h2>2-1</h2>
<?php
echo 2-1;
?>
<h2>2*2</h2>
<?php
echo 2*2;
?>
<h2>4/2</h2>
<?php
echo 4/2;
?>
</body>
</html>
php 코드는 사이에 들어와야 한다.
echo 는 뒤에 있는 것을 출력하는 역할을 한다. echo와 같은 역할을 하는 print는 print(1)과 같이 괄호 안의 것을 출력한다.
php 코드는 한 명령문이 끝날때마다 새미콜론(;)을 붙여주어야 한다!
<?php
echo 'Hello world';
?>
위에서 숫자를 출력한 방법과 비슷하게 echo 뒤에 ""쌍 따옴표나 ''작은 따옴표 사이에 문자열을 넣어 출력할 수 있다.
<?php
echo "Hello "."world";
?>
. 쩜!
이 코드는 "Hello" "World" 이렇게 2개로 나뉘어져 있다. 그 사이를 닷 . 으로 잇고 있다. 위의 코드를 실행해보면 한 문자열로 출력이 된다.
.은 두 문자열을 잇는 역할을 한다.
<?php
echo strlen("Hello world");
?>
strlen strlen 함수는 괄호 안의 문자열의 길이를 반환하는 함수다.
<?php
$a = 1;
echo $a+1;
?>
<?php
$name="Guntak";
echo "Lorem ipsum dolor sit, amet consectetur
adipisicing elit.".$name. "Porro iste sed doloribus similique.
Qui reprehenderit quibusdam" .$name. "ration
magnam voluptate assumenda optio quae aliquid
saepe explicabo dignissimos repudiandae, enim, repellat ipsa.";
?>
*변수 * 변수 이름은 앞에 $을 붙이는게 특징이다.
echo로 문자열 사이사이 .를 이용해 내 이름이 저장된 변수 $name을 추가해보았다.
안녕하세요.<?php echo $_GET['address']; ?>에 사시는<?php echo $_GET['name']; ?>님
"127.0.0.1:8080?name=guntak&address=seoul"처럼 주소 뒤에 물음표?를 붙이고 각 변수 값을 써주면 $_GET['변수이름']이 그 값을 반환한다.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>WEB</h1>
<ol>
<li><a href="index.php?id=HTML"HTML</li>
<li><a href="index.php?id=CSS"CSS</li>
<li><a href="index.php?id=JavaScript"JavaScript</li>
</ol>
<h2>
<?php echo $_GET['id'];
?>
</h2>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Cupiditate sapiente alias hic adipisci aliquam, rem consectetur numquam quia quaerat consequuntur, dicta culpa ut voluptatibus, laudantium asperiores ullam eos voluptatem vero?
</body>
</html>
HTML,CSS,JavaScript를 누를때마다 주소 뒤 ? 뒤에 있는 id값만 바뀐다. 그리고 그 id 값을 h2태그 속에서 출력한다.
<?php
$str= "Lorem ipsum dolor sit amet consectetur adipisicing elit.
Debitis veniam vel, ipsa repellendus, sint consequuntur provident voluptatem soluta accusantium corporis cupiditate cumque neque harum repellat, odit consequatur numquam quod delectus.";
echo strlen($str);
echo nl2br($str);
?>
nl2br 그냥 $str을 echo로 출력하게 되면 $str의 문자열은 위 코드에 있는 공백 없이 출력이 된다. 그에 반해 nl2br함수의 괄호에 변수를 넣어주면 공백을 유지해 출력하게 해준다.
echo file_get_contents("data/".$_GET['id']);
file_get_contents 주어진 주소의 파일을 읽어 반환하는 함수다. 위의 코드에서 file_get_contents함수를 사용하여 그 파일을 출력하는 함수를 구현했다.
<?php
var_dump(11);
var_dump('11');
var_dump(1==1);
?>
var_dump 괄호 안의 숫자나 문자열을 출력함과 동시에 자료형까지 출력. var_dump(1==1)은 boolean true를 반환.
boolean형은 참과 거짓을 나타냄.
<?php
echo '1<br>';
if(false){
echo '2<br>';
}
else{
echo '3<br>';
}
?>
*조건문 if&else * 다른 언어에서 봐왔던 문법 구조다. if의 괄호 안에 표현식이 들어가고 그 표현식이 true이냐 false냐에 따라서 중괄호{}안의 코드를 실행하게 된다. 만약 if 표현식이 false라면 그 뒤의 else의 중괄호 안의 코드가 실행이 된다.
<?php
echo '1<br>';
$i=0;
while($i<3) {
echo '2<br>';
$i=$i+1;
}
echo '3<br>';
?>
while while문은 괄호 안에 표현식이 들어가고 중괄호 안에 실행할 코드가 들어가는 구조로 if와 같다.위의 코드에서는 $i=0으로 선언하고 while문이 한 번 실행될때마다 1씩 더해 $i=3이 될때 더이상 중괄호 안의 코드인 echo '2
'이 실행되지 않는다.
<?php
$coworkers=array('egoing', ' leezche');
echo $coworkers[1];
var_dump(count($coworkers));
array_push($coworkers, "graphittie");
var_dump($coworkers);
?>
*Array *배열이다. 변수 선언하고 거기에 array() 괄호 안에 배열에 대입할 데이터를 작성해주면 그 데이터를 갖고있는 배열이 생성된다.
그 데이터에 접근하는 방법은 변수 이름 뒤에 [] 대괄호를 붙이고 그 안에 원하는 데이터의 순서를 넣어주면 된다. 숫자는 0부터 시작이다.
*array_push *배열 뒤에 데이터를 더 추가하고 싶을때 사용하는 함수. 인자로 데이터를 추가로 받을 배열 이름을 주고 그 다음으로 줄 데이터를 작성하면 된다.
<?php
<ol>
$list=scandir('./data');
$i=0;
while($i<count($list)){
if($list[$i]!='.'){
if($list[$i]!='..'){
echo "<li><a
href=\"index.php?id=$list[$i]\">$list[$i]</a> </li>\n";
}}
$i=$i+1;
}
/*
echo "<li>$list[0] </li>\n";
echo "<li>$list[1] </li>\n";
echo "<li>$list[2] </li>\n";
echo "<li>$list[3] </li>\n";
echo "<li>$list[4] </li>\n";
*/
?>
</ol>
*scandir *주어진 주소의 파일 이름을 반환하는 함수다. 위의 코드에서는 $list라는 배열에 하나하나 저장되게 되낟.
count 배열의 데이터의 갯수를 세고 반환하는 함수다.
위의 코드는 data폴더에 있는 파일들의 이름을 $list라는 배열에 모두 저장하고, 그 배열의 데이터 갯수를 이용해 while 함수를 돌리며 출력한다. 그 과정에서 파일명이 .이거나 ..인 파일은 if문을 이용해 제외시킨다.
<?php
function basic(){
print("Lorem ipsum dolor1<br>");
print("Lorem ipsum dolor2<br>");
}
basic();
?>
<?php
function sum($left, $right){
print($left+$right);
print("<br");
}
sum(2,4);
sum(4,6);
?>
*함수 *function function_name(){ } 이 함수 정의의 기본적인 틀이다. 위의 함수는 매개변수 없이 두 개의 문장을 출력하는 함수이고, 밑의 함수는 $left와 $right라는 매개변수를 전달받아 그 합을 출력하는 함수다.
<?php
function sum($left, $right){
return $left+$right;
}
printf(sum(2,4)) ;
file_put_contents('file.txt', sum(4,6));
?>
방금 전 만들었던 함수 sum을 자체 출력이 아닌 값을 반환하는 방식으로 바꿔보았다. 반환할때는 return!
<!DOCTYPE html>
<html>
<body>
<form action="form.php" method="post">
<input type="text" name="title" placeholder="Title">
<textarea name="description" id="" cols="30" rows="10"></textarea>
<input type="submit">
</form>
</body>
</html>
<?php
file_put_contents('data/'.POST['title'], $_POST['description']);
echo "<p>title : ".$_GET['title']."</p>";
echo "<p>description : ".$_GET['description']."</p>";
?>
form 하나의 형식을 만들어주는 태그다. 연결시킬 php의 주소를 입력하는 속성과 정보 전달 방식을 선택할 수 있다.
input 정보를 입력할 수 있는 공간을 만들어주는 태그다.주어지는 속성값에 따라 버튼형식, 텍스트 형식 등등 여러가지 형태로도 가능하다.
input의 속성 중 하나인 name 속성의 값이 그 정보의 이름이 되어 나중에 php에서 그 정보를 이용할때 name 값으로 사용하게 된다.
POST 이전의 예제들에서 정보를 php파일로 전달을 했을때 url에 그대로 그 정보가 드러났었다. 이렇게 되면 정보보안에 엄청난 구멍이 생기기 때문에 이를 막기 위한 정보 전달 방식이다. form 태그에서 속성값으로 method 라고 있는데, 따로 이 값을 주지 않으면 POST가 아닌 GET 방식이 되기 때문에 url에 그대로 정보가 드러난다. 이를 막기 위해서는 method 값으로 POST를 주면 된다.
<글생성>
<a href="create.php">create</a>
index.php에 create라는 단어를 누르면 create.php를 실행하도록 링크를 달아놨다.
<form action="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.php는 전신은 index.php와 거의 같고 위의 코드만 추가됐다. form 태그로 input 태그와 textarea 태그를 묶고 제출 버튼까지 묶어놓았다. submit 버튼을 눌면 create_process.php 파일이 실행된다.
<?php
file_put_contents('./data/'.$_POST['title'], $_POST['description']);
header('Location:/index.php?id='.$_POST['title']);
?>
create_process파일이다. create.php 파일에서 각각 title, description 이라는 이름으로 POST방식으로 전해진 정보를 기반으로 파일을 만든다. 그리고 header를 이용해 id=$_POST['title']의 index.php로 이동해 방금 입력한 정보의 사이트로 이동하게 해준다.
header는 redirection 기능을 하는 함수로 php 파일이 실행되고 나서 어떤 파일을 열것인지를 선택할 수 있다.
<글 수정>
<?php if(isset($_GET['id'])) {?>
<a href="update.php?id=<?php echo $_GET['id']; ?>">update</a>
<?php }
?>
업데이트를 하려면 기존의 파일이 존재해야 한다. 그래서 index.php에서 id 값이 있는 상태에서만 update 버튼이 뜨도록 한다. 그리고 update.php에서 어떤 파일을 수정하려고 하는지에 대한 정보가 필요하기에 그 값을 id로 준다.
<form action="update_process.php", method="post">
<input type="hidden" name="old_title" value="<?php echo $_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>
앞서 글 생성 기능 구현할때 사용했던 form 태그를 재활용했다. 달라진 점은 update_process.php에서 사용할 rename 함수는 수정 전 파일의 이름과 수정 후 원하는 파일 이름, 이 2개를 인자로 전달해야 하는데, 수정 전 파일 이름을 update_process.php에서 사용할 수 없었기에 hidden 타입의 input 태그로 $_GET['id'] 값을 따로 주었다.
<?php
rename('data/'.$_POST['old_title'],'data/'.$_POST['title']);
file_put_contents('data/'.$_POST['title'], $_POST['description']);
?>
update_process.php의 코드다. rename 함수를 사용하여 old_title을 title로 바꿔주었다.
file_put_contents 함수를 사용하여 첫번째 인자에 파일 이름, 두번째 인자로 파일 내용을 주어 파일을 업데이트 한다.
<글 삭제>
<a href="delete_process.php?id=<?php echo $_GET['id']; ?>">delete</a>
위와 같이 글 수정과 같은 방식으로 링크로 삭제를 구현하면 문제가 발생한다. 그 링크를 다른 사람에게 공유를 하고 그 사람이 그 링크를 누르면 파일이 아무 문제없이 삭제가 되는 것이다. 그렇기에 아래의 방법으로 삭제를 구현한다.
<form action="delete_process.php" method="post">
<input type="hidden" name="id" value="<?=$_GET['id']?>">
<input type="submit" value="delete">
</form>
위와 같이 hidden 타입의 input 태그로 id 값을 전송한다.
submit 타입의 input 태그에서 value 속성은 버튼에 써있는 값이 된당.
삭제는 따로 글을 입력하거나 이럴 필요가 없기 때문에 delete_process.php로 바로 넘어가게 된다.
<?php
unlink('data/'.$_POST['id']);
header('Location: /index.php');
?>
delete_process.php의 코드다.
unlink라는 파일 삭제 함수를 이용해 파일을 삭제하고 header를 사용해 사이트의 홈으로 돌아온다.
<?php
function print_title(){
if(isset($_GET['id'])){
echo $_GET['id'];
}
else{
echo 'Welcome!';
}
}
function print_description(){
echo file_get_contents("data/".$_GET['id']);
}
function print_list(){
$list=scandir('./data');
$i=0;
while($i<count($list)){
if($list[$i]!='.'){
if($list[$i]!='..'){
echo "<li><a
href=\"index.php?id=$list[$i]\">$list[$i]</a> </li>\n";
}}
$i=$i+1;
}
}
?>
<?php
require('lib/print.php');
?>
첫번째 코드는 index.php부터 시작해서 update.php까지 모든 코드에 중복으로 들어있던 부분을 lib라는 폴더 속 print.php에 잘라서 붙여넣은 것이다. 이렇게 하고 밑의 코드처럼 require(php주소)를 index.php부터 update.php까지 다 붙여넣어주면 그 파일 속에서는 print.php에 정의된 함수를 사용할 수 있다!!
끄으으으ㅡ으으으으으ㅡ으으으ㅡ으으으으틑
댓글
이 글 공유하기
다른 글
-
지옥방 스터디 포너블
지옥방 스터디 포너블
2020.04.09 -
지옥방 웹해킹 1주차 과제
지옥방 웹해킹 1주차 과제
2020.03.30 -
웹해킹 1주차 WEB&Internet
웹해킹 1주차 WEB&Internet
2020.03.30 -
지옥방 포너블 1주차 과제
지옥방 포너블 1주차 과제
2020.03.30