2010-11-22 4 views
1

나는 PHP 스크립트를 가지고 있는데 이것에는 많은 실수가 있다고 생각한다. 연결 및 SQL 주입에 대한 제한된 지식 때문에. 이 스크립트는 PHP-Mysql을 사용하기 때문에 처음에는 아무 문제가 없습니다.

하지만 Interbase로 변경하려고하면 많은 문제가 발생합니다. 실수를 식별하는 데 도움주세요.

이 내 다음 쿼리 :

$sLimit = ""; 
     if (isset($_POST['iDisplayStart'])) 
     { 
       $sLimit = " FIRST ".$_POST['iDisplayStart']." SKIP ".$_POST['iDisplayLength']; 
     } 
$sOrder =""; 
     $sOrder = " ORDER BY LINE_NAME "; 
$sWhere = ""; 
     if (postVar('sSearch') !="") 
     { 
       $sWhere = " WHERE (LINE_NAME LIKE '%".$_POST['sSearch']."%' OR 
           MODEL_ONLY LIKE '%".$_POST['sSearch']."%' OR ". 
           " VER_ONLY LIKE '%".$_POST['sSearch']."%' OR ". 
           " LOT_SIZE LIKE '%".$_POST['sSearch']."%' OR ". 
           " START_SERIAL LIKE '%".$_POST['sSearch']."%' OR ". 
           " SERIAL_NO_LOW LIKE '%".$_POST['sSearch']."%' OR ". 
           " SERIAL_NO_UP LIKE '%".$_POST['sSearch']."%' OR ". 
           " PROD_NO LIKE '%".$_POST['sSearch']."%' OR ". 
           " PROD_DATE LIKE '%".$_POST['sSearch']."%') "; 
     } 
$sQuery = "SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
        LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
      FROM DOC_TO".$sWhere.$sOrder.$sLimit.";"; 
$rResult = ibase_query($sQuery) or _doError(_ERROR30 . ' (<small>' . htmlspecialchars($sql) . '</small>): ' . ibase_errmsg()); 

$sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
             LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
            FROM DOC_TO'.$sWhere.$sOrder.$sLimit.')"; 
$rResultFilterTotal = ibase_query($sQuery) or _doError(_ERROR30 . ' (<small>' . htmlspecialchars($sql) . '</small>): ' . ibase_errmsg()); 
$aResultFilterTotal = ibase_fetch_assoc($rResultFilterTotal); 
$iFilteredTotal = $aResultFilterTotal[0]; 

노트 : 나는 사전에 대한 concatenation.thanks에 대한 자세한 내용이 필요합니다.


오류 :

Dynamic SQL Error SQL error code = -104 Token unknown - line 3, column 39 '.. ORDER BY LINE_NAME ..' 
+0

작동 원리 : 특정 질문을하고 구체적인 답변을 얻습니다. 어떻게 그렇게 작동하지 않습니다 : 당신은 사람들에게 당신의 일을하도록 요청합니다. – zerkms

+1

추가 정보 : SQL 주입 공격에 대해 읽어보십시오. 이 코드는 그들에게 열려 있습니다. – David

+1

여기 어딘가에 질문이 있습니까? 오류가 있습니까? –

답변

-1

은 내가 AndreKR의지도에서 해답 발견 :

$sLimit = ""; 
     if (isset($_POST['iDisplayStart'])) 
     { 
       settype($iDisplayStart,'integer'); 
       $iDisplayStart = $_POST['iDisplayStart']; 
       $iDisplayLength = $_POST['iDisplayLength']; 
       $sLimit = sprintf(" FIRST ".$iDisplayStart." SKIP ".$iDisplayLength); 
     } 

을 모두 $ _POST 변경 : 마지막 PHP 페이지에서

$sQuery = "SELECT COUNT(*) FROM(......) 
into 
$sQuery = "SELECT COUNT(*) AS DCOUNT FROM DOC_TO".$sWhere.$sLimit.";"; //delete $sOrder 

$aResultFilterTotal = ibase_fetch_assoc($rResultFilterTotal); 
$iFilteredTotal = $aResultFilterTotal['DCOUNT']; //change from ......[0] 

및 추가

'%".$_POST['sSearch_0']."%' 
into 
''%".$_POST['sSearch_0']."%'' //this to prevent injection For databases Like Oracle, DB2, MS SQL, Firebird 

과 변화를 :

ibase_free_result($aResultTotal); 
?> 
3

그것을 실행할 수있는 것처럼 보이는, 그래서 실패하면 방법에 대해 설명 바랍니다.

있다, 그러나 한 즉시 표시 실수 : 라인

$sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
             LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
            FROM DOC_TO'.$sWhere.$sOrder.$sLimit.')"; 

큰 따옴표 문자열을 시작하고 당신이 작동하지 않습니다 작은 따옴표로 문자열을 중단하려고합니다. 그래서 코드는 다음과 같아야합니다 :

$sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
             LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
            FROM DOC_TO".$sWhere.$sOrder.$sLimit.")"; 

코드에서 중요한 보안 결함이있을뿐만 아니라 환경에 따라 예를 들어 라인에

$sLimit = " FIRST ".$_POST['iDisplayStart']." SKIP ".$_POST['iDisplayLength']; 

직접 넣어 $ _POST를 사용하는 소위 SQL 주입 보안 구멍이 열리는 SQL 쿼리로 변환합니다.

+0

나는 PHP를 얻었다 Notice : 정의되지 않은 오프셋 : 0 행 /var/www/html/showserial1.php에서 164 행 : $ iFilteredTotal = $ aResultFilterTotal [0]; – klox

+0

SQL 삽입을 방지하는 더 좋은 방법은 무엇입니까? – klox

+1

$ aResultFilterTotal에 인덱스 0이 없기 때문에 아마도 _fetch_assoc을 사용했기 때문에 알림이 표시됩니다. 숫자 대신 이름 (아마도 "COUNT (*)")이 있습니다. SQL 인젝션의 문제는 좀 더 복잡하지만, 좋은 쿼리는'addslashes()'를 SQL 질의에 포함되는 모든 변수로 감싸는 것이다. (당신이 그 변수 중 어느 것이 랩핑하지 않는지 알아 내면 보자.) – AndreKR

관련 문제