2012-06-11 4 views
1
$op=$_POST['param']; 
$statement=eval("return ($op);"); 

'param' 이 문제를 어떻게 해결할 수 있습니까?'jfsdf'와 같은 이상한 문자가 있거나 eval 함수가 작동하지 않으면 eval 연산에서 이상한 문자가 사용 된 경우 사용자에게 경고하는 방법

eval 함수는 '54 + 4 * 3'과 같이 잘 정의 된 항목 만 작동합니다. 반면 '6p + 87 + 4'와 같은 항목을 사용하면 구문 분석 오류가 발생합니다.

+2

문자열 인용은 시작일 것입니다! 그리고 나서'addslashes()'를 수행합니다. 그 정도면 충분합니다. –

+0

코드를 정리 하시겠습니까? – Sebas

+0

이것은 크로스 사이트 스크립팅의 악몽처럼 보입니다. –

답변

2

우선 "이상한"문자가 무엇을 의미하는지에 따라 외부에서 오는 문자열을 확인하는 함수를 구현해야합니다.

$allowed_chars = array('function', 'this'); //..add desirable ones 

function is_alloved_char($char){ 
return in_array($char, $allowed_chars); 
} 

RegEx는 성능 저하를 제외하고 수행 할 때 좋습니다.

상황에 따라 str_pos()은 바람직하지 않은 문자를 맞추기에 충분히 좋습니다. 당신이 제품에이 기능을 사용하는 경우, 당신이 뭔가 잘못하고있다() 평가와 매우 매우 조심, 또

/** 
* 
* @param string 
* @return TRUE on success, FALSE otherwise 
*/ 
function is_really_safe($char){ 
    global $allowed_chars; //just make this array visible here 
foreach ($allowed_chars as $allowed_char){ 
    if (str_pos($allowed_char, $char)){ 
    return false; 
    } 
} 
return true; 
} 

:

그래서, 당신의 또 다른 기능은 비슷해야합니다.

0

제한된 수학 표현식을 평가하는 경우 게으른 옵션은 평가 전에 패턴 어설 션을 사용하는 것입니다. 이 사람은 암시 적으로 당신에게 표현의 결과를 반환으로도 쉽게 :

$result = preg_replace('#^\s*\d+([-+*/%]\s*\d+\s*)*$#e', '$0', $input); 

당신이 (..) 괄호가 제대로뿐만 아니라 구성되어 주장하기를 원한다면 더 복잡한 무언가가 필요합니다.

일치하지 않으면 원래 입력 문자열을 반환합니다. 경고를 생성하는지 확인하십시오.

관련 문제