SQL문에서 union 처리... 채택완료
common.lib.php 파일에 sql_query함수를 보면
</strong></p><p>$sql = preg_replace("#^select.*from.*union.*#i", "select 1", $sql);</p><p><strong>
위처럼 union의 사용을 허락하지 않습니다.
그런데, union 이라는 회사, 혹은 제품명이 들어가는 쿼리를 실행할 경우...문제가 되네요...
제품명이 unionpay001 이라고 할 경우도 쿼리가 실행이 되지 않습니다.
그렇다면...정규식을 수정해서 select from union까지 체크하는것을 select.*from.*union.*select.* 이런식으로
처리하면 union이라는 쿼리를 실행하게 되지만...보안상 헛점이 생길까요...?
어차피 union이라는 키워드를 삽입해서 공격할 것이라면 select가 뒤에 반드시 와야 겠죠?
그러니깐 union뒤에 select가 없으면 쿼리를 통과시켜도 괜찮을까요?
답변 1개
저방법도 괜찮겠습니다만 테이블명에 union이 들어가는경우(예: bo_table=union) 서브쿼리가 있는 경우에 다시 문제가 생기겠군요.
union조인을 하려면 어쨌든 union 키워드 앞뒤로 공백이 들어가야 할테니 아래처럼 하는건 어떨까요.
$sql = preg_replace("#^select.*from.*\sunion\s.*#i", "select 1", $sql);
저도 보안헛점에 대해서는 자신이 없네요. 아무래도 버그레포팅을 해두시는게 좋을듯 합니다.
답변에 대한 댓글 1개
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인