< 문제 해결 >
- php 코드 -
<?php
$db = dbconnect();
if($_POST['id']){
$_POST['id'] = str_replace("\\","",$_POST['id']);
$_POST['id'] = str_replace("'","''",$_POST['id']);
$_POST['id'] = substr($_POST['id'],0,15);
$result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
if($result[0] == 1){
solve(39);
}
}
?>
id의 전달 값 부분을 보면 '(쿼리)가 닫혀 있지 않는 것을 볼 수 있다. 해당 쿼리( ' )를 써, id 인자 값을 무사히 전달하기 위해 POST 입력 값의 마지막에 ' ( 쿼리 )를 입력해 str_replace 함수를 우회함과 동시에 문제를 해결할 수 있게 된다.
아래는 db 서버에서 sql 구문을 사용한 예시
그림4에서 where 조건절의 칼럼값 user_login과 'guest1 <공백>'이 같다 하고 있으며, 이는 참이 되어 1이 select 되는 것을 볼 수 있다. 이는 뒤에 공백이 존재해도, 데이터베이스가 레코드 값에 guest1과 매치되는지 검색하기 때문이다.
그림 5는 앞에 공백이 존재하는 경우이다. 이 때는 데이터베이스가 해당 값과 매치되는 레코드를 찾지 못한다.
그림 6에서 앞의 공백을 입력 값에 주었을 때, 매칭되는 값이 없어 solved 되지 않는 것을 보았다.
한줄 평 : DB...뭐가 문제일까?
< 참고 >