Filtering : 사용자가 입력한 정보에서 문제가 될만한 것을 차단하는 것

Escaping : 저장되어 있는 정보를 사용자에게 표시할 때(출력) 문제가 될만한 것을 차단하는 것

 

 

Filtering

사용자가 입력하는 정보는 모두 불신해야 한다.

mysqli_real_escape_string( ) : 인자로 들어온 데이터 중에서 sql 공격 관련 기호들을 문자로 바꾸는 함수

=> SQL Injection 방어 가능 

SQL Injection문 시도
왼쪽은 mysqli_real_escape_string( )를 사용하지 않았을 때, 오른쪽은 사용하였을 때의 결과이다.

 

Escaping

오염된 데이터 출력을 막아야 한다.

htmlspecialchars( ) : HTML 특수 문자가 일반 문자로 인식되어 그대로 출력되도록 해주는 함수

=> XXS 방어 가능

& &
" "
' '
< &lt;
> &gt;

 

<?php
	echo '<script>alert("hi");</script>'; //1번
	echo htmlspecialchars('<script>alert("hi");</script>');//2번
?>

 

왼쪽부터 차례로 1번, 2번

1번의 경우는 대표적인 XXS 공격으로, hi라는 경고창이 뜨게 되지만

2번의 경우는 함수를 이용해 특수문자들을 문자열 그대로 출력하고 있다.

 

<!--사용 예시-->
...
$escaped_title  = htmlspecialchars($row['title']);
echo "<li><a href=\"index.php?id={$row['id']}\">{$escaped_title}</a></li>"
...

'WEB > PHP' 카테고리의 다른 글

PHP와 MySQL_연동 후 데이터 출력  (0) 2021.01.31
PHP와 MySQL 연동  (0) 2021.01.31
PHP & DATABASE  (0) 2021.01.30
form과 GET, POST  (0) 2021.01.29
PHP 문법 기초  (0) 2021.01.28

데이터베이스에서 가져온 데이터를 php에서 실행하고자 할 때, 
데이터베이스와 php는 서로 완전히 다른 기술이기 때문에 우리가 php라는 컴퓨터 언어를 통해서 그 데이터를 활용하기 위해서는 php 데이터 타입으로 전환하는 과정을 거쳐야 한다.

 

그 때 사용하는 api가 mysqli_fetch_... 들이다.

<!-- SELECT 문으로 하나의 행만 확인 -->
<?php
$conn = mysqli_connect('localhost','root','1111','mysqls');

$sql = "SELECT * FROM topic WHERE id=1";
$result = mysqli_query($conn, $sql);

$row = mysqli_fetch_array($result);
echo '<h1>'.$row['title'].'</h1>';
echo $row['description'];
?>

위 코드를 이해하기 위해 연관배열을 잠깐 언급하겠다.

 

 

현재 topic 테이블

$row = mysqli_fetch_array($result);
print_r($row);
echo $row[1]; 
echo $row['title']; 

mysqli_fetch_array($result) 는 result문이 가리키는 쿼리문의 결과를 하나씩 하나씩 배열로 리턴한다.

+) 더 이상 가져올 행이 없다면 NULL을 리턴한다.

 

따라서 $row 변수에는 php에 맞는 데이터 타입으로 전환된 배열이 들어가 있다.

 

실제 Array 배열을 출력

배열 = 키 값이 숫자, 연관배열 = 키 값이 문자

echo $row[1];  // MySQL =>데이터의 인덱스를 이용해서 데이터를 가져온다 : 배열
echo $row['title'];  // MySQL =>데이터의 컬럼의 이름을 이용해서 데이터를 가져온다 : 연관배열

 

 

우리는 해당 데이터의 배열의 인덱스를 하나하나 다 알 수 없기 때문에

연관배열 방법을 이용해서 원하는 데이터의 결과를 가져온 것이다.

echo '<h1>'.$row['title'].'</h1>';
echo $row['description'];

 

 

<!-- SELECT 문으로 모든 행 확인 -->
<?php
$conn = mysqli_connect('localhost','root','1111','mysqls');

$sql = "SELECT * FROM topic";
$result = mysqli_query($conn, $sql);

while($row = mysqli_fetch_array($result)){
  echo '<h1>'.$row['title'].'</h1>';
  echo $row['description'];
}
?>

