2011-03-15 3 views
1
$alerter2="false"; 
for ($counter = 0; $counter <= count($filter); $counter++) { 
    $questionsubmitted=strtolower($_POST[question]); 
    $currentcheck =$filter[$counter]; 
    $foundvalue=stripos((string)$questionsubmitted,(string)$currentcheck); 
    echo $foundvalue; 
    if ($foundvalue==0) { 
     $alerter2="true"; 
    } else { } 
} 

if (!($alerter2=="true")) { 
    $sql="INSERT INTO Persons (Name, Email, Question) 
     VALUES 
     ('$_POST[name]','$_POST[email]','$_POST[question]')"; 
} else { 
    echo "Please only post appropriate questions"; 
} 

언제든지 이것을 실행할 때마다 모든 반복마다 매번 stripon이 0을 반환합니다. 그것은 필터로되어 있고, echo를 사용하면 stripos가 나타날 때마다 0입니다. 그러나 if에서 0을 사용하면 단어가없는 경우에도 true를 반환합니다.이상한 부울 반응

어디에서 mysql_real_escape_string을 사용해야합니까? 쿼리 후? 이 코드는 사용자 입력을 데이터베이스에 저장하려는 코드 부분입니다.

+2

사용'mysql_escape_real_string();'당신'$의 sql' 내에서'$ _POST' 변수에 대한 것은 – kjy112

+3

SQL을 할 수있는 다른 일이 될 것입니다 사출 공격! – Arafangion

+2

문자열을 사용하여 "true"와 "false"를 나타냅니다. 정말?? – Spudley

답변

0

당신은 (내가 아주 무슨 일이 일어나고 있는지 이해하지 못했다) 논리에 따라,

if ($foundvalue==0) 

if ($foundvalue===0) // three equals signs 

또는 이에 해당하는 변경해야합니다.

그러나 모두가 말하듯이 이 코드는 SQL 주입 공격 (다른 문제도 있음)에 공개됩니다.

2

stripos 값을 찾을 수없는 경우 false를 반환하고, 값이 첫 문자 인 경우 0을 반환합니다. 문제는 PHP가 자동으로 boolean을 0 정수로, 0 정수를 false로 캐스팅합니다. 그래서 나는 캐스트가 여기에서 일어나고 있다고 생각합니다. 따라서 조건은 당신이 원하는 것을하지 않습니다.

또한 변수의 유형을 확인하는 ===를 사용할 수 있습니다 stripos에 대한 링크 된 문서에서이 문제에 대한 자세한 내용을있다

if ($foundvalue === 0) { 
    $alerter2="true"; 
} 

.

더 깨끗한 코드의 경우 else 절을 제거하고 mysql_real_escape_string을 사용하여 값을 데이터베이스에 저장하기 전에 위생 처리해야합니다. 또한

0

,

$questionsubmitted=strtolower($_POST[question]); 

해야 아마 수 :

$questionsubmitted=strtolower($_POST['question']); 
+0

그래, 이건 실제로 작동하지만, 당신은 당신이 이런 식으로 할 때마다 파일을 로그 PHP에서 알림을 얻을. 위 코드는'question' (apostrophs없이)가 상수 식으로 처리된다 (즉, 이전에 의해 정의 된 '상수는 대문자로 기록되어야하지만, ('질문 ','someValue와 ')를'정의) 먼저 경우 이는 아니다. –