2011-12-11 4 views
0

(사용자 입력이 있으므로 하드 코딩을 할 수 없습니다.) 어쨌든, 사용자가 math.php? do = 2 + 2를 입력하면 스크립트는 결과로 4를 되돌립니다. 또 다른 한 가지는 입력이 엄격하게 검증되므로 악의적 인 가능성이 없다는 것입니다. 내 테스트 방법은 다음과 같습니다PHP : 수학 연산이있는 문자열이 있습니다. 어떻게 실행합니까?

function testMath($char){ 
    $array['math'] = Array("+", "-", "/", "*", "(", ")", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); 
    foreach($char as $chr){ 
     if(!in_array($chr, $array['math'){ 
      return false; 
     } 
    } 
    return true; 
} 

평가하는 것이 안전할까요? 또는 사용자 입력을 통해 수학을하는 것을 잊어야합니까? 나는() 뭔가를 평가 후면 때

사이드 노트, PHP는

Parse error: parse error in C:\Users\Josh\Desktop\App\html\new.php(24) : eval()'d code on line 1 

가 발생합니다. 뭐가 문제 야?

+5

당신은 자바 스크립트와 사용자의 끝에 수학을 그냥 것입니다 왜 ? 방법은 덜 위험합니다. –

+0

'eval'은 사용자 입력이 끝난 경우 몇 가지 명백한 안전 문제가 있습니다. 테스트는 괜찮은 것처럼 보이지만 길이를 제한하려고 할 수도 있습니다. 'eval'을 호출하면 어떻게 생깁니 까? –

+1

또는 이미 생성 된 것을 사용하십시오 : http://stackoverflow.com/questions/1015242/how-to-evaluate-formula-passed-as-string-in-php – NightHawk

답변

1

코드의 해당 부분을 게시하지 않았으므로 어떻게 eval()을 사용했는지 모르겠습니다.

개정 testMath : 코드를 평가 후면려고하는 경우에, 당신은이 저장 될 변수를 지정해야합니다

function testMath($char){ 
    if(strlen($char) > 10) return false; 
    $array['math'] = Array("+", "-", "/", "*", "(", ")", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); 
    foreach($char as $chr){ 
     if(!in_array($chr, $array['math'){ 
      return false; 
     } 
    } 
    return true; 
} 

$math = $_GET['do']; 
if(testMath($math)) eval("$result = " . $math . ";"); 

echo $math, ' = ', $result; 
+1

'$ sanitizedUserInput'은 hell sanitization을 요구합니다. – Dan

+0

위에 제공된 testMath() 함수를 사용하면 충분할 수 있습니다 ... 이전에 언급 한 tandu로 문자 제한을 추가합니다. – dchrastil

+0

@Bracketworks +1 for "hella" – rockerest