while문을 활용해서 모든 행의 결과를 불러올 수 있다.

 

결과화면


+ PHP while문

<?php while(A)
B
C
?>

// A에 있는 코드는 무조건 실행. 그 결과가 true라면 B와 C를 순차적 실행. 더 이상 실행시킬 코드가 없으면 다시 A로 돌아감. 결과가 NULL(flase)라면 while문 종료

 

'WEB > PHP' 카테고리의 다른 글

보안  (0) 2021.01.31
PHP와 MySQL 연동  (0) 2021.01.31
PHP & DATABASE  (0) 2021.01.30
form과 GET, POST  (0) 2021.01.29
PHP 문법 기초  (0) 2021.01.28

PHP와 MySQL 연동 원리

MySQL 서버를 제어하기 위해선 MySQL 모니터가 필요했다.

 

대표적 MySQL Monitor

MySQL 모니터에서 sql문을 입력하면 MySQL 서버가 처리한 후 결과를 보여준다.

MySQL 모니터는 MySQL에 대해서 클라이언트인 셈이다.

(MySQL 클라이언트에는 Workbench, phpMyAdmin 등이 있다.)

 

이때, PHP 도 MySQL 서버에 대해서 클라이언트로서 동작이 가능하다. 

 

PHP와 MySQL 연동을 위해

php mysql api를 검색 후, 이후 진행되는 실습에서는 mysqli api 방식을 사용하기로 하였다.

 

<?php
$conn = mysqli_connect('localhost','root','1111','mysqls'); 
$sql = "INSERT INTO topic
    (title, description, created)
    VALUES(
      '{$_POST['title']}',
      '{$_POST['description']}',
      NOW()
    )";
$result = mysqli_query($conn,$sql);
    
if ($result === false){
  echo mysqli_error($conn);
  echo '저장하는 과정에서 문제가 생겼습니다. 관리자에게 문의해주세요';
  error_log(mysqli_error($conn)); 
} else {
  echo '성공했습니다.';
}

if(mysqli_connect_error()){
	printf("Connect failed: %s\n",mysqli_connect_error()); 
	exit();
};
?>


① $conn = mysqli_connect('localhost','root','1111','mysqls');

// 데이터베이스에 PHP 접속
//함수에 들어가는 인자 : 호스트(데이터베이스의 서버 주소), 사용자 네임, 비밀번호, 데이터베이스(스키마) 이름

 

② $sql = "INSERT INTO topic
    (title, description, created)
    VALUES(

      '{$_POST['title']}',
      '{$_POST['description']}',

       NOW()

     )

";

// sql 문 작성. html에서 POST 방식으로 작성할 것이기 때문에 $_POST['name'] 방식 사용

 

③ $result = mysqli_query($conn,$sql);
//mysqli_query( ): php가 클라이언트가 되어 데이터베이스 서버에 sql문 실행

//실패 시 false, 성공 시 객체 리턴

// 함수에 들어가는 인자 : (데이터베이스 접속 정보 변수, sql문)

 

④ if ($result === false){
  echo mysqli_error($conn);

// mysqli_error( ) :저장하는 과정에서 어떤 에러가 발생했는지 알려주는 함수

// 그러나 사용자에게 그대로 보여주면 보안 위협이 있으므로 아래와 같이 진행
  echo '저장하는 과정에서 문제가 생겼습니다. 관리자에게 문의해주세요';
  error_log(mysqli_error($conn)); //error_log( ): 아파치 error log 디렉토리에 에러사항이 기록됨
} else {
  echo '성공했습니다.';
}

 

⑤ if(mysqli_connect_error()){

printf("Connect failed: %s\n",mysqli_connect_error());

exit();

}; // 접속 에러일 때 사용하는 함수
?>

'WEB > PHP' 카테고리의 다른 글

보안  (0) 2021.01.31
PHP와 MySQL_연동 후 데이터 출력  (0) 2021.01.31
PHP & DATABASE  (0) 2021.01.30
form과 GET, POST  (0) 2021.01.29
PHP 문법 기초  (0) 2021.01.28

PHP & DATABASE 원리

 

데이터베이스가 갖는 '데이터를 효율적으로 관리할 수 있다'라는 장점과 이 갖는 '접근성'이라는 장점.

PHP의 '미들웨어'적 장점 등 이렇게 웹 서버, PHP, 데이터베이스 각각의 장점에 따라 역할을 분담하게 되는 것이다.

(PHP는 웹이라는 부품과 MySQL이라는 데이터베이스 부품을 붙이는 본드같은 기능을 한다.

따라서 이를 미들웨어 라고도 부른다.)

 

여기서 PHP는 웹 서버의 서버로서 동작하고, MySQL의 클라이언트로서 동작하고 있다는 것을 기억해야 한다.

 

'WEB > PHP' 카테고리의 다른 글

PHP와 MySQL_연동 후 데이터 출력  (0) 2021.01.31
PHP와 MySQL 연동  (0) 2021.01.31
form과 GET, POST  (0) 2021.01.29
PHP 문법 기초  (0) 2021.01.28
PHP의 이해  (0) 2021.01.28

<form>태그

:: 입력 양식 전체를 감싸는 태그

:: form은 컨트롤 요소로 구성된다.(컨트롤 요소: text, button, radio 등)

 

▷ name : form의 이름. 서버로 보내질 때 이름의 값으로 데이터 전송

▷ action : form이 전송되는 서버 url 또는 html 링크

 method : 전송 방법 설정. get은 default, post는 데이터를 url에 공개하지 않고 숨겨서 전송하는 방법

 autocomplete : 자동 완성. on으로 하면 form 전체에 자동 완성 허용

<form name="profile" action="/action_page.php" method="get" 
      autocomplete="on">
  <input type="text" name="id">
</form>

 

 

form.html

<form 태그는 사용자 입력정보를 URL 파라미터로 만들어 내는 기계>

:: submit이 속해있는 form 태그의 action 속성이 가리키는 URL로 웹 브라우저는 그 URL 뒤에 내용을 붙여 전해준다.

 

form.html에서 title과 contents에 데이터를 넣어서 form.php에 보내고 있다.

+ form 태그 내부에서 method를 지정하지 않으면 기본값은 GET 이다.

 

 

form.php

php는 data 디렉토리에 title 파일을 생성한다.

+ file_put_contents(디렉토리,내용) : 지정한 디렉토리에 입력한 내용이 담긴 파일을 만들어주는 함수이다.

+ 입력 내용을 $_GET[' '] 방식으로 받는 것도 주목

 

data 디렉토리 내부 구성
 GET 방식_내용 작성
form.php로 보내진 url

url을 확인해보면 title과 contetns에 어떤 내용이 담겼는지 알 수가 있다.

 

해당 파일 추가

파일 추가 기능이 잘 이루어졌다는 것도 확인할 수 있다.

 


이렇게 GET방식(url 파라미터를 통해서 서버 쪽에 데이터를 전송하는 것)은 북마크에서 사용하기 적합한 방식이다.

즉, 어떤 콘텐츠를 다른 사람에게 공유할 때 적합한 방식이다.

 

반대로 내용을 작성하여 url을 통해 데이터를 서버로 전송하는 방식은 이 주소를 공유했을 때 데이터가 추가돼버리는 등 여러 문제가 생긴다. (삭제, 수정의 경우도 마찬가지)

 

따라서 form에 데이터를 전송하는 하는 방식을 POST로 설정하여 url을 통하지 않고 해당 데이터를 은밀하게 서버로 전송해야 한다.

수정한 form.html
수정한 form.php

+ 입력 내용 $_POST[' '] 방식

 

수정한 form.html 페이지_내용 작성
form.php로 보내진 url

URL 부분이 깔끔하다!

 

form.php 확인

form.php의 네트워크 부분을 확인해보니

해당 내용이 우리가 볼 수 없는 방식으로 은밀히 전달된 것을 확인할 수 있다.

 

해당 파일 추가

 

'WEB > PHP' 카테고리의 다른 글

PHP와 MySQL_연동 후 데이터 출력  (0) 2021.01.31
PHP와 MySQL 연동  (0) 2021.01.31
PHP & DATABASE  (0) 2021.01.30
PHP 문법 기초  (0) 2021.01.28
PHP의 이해  (0) 2021.01.28

php의 기본이 되는 것들을 아주 간단하게 적어놓았다. 

 

Variable

:: 변수는 $로 표시

