2011-11-03 3 views
3

나는 다음과 같은 쿼리를 만드는 중이라서 :변수 열 이름을 사용하여 SQL 쿼리를 만드는 방법은 무엇입니까?

$b1 = $_REQUEST['code'].'A'; //letter 'A' is concatenated to $_REQUEST['code'] 
$a = $_REQUEST['num']; 
echo $b1.$a; 
$sql = "SELECT '".$b1."' FROM student_record1 WHERE id=".$a; 
$result = mysql_query($sql); 
if(!$result) 
{ 
    echo '<p id="signup">Something went wrong.</p>'; 
} 
else 
{ 
    $str = $row[0] 
    echo $str; 
} 

여기 $b1$a 다른 페이지에서 값을 얻고있다. 세 번째 줄의 'echo'는 정확한 결과를 제공합니다. 그리고 SQL에서 오류가 발생하지 않습니다. 대신 SQL 쿼리에서 결과를 얻지 못했습니다. 나는 마지막 줄에 에코를 뜻한다.

+0

'$ sql'에 포함 된 것을 출력 해 보셨습니까? 위 참조. – sberry

답변

3

이렇게하지 않으면 관계형 모델이 손상되어 안전하지 않습니다. 대신 열 ID, columnA, columnB, columnC, columnD, columnE있는 테이블을 구비하고, 사용자가 그 열을 집어 A/B/C/D/E을 선택 갖는

는 3 열 ID, TYPE, columnTYPEA/B/C/D/E 될 가지고있는 테이블을 가지고 . 이렇게하면 테이블을 수정하지 않고 나중에 F/G/H/I을 쉽게 추가 할 수 있습니다.

두 번째로 추가 열 접근 방식을 사용하면 SQL과 같은 입력 값을 작성할 필요가 없습니다. 준비된 문을 사용할 수 있으며 SQL 삽입으로 안전합니다. 필터링되지 않은 문자열에서 SQL을 작성하는 것은 잘못되어 매우 위험합니다. 으로 해킹 당할 수 있습니다.

+0

이 사이트의 희귀 한 게스트 - 현명한 대답입니다. –

+0

훨씬 강력한 솔루션입니다. +1 선생님이나 부인에게 – Phil

+0

okk ... 고마워요 ... 사실 나는이 SQL 주입을 잘 알고 있지 않습니다 ... 나를 꾸준히 좋은 소스를 제안 할 수 있습니다 ... –

1

동적 테이블/열/데이터베이스 이름을 사용해야하는 경우 허용 된 사이트 목록을 통해이를 실행해야합니다.

다음 코드는 수행합니다

$allowed_column = array('col1', 'col2'); 
$col = $_POST['col']; 
if (in_array($col, $allowed_column)) { 
    $query = "SELECT `$col` FROM table1 "; 
} 

참조 : 자세한 내용은 How to prevent SQL injection with dynamic tablenames?

합니다.

관련 문제