2008-09-25 3 views
5

나는 보안 문제는이 같은 PHP evaluator을 구현하기가 무엇인지 궁금 :사용자 코드 평가의 보안 문제는 무엇입니까?

<?php eval($_POST['codeInput']); %> 

이것은 PHP sandbox 그렇게 DB input 등에 대해 살균 만들기의 맥락에서이 엄청난 문제가되지 않습니다.

파일을 호스팅하는 서버를 파괴하는 사용자는 다음과 같습니다.

저는 보안상의 현명한 (적어도 모호한 세부 사항) 내용이 궁금해서 Ruby simulators을 보았습니다.


감사합니다. 그것들이 모두 유용하기 때문에 어떤 대답을 받아 들일 지 확신하지 못합니다.

Owen's answer은 내가 의심했던 것 (서버 자체가 위험 할 수 있음)을 요약합니다.

arin's answer은 잠재적 인 문제의 좋은 예입니다.

Geoff's answerrandy's answer 시뮬레이션 유형 기능을 구현하려면 고유 한 평가기를 작성해야한다는 일반적인 견해를 반복하십시오.

답변

5

잠재적으로 정말 큰 문제가 될 수 있습니다 그것은 귀하의 사이트가 바로 삭제 얻을 것이다 경우. 잘하면 당신의 허가가 그것을 허용하지 않을 것이지만, 그것은 위생의 필요성을 설명하는데 도움이됩니다 & 수표.

+0

구체적인 예를 들어 주셔서 감사합니다 .-) –

18

하지 마세요.

그들은 기본적으로 당신이 PHP에서 할 수있는 일에 액세스 할 수 있습니다 (파일 시스템을 바라 볼 얻을/실행하는 코드를 삽입 할 변수, 다른 컴퓨터에 열려있는 연결의 어떤 종류 등 설정 ...)

+0

그래, 나는 그들이 어떤 종류의 파일 액세스를 가지는지 궁금해했다. 그것이 문제였습니다. 감사. –

4

당신이 말할 수있는 많은 것들이 있습니다 .. 우려 사항은 이며 PHP에만 국한되지 않습니다. 컴퓨터 (또는 데이터베이스)에

모든 입력을 소독 할 필요가 :

는 여기에 간단한 대답입니다.

게시 한 코드 스 니펫을 사용하면 원하는 코드를 실행할 수 있으므로 특히 위험합니다.

Wikipedia on Code Injection :

여기에 코드 삽입에 꽤 좋은 소개 글이 있습니다.

+0

그것은 코드 삽입이 아닙니다. 저는 많은 사람들이 걱정하고 있습니다. 사람들이 자신의 코드를 분명하게 표현할 수 있기를 바랍니다. 나는 그들이 내 서버 또는 뭔가에 액세스 할 수 있는지에 대해 더 걱정하고있다. –

+0

아. 음, 원래 질문의 스 니펫은 갈 길이 아닙니다. 사용자가 코드를 작성하려는 경우 대화 형 최상위 레벨을 작성하고 구현하는 기능을 제한하거나 각 사용자에게 관리자 인 UNIX 계정을 제공하거나 가장 간단하게 코드를 실행하여 자신의 시스템에서 코드를 실행할 수 있습니다. – keparo

4

임의의 코드가 서버에서 실행되도록 허용하면 더 이상 서버가 아닙니다.

+0

테스트 베드 시뮬레이터에 무엇이 막연하게 관련되어 있는지 충분히 알기 쉽습니다. 나는 온라인 Ruby 평가자를보고 호기심이 많았다. –

-1

이미 대답했듯이 입력을 위생해야합니다. 나는 당신이 "exec"와 같은 원하지 않는 명령을 제거하기 위해 어떤 종류의 regex-filtring을 사용할 수 있으며 기본적으로 PHP가 제공해야하는 (또는 악용 될 수있는) 모든 악의적 인 명령을 사용할 수 있다고 생각합니다. 당신이 eval() '는 극단적 인 예입니다

<?php 
    eval("shell_exec(\"rm -rf {$_SERVER['DOCUMENT_ROOT']}\");"); 
?> 

같은 것을 거라고하지만 경우

+2

위생 처리를 위해 블랙리스트를 사용하지 마십시오! 화이트리스트를 항상 사용하십시오. – Lewis

+0

나는 루이스의 의견이 과도하게 강조 될 수 있다고 생각하지 않는다. - 당신이 블랙리스트를 사용하여 "입력 내용을 살균"하려고한다면. 정규식 -이 경우에는 거의 쓸모가 없습니다 - 구현하려는 정규식을 쉽게 돌아 다니고 관계없이 MY 코드를 실행합니다. – AviD

3

친애하는 신 . 나는 제목에조차 싫증이 난다. 사용자가 임의의 종류의 코드를 실행할 수 있도록 허용하는 것은 서버를 넘기는 것과 같습니다.

나는 이미 저 위에있는 사람들을 알고 있습니다. 그러나 나를 믿어 라. 누군가가 당신의 입력을 위생적으로 말할 수있는 충분한 시간이 아닙니다.

정말로 실제로라면은 사용자가 어떤 종류의 코드를 실행하도록 허용하려고합니다. 사용자가 사용할 수있는 일종의 psudo 언어를 작성하여 사용자가 사용할 수있는 명령의 서브 세트를 만드십시오. 라 - 바코드 또는 마크 다운이 작동하는 방식.

2

Do 서버에서 필터링되지 않은 코드가 실행될 수 있도록 허용합니다.

여기에 표시된 도구와 같은 언어의 대화 형 데모를 허용하는 도구를 만들려면 http://tryruby.hobix.com/ 언어의 하위 부분을 직접 코딩해야합니다. 이상적으로는 새로운 프로그래머에게 간단한 개념을 보여주기 위해이 도구를 사용할 것이므로 모든 기능을 올바르게 구현하면 관계가 없습니다.

이렇게하면 흰색 목록 알려진 허용 입력 중 하나를 통해 입력을 제어 할 수 있습니다. 입력이 화이트리스트에 없으면 실행되지 않습니다.

행운을 빈다.

3

online PHP interpreter을 빌드하려는 경우 실제 REPL 인터프리터를 빌드하고 eval을 사용하지 않아야합니다.

그렇지 않으면 임의의 사용자 코드를 절대로 실행하지 마십시오. 이제까지.

6

eval() 기능은 위생적으로 만들기가 어렵습니다. 그렇다고해도 그렇게 할 수는 있습니다. exec을 필터링 했더라도 문자열에 exec을 붙이면 변수에 넣은 다음 $variable()을 입력하면됩니다. 적어도 일종의 상상의 보안을 성취하려면 언어에 장애가 있어야합니다.

+0

+12! 이 응답은 다른 모든 것보다 더 가치가 있으며, 너무 나쁘게 표시되어 더 많이 표시되지 않습니다. – AviD