# 개행

이번에 살펴볼 내용은 WAS에 작성해둔 구문에 개행이 포함되는 경우이다.

이때 개행이 무엇인지 간단히 말하자면, 다른 말로는 **줄 바꿈**

SQL 내에서는 사용자가 <mark style="background-color:blue;">**주석을 사용하지 못하도록 하는 장치**</mark> 라고 표현할 수 있을 듯하다.&#x20;

지금까지 작성해온 Query와는 달리 개행이 포함되면 말 그대로 Query 내에 줄 바꿈이 일어난다.

```
> SELECT * FROM member WHERE id='___' and pass='___'

> SELECT * FROM member WHERE id='___' and 
    pass='___'
```

사실 "엔터 한 번 누른 거 가지고 뭐가 그리 달라지겠어?" 싶지만&#x20;

Query가 실행된 결과를 보면 생각이 달라질 것이다..!!

```
...
$sql = "select * from member where id='$user' and 
    pass='$pass'";
$result = mysqli_query($conn, $sql);
$row = mysqli_num_rows($result);
...
```

개행이 포함된 Query를 미리 서버에 구현해두고 로그인 우회를 시도해보자.&#x20;

<figure><img src="https://2282699300-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEAnXhlSDUbsvwZc1efw5%2Fuploads%2Ft84QYyO9FzJBjnjQ17NP%2FSQL_7.png?alt=media&#x26;token=710a542a-283d-4bff-aa91-5f9df5d9b1a2" alt=""><figcaption></figcaption></figure>

간단하게 주석 처리 해버리면 끝이겠지\~ 라는 마음으로 엔터를 누르게 되면&#x20;

<figure><img src="https://2282699300-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FEAnXhlSDUbsvwZc1efw5%2Fuploads%2FNR20issGOSzT3jsg1XuZ%2FSQL_8.png?alt=media&#x26;token=b70ca1df-02b5-42fe-b8bc-7210aa69f5ce" alt=""><figcaption></figcaption></figure>

:astonished::astonished::astonished:&#x20;

나오라는 결과는 안 나오고 에러가 뜬다.&#x20;

에러 내용을 한 마디로 요약하자면&#x20;

**pass='hanhxx1234' 즈음 어딘가 문법 에러 있음^^** 이라는 소리인데&#x20;

```
ID : hanhxx' #
PASS : hanhxx1234

> SELECT * FROM member WHERE id='hanhxx'#' and 
    pass='hanhxx1234'
```

사용자가 입력한 값을 대입해 Query를 생각해보면 일단 혼자 남아 도는 따옴표가 하나 있고&#x20;

주석으로 뒷 내용이 무효화된다고 치면 개행으로 인해 <mark style="background-color:blue;">**and만 사라지게 된다.**</mark>&#x20;

결과적으로&#x20;

```
SELECT * FROM member WHERE id='hanhxx' pass='hanhxx1234'
```

와 같은 Query가 만들어지게 되기 때문에 에러가 나는 것!

따라서 이런 경우에는 사용자가 SQL injection을 수행하기 위해 사용하는 주석을

막을 수 있게 되는 것이다.

그렇다면 반대로, 주석이 막혀버린 상황에서 로그인을 우회할 수 있는 방법은 없는 걸까?? :face\_with\_monocle:
