ping vs telnet

Ping과 Telnet


네트워크가 살아있는지 체크하기 위해 ping과 telnet을 자주 쓰는데 어떻게 다른지 자세히 살펴보자.


Ping

Ping은 포트를 지정하지 않고 인터넷 연결만 체크한다.
DDOS 공격에 이용되기도 해서 ping을 막기도 한다.

ping 설정 (Window 기준)
Window 방화벽 -> 고급 -> ICMP 설정

ICMP는 호스트 간 메세지를 주고받기 위한 프로토콜로 OSI 7계층 중 3번째 network 계층


Telnet

기본적으로 23번 포트를 사용한다.

특정 서버에서 서비스가 살아있는지 여부를 체크하는 방법으로 사용하고, 평문으로 전달된다. 보통 원격서버와 접속하기 위해 많이 사용된다.

암호화 되지 않은 평문을 그대로 보내기에 보안상 취약점을 가지고 있다.
(중간에서 데이터를 가로채는 네트워크 스니핑을 당할 경우 데이터가 고스란히 노출)

이 때문에 데이터를 암호화해서 보내는 SSH(Secure Shell)이 요즘 많이 쓰인다.


경험

보안이 철저한 네트워크에 접속을 해야하는 일이 있었는데, DB 접속 시 시간이 초과하여 접속이 이루어지지 않은 문제를 겪었다. 이 때, Oralce 내부 문제인지 알고 여러번 지웠다가 깔면서 생고생한 경험이 있었는데, 다른 선배분이 이럴 때는 네트워크 접속이 제대로 이루어지는지 알아보는게 먼저라고 Ping을 이용해 해당 네트워크와 접속을 체크해 보았다. Ping을 통해 네트워크가 연결되지 않음을 확인했고, Oracle 문제가 아니라 내 PC에서의 접속이 서버측 방화벽에서 막히는 것을 알았다. 그래서 방화벽 해지를 요청하여 DB에 접속할 수 있었다.

WHERE절 1=1, 1=2의 의미

WHERE절 1=1, 1=2의 의미


ibatis를 이용한 동적쿼리를 보면 where절에 1=1, 1=2라는 조건이 자주 보인다.

그전에도 가끔 본 조건이지만 쿼리를 제대로 분석해보고자 마음 먹었기에 1=1과 1=2라는 조건을 자세히 살펴보고자 한다.



WHERE 1=1

SELECT *

FROM tb_test

WHERE 1=1

   <isEqual prepand='AND' property='first' compareValue='1'>

   first_col = '1'

   </isEqual>

   <isEqual prepand='AND' property='second' compareVale='2'>

   second_col = '2'

   </isEqual>

ibatis의 을 이용해 파라미터가 특정값이면 조건을 추가시키는 동적쿼리이다. 파라미터의 값이 특정값과 일치하면 where조건이 추가되고 조건이 모두 맞지않으면 전체를 조회하는 쿼리문이다.



만약 여기서 1=1이 없다면?

  SELECT *

  FROM tb_test

  WHERE

이런 쿼리문이 작성될 것이고, ORA-00936이라는 missing expression 에러가 나게될 것이다.

이렇듯 ibatis를 이용해 WHERE절에 조건을 추가할 때 1=1은 유용할 수 있다.



WHERE 1=2

이번에 WHERE절에 1=2가 어떻게 쓰이는지 살표보자

SELECT *

FROM tb_test

WHERE 1=1

	<isEqual prepand='AND' property='first' compareValue='1'>

        1=2
        </isEqual>

        <isEqual prepand='AND' property='second compareValue='2'>
        second_col = '2'
        </isEqual>

이 동적쿼리문은 first값이 1로 들어오면

(생략)

WHERE 1=1 AND 1=2

이런 조건으로 쿼리문이 실행되면서 false이므로 아무것도 조회하지 못하게 됩니다.

1=2를 이용하면 특정 값을 전달 받을 때, 아무 결과도 가져오지 못하게 할 수 있습니다.



무조건 좋기만 할까?

하지만 이런 1=1을 남발하는 것은 특히 UPDATE, INSERT, DELETE와 같은 데이터의

입출력을 가능케하는 문장에서는 위험할 수 있다.

DELETE FROM tb_test

WHERE 1=1

	<isEqual prepand='AND' property='first' compareValue='1'>

	first_col = '1'

        </isEqual>

이 동적쿼리에 first값이 1로 넘어온다면,

DELETE FROM tb_tes

WHERE 1=1

테이블의 모든 데이터가 삭제될 것이다.

그렇기에 1=1, 1=2를 INSERT, DELETE, UPDATE 등에 쓸 때는 한 번 더 생각해보는 것이 중요한 것 같다.

하지만 ibatis말고 mybatis를 쓴다면 <WHERE> 라는 태그를 이용해 동적쿼리가
반환하는 조건이 있다면 첫 번쨰 리턴된 조건의 AND나 OR를 자동으로 trim하여 쿼리문을 동작하게 할 수 있다.


참고 : http://jdm.kr/blog/7

'SQL' 카테고리의 다른 글

JOIN에서 ON절과 WHERE절의 차이  (0) 2017.08.16

JOIN에서 ON절과 WHERE절의 차이

 

같은 조건이라도 JOIN할 때 ON절에 조건을 넣을 때와 WHERE절에 조건을 넣을 때

쿼리 결과는 다르다. 어떻게 다른지 두 테이블을 살펴보자.

 

1) SELECT *

    FROM employee a

    LEFT OUTER JOIN department b

    ON a.department_no = b.department_no

    WHERE b.location = 'korea';

 

2) SELECT *

    FROM employee a

    LEFT OUTER JOIN department b

    ON a.department_no = b.department_no

       AND b.location = 'korea';

 

1)의 경우에는 employee테이블과 department 테이블이 outer join을 한 후

location이 korea인 값들만 추출한다.

 

2)의 경우에는 department 테이블에서 location이 korea인 값만 employee 테이블과 조인한다.

 

따라서 결과는

1)에는 location이 korea인 값만 존재하지만

2)에서는 location이 korea가 아닌 값도 존재하게된다.

 

 

employee 테이블                                  

employee_id 

 department_no

 1000

 10

 1001

 10

 1002

 20

 

 

department 테이블

 department_no

location 

 10

 korea

 20

 usa

 

 

1)    1000, 10, korea

       1001, 10, korea

 

2)    1000, 10, korea

       1001, 10, korea

       1002, 20, null

 

 

 

2)의 쿼리를 풀어서 다른 방식으로 써보면

 

3) SELECT *

    FROM employee a

    LEFT OUTER JOIN ( SELECT *

                              FROM department

                              where location = 'korea' ) b

    ON a.department_no = b.department_no;

 

3)과 같다.

 

출처 : http://blog.leocat.kr/notes/2017/07/28/sql-join-on-vs-where

*해당 출처를 참고하여 작성한 글입니다.

'SQL' 카테고리의 다른 글

[SQL]ibatis에서 where 1=1과 1=2  (0) 2017.08.20

+ Recent posts