mysql 프로그램에서는 되는 쿼리가 sql_query()로는 작동하지 않음.
본문
group.php에 piree 투표들에 대해서 카테고리를 합쳐서 보여주기 위해 아래와 같은 코드를
작성했습니다. 쿼리문은 $sql, $sql2 두 개를 썼는데 $sql은 작동하는데 $sql2는 작동하지 않습니다.
$sql = " select distinct avl_bo_table from g5__piree_770015_vote_list";
//echo "이야야아아아!!<br/>";
$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
/lib/common.lib.php 파일 열어서
function sql_query(~~~
이렇게 된 거 찾아 보시면 union의 사용을 허락하지 않습니다라고 되어 있습니다.
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);
^^ union은 막았구나... 처음 알았네요..
sql_query 이거 사용말고 별도로 sql 작업하면 되겠네요..
답변을 작성하시기 전에 로그인 해주세요.