2012-10-11 3 views
1

모든 _POST 데이터를 반복하여 메일 헤더 삽입을 방지하려고하지만 변수가 유효성 검사를 통과하지 못합니다. 슬래시를 포함하는 몇 가지 "날짜"필드가 있고 일부 필드가 비어있을 수 있습니다. 그것이 그 일과 관련이 있는지 확실하지 않습니다. 누구든지 내 논리로 문제를 볼 수 있습니까? "실패"메시지가 계속 나타납니다. 감사.PHP 간단한 헤더 주입 방지

if(isset($_POST['submit'])) { 

    $boolValidateOK = 1; 

    function safe($name) { 
     return(str_ireplace(array("\r", "\n", "%0a", "%0d", "Content-Type:", "bcc:","to:","cc:"), "", $name)); 
    } 

    foreach($_POST as $value){ 
     if(!safe($value)){ 
      $boolValidateOK = 0; 
     }else{ 
      $boolValidateOK = 1; 
     } 
    } 

    if($boolValidateOK == 1){ 

     $headers = 'MIME-Version: 1.0' . "\r\n"; 
     $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
     $to...etc 
     $subject...etc 
     $message...etc 

     mail($to, $subject, $message, $headers); 

     $success_message = "win"; 
    }else{ 
     $error_message = "fail"; 
    } 
} 
+0

이것은 쓸모없고 잠재적으로 해로운 보안 "개선"처럼 보입니다. 사용자가 메일 헤더를 직접 지정할 수 있도록 허용하지 않는 한 잠재적 인 정육점 사용자 입력 이외에는 아무 것도 할 필요가 없습니다. – NullUserException

+0

프로그래밍 초보자입니다. 어떻게 설명 할 수 있니? 그렇다면 헤더 삽입을 방지하는 방법은 무엇입니까? – user1738750

+0

음, 나머지 코드는 어디에 있습니까 (예 :'etc'로 대체 한 것들)? 당신이해야 할 일처럼 들리지 않습니다. – NullUserException

답변

3

당신이하고있는 일은 불필요합니다. 참고 PHP의 mail() 함수 서명 :

bool mail (string $to , string $subject , string $message 
       [, string $additional_headers [, string $additional_parameters ]]) 

수신자가 두 번째 인수입니다. 헤더는 모두 네 번째 인수에 있습니다. $message 또는 $subject의 내용은 다른 주장에 마술처럼 "유출"되지 않을 것입니다.

$headers은 사용자 입력에 의존하지 않으므로 사용자가 입력했는지는 중요하지 않습니다. 그러한 "주입"은 불가능합니다. 당신이하는 일은 메시지를 도살하는 것뿐입니다.

PS :이 코드는 잘못된 것입니다 :

foreach($_POST as $value){ 
    if(!safe($value)){ 
     $boolValidateOK = 0; 
    }else{ 
     $boolValidateOK = 1; 
    } 
} 

if($boolValidateOK == 1){ 

그것에 대해 생각하십시오. 모든 게시물 값이 '안전'하지 않지만 반복 된 마지막 값이 있다고 가정 해 보겠습니다. 그런 다음 $boolValidateOK1으로 덮어 쓰며 그 값은 루프가 종료 될 때까지 유지됩니다.

또한 PHP에는 부울 유형이 있습니다. bool이있는 경우 1과 0 대신 true 또는 false으로 설정하십시오. 더 명확합니다.


아무튼 PHPMailer과 같은 것을 사용하는 것이 좋습니다. 기본 mail() 기능은 사용하기가 매우 어렵습니다.

+0

답변 해 주셔서 감사합니다. 그래서 당신의 말은 그 모든 코드를 스크랩하고'mail ($ to, $ subject, $ message, $ headers)를 가지고 있고,'submit '을 보내겠습니까? – user1738750

+0

@ user1738750 이메일이 유효하고받는 사람이 많지 않은 경우 (예 :' "[email protected], [email protected] ..." '), 메시지 본문은 잠재적으로 악의적 인 코드 (사용자가 아닌 수신자에게 영향을 미칠 수 있음) 등을 제거합니다. – NullUserException

+0

양식은 오직 하나의 정적 전자 메일 주소로 보내집니다. 악의적 인 코드를 어떻게 막을 수 있습니까? – user1738750