mysql 프로그램에서는 되는 쿼리가 sql_query()로는 작동하지 않음.
group.php에 piree 투표들에 대해서 카테고리를 합쳐서 보여주기 위해 아래와 같은 코드를
작성했습니다. 쿼리문은 $sql, $sql2 두 개를 썼는데 $sql은 작동하는데 $sql2는 작동하지 않습니다.
$sql = " select distinct avl_bo_table from g5__piree_770015_vote_list"; //echo "이야야아아아!!
"; $result= sql_query($sql); $sql = "select * from ("; while($rowss = sql_fetch_array($result)){ //print_r($rowss); $sql .=" select a.*,b.ca_name from `g5__piree_770015_vote_list` as a left join"; $sql .=" `g5_write_{$rowss['avl_bo_table']}` as b on (a.avl_wr_id= b.wr_id)"; $sql .=" where ca_name is not null and ca_name !=''"; $sql .=" union all "; } $sql = substr($sql, 0, -10 ); //맨마지막에 붙는 union all 삭제. $sql .= ")"; if($stx!=''){ $sql .= " where INSTR(LOWER(avl_title_s), LOWER('$stx'))"; } $sql .=" as t order by ca_name, avl_n desc"; $sql2 = $sql; /*SELECT * FROM ( SELECT avl_n, avl_bo_table,avl_wr_id,ca_name,avl_title_s FROM g5__piree_770015_vote_list AS a LEFT JOIN g5_write_free_board4 AS b ON (a.avl_wr_id = b.wr_id AND avl_bo_table = 'free_board4') WHERE ca_name IS NOT NULL AND ca_name != '' UNION ALL SELECT avl_n, avl_bo_table,avl_wr_id,ca_name,avl_title_s FROM g5__piree_770015_vote_list AS a LEFT JOIN g5_write_free_board5 AS b ON (a.avl_wr_id = b.wr_id AND avl_bo_table = 'free_board5') WHERE ca_name IS NOT NULL AND ca_name != '' ) AS t ORDER BY ca_name*/ $result2 = sql_query($sql2);print_r($result2);
쿼리문 sql2를 다른 sql 프로그램(sqlyog 사용중입니다)에서는 정상적으로 결과를 출력하는데
group.php 내부에서는 $sql에 의한 쿼리 결과 $result만 정상적으로 받아지고,
$sql2에 의한 쿼리결과 $result2에는 print_r로 출력시
mysqli_result Object ( [current_field] => 0 [field_count] => 1 [lengths] => [num_rows] => 1 [type] => 0 )
이와 같은 결과만 나옵니다.
어떻게 해야할까요 조언 부탁드립니다.
답변 3개
^^ union은 막았구나... 처음 알았네요..
sql_query 이거 사용말고 별도로 sql 작업하면 되겠네요..
댓글을 작성하려면 로그인이 필요합니다.
lib/common.lib.php 파일의 1470번째줄쯤의 function sql_query에서 union 사용허락하지 않습니다
하는 부분 주석.
function sql_query($sql, $error=G5_DISPLAY_SQL_ERROR, $link=null){ global $g5; if(!$link) $link = $g5['connect_db']; // Blind SQL Injection 취약점 해결 $sql = trim($sql); // union의 사용을 허락하지 않습니다. //$sql = preg_replace("#^select.*from.*union.*#i", "select 1", $sql); //이 줄 아래의 문장을 아래와 같이 주석처리하면 됩니다. //$sql = preg_replace("#^select.*from.*[\s\(]+union[\s\)]+.*#i ", "select 1", $sql); // `information_schema` DB로의 접근을 허락하지 않습니다. $sql = preg_replace("#^select.*from.*where.*`?information_schema`?.*#i", "select 1", $sql);
댓글을 작성하려면 로그인이 필요합니다.
/lib/common.lib.php 파일 열어서
function sql_query(~~~
이렇게 된 거 찾아 보시면 union의 사용을 허락하지 않습니다라고 되어 있습니다.
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인