2011-08-26 2 views
0

는 ...이 문제를 알아 내려고 내 머리카락을 잡아 당겨 건가요 왜 내 진술 결과가 표시되지만 내 ELSE 진술도 실행됩니까?

<?php 
include('connection.php'); 

$template = $_GET['templateID']; 
$campaign = $_GET['campaignID']; 

// Grab everything in the campaign manager 
$cm = mysql_query("SELECT * FROM campaign_manager WHERE campaign ='$campaign'") or die(mysql_error()); 

while($temp = mysql_fetch_array($cm)){ 
    //Checks if Template is already attached 
    if($temp['paragraph'] == $template){ 
     echo 'Template is already attached - <a href="http://general:8888/templates">Back</a>'; 
    } else { 
     if($temp['paragraph'] == '0' || $temp['paragraph'] == null){ 
      mysql_query("UPDATE campaign_manager SET paragraph = '$template' WHERE campaign = '$campaign'") or die(mysql_error()); 
     } 
     else { 
      $geo = $temp['geo']; 
      $list = $temp['list']; 
      mysql_query("INSERT INTO campaign_manager(campaign,paragraph,geo,list) VALUES('$campaign','$template','$geo','$list')"); 
     } 
    } 
} 
?> 

나의 첫번째 IF

는 DUP를 확인한다. 그렇지 않으면 필드가 0 또는 NULL인지 확인합니다. 체크 아웃 한 다음 '캠페인 관리자'에 새 레코드를 추가해야합니다. 현재는 첫 번째 IF &의 에코를 표시하지만 중복 레코드를 캠페인 관리자에 추가합니다. 왜 & 이런 일이 일어나는가?

+5

동일한 '캠페인'ID가있는 표에 여러 행이있을 가능성이 있습니까? –

+0

또한 'elseif'입니다. –

+1

[SQL 주입]에 대한 거대한 구멍이 있습니다. (http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php) – tttony

답변

0

와우, 주말에 내 코드를 재검토 한 후 이렇게. 나는 이걸 생각해 냈다. ...

<?php 
include('connection.php'); 

$template = $_GET['templateID']; 
$campaign = $_GET['campaignID']; 

// Grab everything in the campaign manager 
$cm = mysql_query("SELECT * FROM campaign_manager WHERE campaign ='$campaign'") or die(mysql_error()); 
$match = 0; 

while($temp = mysql_fetch_array($cm)){ 
    if ($temp['paragraph'] == $template){ 
     echo 'Template is already attached - <a href="http://general:8888/templates">Back</a>'; 
     $match = 1; 
    } 
} 

$geo = $temp['geo']; 
$list = $temp['list']; 

if ($match == 0){ 
    mysql_query("INSERT INTO campaign_manager(campaign,paragraph,geo,list) VALUES('$campaign','$template','$geo','$list')"); 
    header('Location: http://general:8888/templates/'); 
} 

?> 

마침내 작동한다.

1

아니요. 이는 단순히 불가능합니다. 어쩌면이 코드 부분을 가지고있어 실행이 2 번 발생합니다.

+1

불가능합니다? 코드는 루프 내부에 있습니다. 루프가 실행되는 횟수만큼 실행됩니다. – JJJ

+0

나는 그것을 알고 있지만 OP는 그것이 각각 하나씩 두 번 실행된다고 말했습니다 ... – genesis

+0

선택 쿼리가 항상 하나의 결과 만 반환한다고 가정하면 아마도 OP의 일부분 일 것입니다. – JJJ

2

이것은 잠시 루프에 있습니다. 문제가되는 것이 가능한가? 두 개의 레코드로 쉽게 에코 및 업데이트 할 수 있습니다.

코드를 검사하여 페이지가 새로 고침되는지 확인하십시오.

먼저 여기에 보안 결함을 많이 가지고 내가 누구 때문에 잠재적 인 XSS 및 SQL 주입 결함의 형태로 위의의를 코드를 사용하지 않는 것이 좋습니다 :

+0

while 루프는 IF/Else 문을 기반으로 종료되어야합니다. 그래야하지 않니? –

+0

어떻게 그렇게됩니까? 여러 레코드가 반환 된 경우 루프를 죽일 수있는 내용이 표시되지 않습니다. – MrZander

+0

첫 번째 반복에서 My IF 문'if ($ temp [ 'paragraph'] == $ template)'은 현재 행에 단락 열에 DUP가 있는지 여부를 명시 적으로 확인합니다. DUPPED이면'echo '템플릿이 이미 부착되어 있습니다. - Back'; '그리고 ELSE 문을 다시 터치하지 않고 루프를 다시 실행하십시오. 내 문제는 IF와 ELSE 모두를 실행하고 있다는 것입니다. 문제의 복잡성을 추가합니다. 첫 번째 레코드를 복제하지는 않지만 첫 번째 레코드 이후에는 DUP가됩니다. –

0

는 몇 가지를 시도 할 수 있습니다. '가져 오기'에서 매개 변수를 전달하고 바로 쿼리 값에 넣고 있습니다.

이를위한 적절한 방법은 검색 여기 :

또한 PDO (선호) 또는 mysql_real_escape 통해 PHP SQLI의 prevetion MySQL을위한 간단한 구글 검색을 수행하여 php.net 매뉴얼에서 찾을

https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project

PDO.

... GRR PHP ... 다음 확인을

는 귀하의 분기 논리는 약간 결함이있다. 그것을 해결하기 위해 그것을 부술 수 있습니다.

if($temp['paragraph'] == $template){ 
     echo 'Template is already attached - <a href="templates">Back</a>'; 
} elseif ($temp['paragraph'] == '0') { 
      mysql_query("UPDATE campain_manager SET paragraph = '$template' WHERE campaign = $campain'") or die(mysql_error()); 
} 
    elseif ($temp['paragraph'] == null){ 
      mysql_query("UPDATE campaign_manager SET paragraph = '$template' WHERE campaign = '$campaign'") or die(mysql_error()); 
     } 
else 
{ $geo = $temp['geo']; 
      $list = $temp['list']; 
      mysql_query("INSERT INTO campaign_manager(campaign,paragraph,geo,list) VALUES('$campaign','$template','$geo','$list')"); 
     } 
    } 
} 
?> 

이제는 개발자가 아닙니다. 많은 사람들에게 이것이 옳은 생각이 들지 않습니다. 잠재적으로 코드를 재 작성하여 작게 만들 수 있다고 생각합니다. 당신이 할 수 있다면 나는 또한 그것을 더 기능적으로 만들려고 노력할 것입니다. 위의 모든 문제를 해결할 시간이 없었기 때문에 제가 말씀 드렸습니다. 위의 코드도 취약합니다. 올바르게 수정하려면 mysql_query를 mysql_real_escape_string으로 대체하십시오. 또한 사용자의 입력을 잡아 끄는 것이 아니라는 것을 확인하십시오.

A) 부적절하게 위생 처리합니다. B) 부적절하게 출력하고 있습니다.

클라이언트 쪽 코드를 모두 신뢰하지 않아도 서버의 유효성은 신뢰할 수 있습니다. 서버 측 코드 클라이언트 측을 제공하지 마십시오.

HTH

M

관련 문제