:: . 으로 연결

<?php  
$name="kkami"  
"hello".$name."good morning";
?>

 

Parameter

:: url의 입력값 전달은 ?

ex) http://127.0.0.1/parameter.php?name=kkami&address=서울

 

:: 전달받은 것을 화면에 출력하고자 할 땐 $_GET['변수명']로 출력

 <html>
 	<body>
    	안녕하세요. <?php echo $_GET['address'];?>에 사시는 <?php echo $_GET['name'];?>님
  	</body>
</html>

 

줄바꿈

:: 1. 문자열 안에 <br>태그 삽입

:: 2. nl2br( ) 함수 사용 (new line to br)

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <h1>newline</h1>
    <?php
    $str = "발 끝에 닿을 듯한 어둠에
            그림자마저 사라져
            등뒤로 도망가는 너란 해 Bye
            궤도를 벗어난 행성
            이별에 우린 부딪히려 해
            난 차라리 모든 걸 잊어버린
            너를 원해
            흐르는 별들 속에 헤매던 그때
            이뤄지지 않을 꿈안에 갇혀 Fly away
            빛을 건너 그 날의 널 볼 수 있다면
            지금 너와 난 영원을 속삭였을까
            Let me catch the light";
    echo $str;
    ?>
  </body>
</html>

가사 : 「하현상-3108」

이렇게 문자열을 입력했을 때 결과화면은 아래와 같다.

 

가사가 str변수 안에 입력한 대로 줄바꿈이 되기를 원한다.

 

<br>태그 이용

    $str = "발 끝에 닿을 듯한 어둠에<br>
            그림자마저 사라져<br>
            등뒤로 도망가는 너란 해 Bye<br>
            궤도를 벗어난 행성<br>
            이별에 우린 부딪히려 해<br>
            ....
            let me catch the light";

이런식으로 문자열 사이에 줄바꿈을 원하는 곳에 <br>태그를 입력하면 된다.

 

nl2br( ) 함수

     <?php
     echo nl2br($str);
     ?>

하지만 nl2br( ) 함수를 이용한다면? 

한꺼번에 개발자가 원하는대로 코드의 줄바꿈이 가능해진다.

 

'WEB > PHP' 카테고리의 다른 글

PHP와 MySQL_연동 후 데이터 출력  (0) 2021.01.31
PHP와 MySQL 연동  (0) 2021.01.31
PHP & DATABASE  (0) 2021.01.30
form과 GET, POST  (0) 2021.01.29
PHP의 이해  (0) 2021.01.28

PHP¹

:: PHP는 웹프로그래밍을 위한 높은 생산성을 제공하는 언어이다.(웹을 위해서 만들어졌고, 지금도 웹을 위해서 발전하고 있는 웹을 위한 언어)

:: 서버 측에서 실행되는 프로그래밍 언어로 HTML을 프로그래밍적으로 생성해주고, 데이터베이스와 상호작용 하면서 데이터를 저장하고, 표현한다.

+) 특히 서버에 직접 설치해서 운영할 수 있는 설치형 웹에플리케이션(제로보드, 텍스트큐브, 워드프래스, PHPBB등)의 과반이 PHP로 만들어졌다.

 

PHP 이용 시 웹 페이지를 자동으로 생성할 수 있다.

사이트의 운영자가 컨텐츠의 내용을 작성해서 PHP에게 넘기면 PHP는 사용자 대신에 컨텐츠를 html으로 만들어준다.

 

PHP의 원리

웹 브라우저 상에서 html 문서를 요청하면 웹 서버는 자신이 가지고 있던 html 파일을 그대로 보여준다.(정적)

그러나 php 문서를 요청하면 웹 서버는 이 요청을 php 에 위임하고 php가 html 파일을 생성한 후, 웹 서버가 이를 보여준다.(동적)

 

 

 

 

 

 

(¹출처: opentutorials.org/index.php/course/62)

'WEB > PHP' 카테고리의 다른 글

PHP와 MySQL_연동 후 데이터 출력  (0) 2021.01.31
PHP와 MySQL 연동  (0) 2021.01.31
PHP & DATABASE  (0) 2021.01.30
form과 GET, POST  (0) 2021.01.29
PHP 문법 기초  (0) 2021.01.28

+ Recent posts