문제

PHP 프로젝트를 진행하고 있으며 MySQL 데이터베이스에서 가져온 코드를 실행하고 싶습니다. 안전하지 않은 코드가 주입 될 가능성이 없으므로 내가 걱정하는 유일한 것은 공연입니다. COLL_USER_FUNC ()가 대신 실행되도록 코드를 직접 실행하거나 구문 분석 할 수 있도록 Eval ()를 사용해야합니까?

예를 들어, 내가 가져온 코드가 "myfunc (1,2,3); 또 다른 펀치 (3,2,1);
코드를 실행하기 위해 직접 평가할 수 있습니다.

그러나 Call_user_func ()의 경우 문자열을 구문 분석하여 실행할 수 있도록 문자열을 구문 분석해야합니다. 그렇다면이 경우 사용하기에 더 나은 기능은 무엇입니까?

도움이 되었습니까?

해결책

일반적으로, 나는 항상 가능한 한 Eval ()에서 멀리 떨어져 있으려고 노력합니다. 그러나이 사례는 좋은 후보처럼 보입니다.

당신은 말합니다 "안전하지 않은 코드가 주입 될 가능성이 없습니다", 큰 문제는 : 데이터베이스에 작업하지 않는 코드가있을 가능성이 있습니까?

그렇지 않은 경우, Eval ()는 솔루션이지만 적절한 구문 분석 및 오류 로깅 등이 더 안전 할 수 있습니다. (콜 _user_func_array ()를 사용하는 것이 이론적으로 더 빠르기 때문에 구문 분석 오버 헤드가 무시할 수 있다고 생각합니다)

다른 팁

데이터베이스에 PHP를 저장하는 것은 그 자체로 나쁜 디자인 냄새입니다. 이 경우 안전하지 않은 코드를 포함 할 수 없다고 확신하지만 항상 가정이나 방어 수를 최소화하는 것이 좋습니다. PHP 코드를 데이터베이스에 저장하면 공격자가 데이터베이스에 대한 액세스를 얻는 공격이 훨씬 더 심각 해져 공격자가 임의의 코드를 실행할 수있는 공격으로 전환됩니다! 나는 당신의 데이터베이스를 이와 같이 손상시키는 것이 가능성이 거의 없다는 것을 알고 있지만, 그럼에도 불구하고 상황조차 필요 이상으로 시스템을 타협 할 가능성이 높지 않은 것이 좋은 보안 관행입니다.

많은 사람들이 동의합니다 이 평가 ()는 항상 예외없이 PHP 코드에서 피해야합니다. 항상 대안이 있습니다.

그러나이 경우, 나는 이미 DB에 PHP 코드를 저장하고 있기 때문에 eval ()를 사용하는 것이 가장 좋은 솔루션이 될 것이라고 말해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야한다고 생각해야합니다. 이미 DB에 PHP 코드를 저장하고 있기 때문에 Eval ()를 사용하면 위험을 증가시키지 않을 것입니다. 그보다 더 이상.

그러나 나는 그것을 추천 할 것이다

  1. 당신은 당신이 허용하는 것에 보수적으로 평가하기 전에 코드를 검증하려고합니다 (). 어쨌든 공격자가 데이터베이스에 들어갔다고 가정하십시오.
  2. PHP 코드가 데이터베이스에 저장되지 않도록 애플리케이션을 다시 작성할 진지한 생각을합니다. 복잡한 데이터 구조를 저장하는 경우 JSON 또는 XML과 같은 것을 대신 생각하십시오. 안전한 파서가 존재합니다.

이 대답이 약간 반동적 인 것처럼 보이면 죄송합니다. 나는 단지 이런 종류의 일이 매우 중요하다고 생각합니다.

나는 구문 분석이 오버 헤드를 추가 할 것이라고 생각하지만, 당신이 확실하게 할 수있는 유일한 방법은 그것을 테스트하는 것입니다. 다양한 기능으로 두 가지 방법을 모두 시도하고 결과가 무엇인지 확인하십시오. 저장할 것으로 예상되는 코드를 사용하십시오.

행운을 빕니다!

평가 ()를 사용합니다. 다른 것은 노력의 가치가 없습니다. 긍정적 인 부작용은 없습니다.

당신은 그것을보고 싶을 것입니다 runkit 실행중인 코드에 영향을 미치지 않는 샌드 박스에서 PHP를 실행할 수있는 Extention.

코드가 실행중인 코드에 영향을 미치라고 가정하면 Eval ()로 이동하십시오.

오류가 발생할 경우를 대비하여 시도/캐치 블록으로 실행하려는 코드를 랩핑해야합니다 (가능성이없고 가능성이 있고 모범 사례가 있습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top