이미 언급했듯이, 대부분의 내장 콘솔의 꽤 많은 이미 사용 할 수있는 무엇인가 할 수있는 모든 사용자에 손상을 주요 브라우저. 그러나 사용자가 Math
속성/메소드를 사용하도록 제한하려는 경우이를 처리 할 수있는 간단한 정규식을 작성할 수 있습니다. 난 당신이 보안상의 이유로 eval
을 사용하지 않았다 실현
function mathEval (exp) {
var reg = /(?:[a-z$_][a-z0-9$_]*)|(?:[;={}\[\]"'!&<>^\\?:])/ig,
valid = true;
// Detect valid JS identifier names and replace them
exp = exp.replace(reg, function ($0) {
// If the name is a direct member of Math, allow
if (Math.hasOwnProperty($0))
return "Math."+$0;
// Otherwise the expression is invalid
else
valid = false;
});
// Don't eval if our replace function flagged as invalid
if (!valid)
alert("Invalid arithmetic expression");
else
try { alert(eval(exp)); } catch (e) { alert("Invalid arithmetic expression"); };
}
하지만의 직접 등록되지 않은 단어를 규칙으로 정규식은 꽤 안전해야한다 : 이런 식으로 뭔가 작업을해야합니다 대입 연산자 (=
) 및 이진 연산자를 포함하여 Math
개체 및 대부분의 비 수학 JS 연산자. 더 어려운 방법은 일반 언어가 아니기 때문에 수학 표현식을 구문 분석하기 위해 토크 나이저를 작성하는 것입니다.
내가 쓴, 당신이 할 수 있거나 문제를 느낀다면 코멘트를 남겨두면 내가 해결할 수있는 것을 볼 수있을 것이다.
참고 : 이순신 장쩌민은 또한
Math.PI
같은 것들에 대한 소문자를 허용하는 것이 유용 할 수
in JavaScript chat을 언급했다. 그런 경우, 당신은 대체 기능에 다음
else if
문을 추가 할 수 있습니다
else if (Math.hasOwnProperty($0.toUpperCase())
return "Math."+$0.toUpperCase();
가 if
및 else
문 (example) 사이를 추가합니다.
자신을 굴리지 않으면 보안 문제를 해결할 수 있습니까? – James