PHP에서 평가 악은 언제입니까?


84

내가 PHP로 개발해온 모든 해 동안, 나는 항상 사용하는 eval()것이 악 하다고 들었습니다 .

다음 코드를 고려할 때 두 번째 (더 우아한) 옵션을 사용하는 것이 합리적이지 않습니까? 그렇지 않다면 왜?

// $type is the result of an SQL statement
// e.g. SHOW COLUMNS FROM a_table LIKE 'a_column';
// hence you can be pretty sure about the consistency
// of your string
$type = "enum('a','b','c')";

// possibility one
$type_1 = preg_replace('#^enum\s*\(\s*\'|\'\s*\)\s*$#', '', $type);
$result = preg_split('#\'\s*,\s*\'#', $type_1);

// possibility two
eval('$result = '.preg_replace('#^enum#','array', $type).';');

2
eval은 항상 악합니다. 특히 PHP가 익명 함수를 도입했기 때문에 코드를 작성하는 더 좋은 방법이 항상 있습니다. 이 경우에 나는 사용합니다$result = array(); preg_replace_callback('#^enum\s*\(\s*\'|\'\s*\)\s*$#', function($m) use($result) { $result[] = $m[1]; }, $type);
Geoffrey

글쎄, 솔직히 PHP의 주요 문제는 언어 자체가 아니라 그것을 사용하는 사람들이라고 생각합니다. 이 질문에 대한 세 가지 정답 (thomasrutter 's, braincracking 's 및 my)은 모두 반대표를 얻지 못했습니다. 반면 한 가지 대답 주장에 그 예 또는 설명없이 "때때로) (평가 유일한 / 최적의 솔루션이다"와 최고 투표 그것을 위해 ... 도착
프랑소와 부르주아

답변:


133

eval () 순수한 악을 호출 할 때는주의해야합니다. 동적 평가는 강력한 도구이며 때로는 생명의 은인이 될 수 있습니다. eval ()을 사용하면 PHP의 단점을 해결할 수 있습니다 (아래 참조).

eval ()의 주요 문제점은 다음과 같습니다.

  • 잠재적으로 안전하지 않은 입력. 신뢰할 수없는 매개 변수를 전달하는 것은 실패하는 방법입니다. 매개 변수 (또는 매개 변수의 일부)가 완전히 신뢰할 수 있는지 확인하는 것은 종종 간단한 작업이 아닙니다.
  • 속임수. eval ()을 사용하면 코드가 영리 해져 따라 가기가 더 어려워집니다. Brian Kernighan을 인용하려면 " 디버깅은 처음에 코드를 작성하는 것보다 두 배 더 어렵습니다. 따라서 코드를 가능한 한 똑똑하게 작성하면 정의상 디버깅 할만큼 똑똑하지 않은 것입니다. "

eval ()의 실제 사용과 관련된 주요 문제는 다음 중 하나입니다.

  • 충분히 고려하지 않고 사용하는 경험이없는 개발자.

경험상 나는 이것을 따르는 경향이 있습니다.

  1. 때로는 eval ()이 유일한 / 올바른 솔루션입니다.
  2. 대부분의 경우 다른 것을 시도해야합니다.
  3. 확실하지 않은 경우 2로 이동합니다.
  4. 그렇지 않으면 매우 조심하십시오.

4
이것은 eval ()을 피하기 위해 리팩토링 될 수 있습니다. 특히 $ className이 화이트리스트에있는 경우, eval () 사용을 즐겁게하기 위해 있어야합니다. 좋은 소식은 5.3부터 $ foo :: bar ()가 유효하다는 것입니다.
rojoca 09-06-04

@rojoca : PHP 5.2에서 eval ()없이 수행하는 방법에 대한 예제를 제공해 주시겠습니까?
Michał Rudnicki

30
eval로 계산되는지 여부는 확실하지 않지만 $ result = call_user_func (array ( 'Foo', 'bar')); 매력처럼 작동합니다.
Ionuț G. Stan 2009-06-05

3
까다 로움에 대한 좋은 점-(간단한) 예에서 변수가 "아무데도"에서 튀어 나옵니다. 코드가 조금 더 복잡해지면 코드를보고 그 변수를 쫓아가는 다음 사람에게 행운을 빕니다. (그렇게하면 두통과이 형편없는 티셔츠 밖에 없었습니다).
Piskvor는

안전하지 않은 입력은 피할 수 있습니다
thepowerlies

40

평가 된 문자열에 userinput이 포함될 가능성이 아주 적을 때 eval은 악의적입니다. 사용자의 콘텐츠없이 평가를 할 때 안전해야합니다.

그럼에도 불구하고 eval을 사용하기 전에 최소한 두 번 생각해야합니다. 믿을 수 없을 정도로 간단 해 보이지만 오류 처리 (VBAssassins 주석 참조), 디버깅 가능성 등을 염두에두고 더 이상 간단하지 않습니다.

따라서 경험 상으로는 잊어 버리세요. eval이 대답이면 잘못된 질문을하는 것입니다! ;-)


6
때때로 eval이 답입니다. 우리는 온라인 게임 응용 프로그램을 작업하고 있으며 엔티티 간의 매우 복잡한 관계로 인해 평가를 피하는 것이 매우 어렵습니다 ... 그러나 90 %의 경우 IMHO는 평가가 답이 아닙니다.
Jet

19
eval만이 해답 인 상황이 궁금합니다.
Ionuț G. Stan

2
@Ionut G. Stan 개체 / 엔티티에 대한 데이터베이스 저장 사용자 지정 트리거?
Kuroki Kaze

8
나는 그것들 중 어느 것도 eval ()의 정당한 용도라고 실제로 구입하지 않습니다. 각각의 경우 eval ()을 사용하지 않고 동일한 작업을 수행하는 것은 적어도 가능합니다. PHP가 eval () 없이는 불구가되는 것과는 다릅니다. 물론 eval ()은 이와 같은 경우에 바로 가기이지만 여전히 코드 경로를 따라 가기가 조금 더 어렵고 문제는 디버깅하기가 조금 더 어려워집니다. 제 의견입니다.
thomasrutter 2009-06-07

4
@Christian : 먼저 예제를 작성해야합니다 ( pastebin.com 사용 하고 여기에 링크 붙여 넣기) eval(). 많은 사람들 eval()이 어떤 경우에는 불가피 하다고 말하지만 우리가 주장 할 수있는 구체적인 예를 언급하지 않습니다. 이런 식으로이 논쟁은 말이되지 않습니다. 그러니 eval()필연적 이라고 말하는 분들은 먼저 증명해주세요!
Sk8erPeter 2013 년

18

eval ()은 항상 똑같이 악합니다.

"eval ()은 언제 악하지 않습니까?" eval () 사용의 단점이 일부 상황에서 마술처럼 사라진다는 것을 암시하는 것처럼 보이기 때문에 내 의견으로는 잘못된 질문입니다.

eval ()을 사용하면 일반적으로 코드의 가독성, 런타임 전에 코드 경로 (및 그에 대한 가능한 보안 영향)를 예측할 수있는 기능, 따라서 코드 디버그 기능이 저하되기 때문에 일반적으로 나쁜 생각입니다. eval ()을 사용하면 평가 된 코드와이를 둘러싼 코드가 PHP 5.5 이상에 통합 된 Zend Opcache와 같은 opcode 캐시 나 HHVM에있는 것과 같은 JIT 컴파일러에 의해 최적화되는 것을 방지 할 수 있습니다.

게다가 eval ()을 반드시 사용해야하는 상황은 없습니다. PHP는 그것 없이는 완전한 기능을 갖춘 프로그래밍 언어입니다.

실제로 이것을 악으로 보는지 아닌지 또는 경우에 따라 eval ()을 사용하여 개인적으로 정당화 할 수 있는지 여부는 귀하에게 달려 있습니다. 어떤 사람들에게는 악이 너무 커서 그것을 정당화 할 수없고 다른 사람들에게는 eval ()이 편리한 지름길입니다.

그러나 eval ()을 악하다고 생각하면 항상 악합니다. 문맥에 따라 마법처럼 악을 잃지 않습니다.


1
당신은 프로그래머를 지옥으로 만듭니다.
Christian

1
"또한 eval ()을 반드시 사용해야하는 상황은 없습니다."-PHP 문서에 제공된 예제에 따라 데이터베이스에 저장 한 코드를 실행하려면 어떻게해야합니까?
Yarin

4
이를 위해 데이터베이스에 PHP 코드를 저장하는 것은 똑같이 악하고 똑같이 불필요하다고 말할 것입니다. 원하는 것이 무엇이든간에 PHP를 데이터베이스에 저장하거나 eval ()을 사용하는 것 외에 다른 방법이 있습니다. 만약 당신이 원한다면 그것을하고 그것이 당신에게 도움이되는 지름길이라면 eval ()을 악으로 취급한다면 아마도 데이터베이스에 PHP를 저장하는 것도 악으로 취급해야 할 것입니다.
thomasrutter 2011 년

12
또 다른 공격 벡터를 추가합니다. SQL 주입은 웹 서버에서 임의의 PHP 코드를 실행할 수도 있습니다. eval ()을 사용해야합니다. 바이트 코드 캐시로 최적화 할 수 없습니다. 코드와 데이터를 분리하는 원칙을 위반합니다. 응용 프로그램의 이식성이 떨어질 수 있습니다. PHP를 업데이트 / 수정하려면 데이터베이스도 업데이트해야합니다.
thomasrutter 2011 년

3
eval을 통해서만 달성 할 수있는 것이 있다면 그 일을 재고 해 보는 것이 좋을 것 같습니다. 런타임에 동적으로 클래스를 만드는 것은 나쁜 생각처럼 보입니다. 일부 코드 생성을 사용하고 미리 정의하는 코드를 생성하지 않는 이유는 무엇입니까?
thomasrutter

15

이 경우 사용자가 테이블에 임의의 열을 생성 할 수없는 한 eval은 충분히 안전 할 수 있습니다.

그래도 더 이상 우아하지는 않습니다. 이것은 기본적으로 텍스트 구문 분석 문제이며 처리하기 위해 PHP의 구문 분석기를 남용하는 것은 약간 엉망인 것처럼 보입니다. 언어 기능을 남용하려면 JSON 파서를 남용하지 않는 이유는 무엇입니까? 적어도 JSON 파서에서는 코드 삽입의 가능성이 전혀 없습니다.

$json = str_replace(array(
    'enum', '(', ')', "'"), array)
    '',     '[', ']', "'"), $type);
$result = json_decode($json);

정규식이 아마도 가장 확실한 방법 일 것입니다. 단일 정규식을 사용하여이 문자열에서 모든 값을 추출 할 수 있습니다.

$extract_regex = '/
    (?<=,|enum\()   # Match strings that follow either a comma, or the string "enum("...
    \'      # ...then the opening quote mark...
    (.*?)       # ...and capture anything...
    \'      # ...up to the closing quote mark...
    /x';
preg_match_all($extract_regex, $type, $matches);
$result = $matches[1];

1
이것이 질문 자체에 대한 대답은 아니었지만, 이것은 질문에 대한 아주 좋은 대답입니다. enum ()을 구문 분석하는 가장 좋은 방법은 무엇일까요… 감사합니다;)
Pierre Spring

13

eval() 느리지 만 나는 그것을 악이라고 부르지 않을 것입니다.

코드 삽입으로 이어질 수 있고 악할 수있는 것은 우리가 만드는 나쁜 사용 입니다.

간단한 예 :

$_GET = 'echo 5 + 5 * 2;';
eval($_GET); // 15

해로운 예 :

$_GET = 'system("reboot");';
eval($_GET); // oops

사용하지 않는 것이 eval()좋지만 사용하는 경우 모든 입력의 유효성을 검사 / 허용하도록하십시오.


12

eval 내에서 외부 데이터 (예 : 사용자 입력)를 사용하는 경우.

위의 예에서 이것은 문제가 아닙니다.


7

여기서 콘텐츠를 노골적으로 훔칠 것입니다.

  1. 본질적으로 평가는 항상 보안 문제가 될 것입니다.

  2. 보안 문제 외에도 eval에는 믿을 수 없을 정도로 느린 문제도 있습니다. PHP 4.3.10에서 테스트 한 결과 일반 코드보다 10 배 느리고 PHP 5.1 베타 1에서는 28 배 느립니다.

blog.joshuaeichorn.com : using-eval-in-php


5

eval()입니다 항상 악.

  • 보안상의 이유로
  • 성능상의 이유로
  • 가독성 / 재사용 성 이유로
  • IDE / 도구 이유
  • 디버깅 이유로
  • 항상 더 나은 방법이 있습니다

@bracketworks :하지만 당신은 틀 렸습니다.이 모든 이질적인 문제들은 어떤 상황에서 마술처럼 사라지지 않습니다. 왜 그래야합니까? 성능을 예를 들어 보겠습니다. 인터프리터가 신비로운 "사악하지 않은"방식으로 사용했기 때문에 속도를 높이면서 매우 느린 eval () 함수를 실행할 것이라고 생각하십니까? 아니면 그 단계별 디버깅이 운이 좋은 날에 eval-clause 내에서 작동합니까?
Francois Bourgeois

3
솔직히 @ MichałRudnicki의 답변이 가장 잘한다고 생각합니다. 내가 (물어 때마다, 날 오해하지 마십시오 자신을 ) 질문과 대답은 eval()그냥 최대한 빨리 문제의 잘못을 요청했다고 가정 것; "올바른"대답은 드물지만 포괄적 인 상태에 대해서는 항상 악하다.
Dan Lugg 2013-06-17

데이터베이스에 코드를 저장하려면? 어떻게 실행할 수 있습니까?
Konstantin XFlash Stratigenas

@KonstantinXFlashStratigenas 데이터베이스에 실행 코드를 저장하는 이유를 스스로에게 물어봐야합니다. 데이터베이스는 코드가 아닌 코드에서 생성 된 데이터를위한 것입니다. 최소한 공격 벡터를 증가시키고 있습니다.
Jack B

4

나는 또한 당신의 코드를 유지하는 사람들에게 약간의 고려를 할 것입니다.

eval ()은 무슨 일이 일어나야하는지보기 만하는 것이 쉽지는 않습니다. 여러분의 예제는 그렇게 나쁘지는 않지만 다른 곳에서는 악몽이 될 수 있습니다.


4

개인적으로 코드가하는 일에 대해 주석을 달지 않기 때문에 코드가 여전히 매우 악하다고 생각합니다. 또한 입력의 유효성을 테스트하지 않아 매우 취약합니다.

또한 eval 사용의 95 % (또는 그 이상)가 적극적으로 위험하기 때문에 다른 경우에 제공 할 수있는 약간의 잠재적 인 시간 절약은 그것을 사용하는 나쁜 관행에 탐닉 할 가치가 없다고 생각합니다. 또한 나중에 미니언에게 eval 사용이 좋은 이유와 나쁜 이유를 나중에 설명해야합니다.

그리고 물론 PHP는 Perl처럼 보입니다.)

eval ()에는 두 가지 주요 문제가 있습니다 ( "주입 공격"시나리오) :

1) 해를 입힐 수 있습니다. 2) 단순히 충돌 할 수 있습니다.

기술보다 더 사회적입니다.

3) 다른 곳에서 지름길로 부적절하게 사용하도록 사람들을 유혹합니다.

첫 번째 경우에는 임의 코드 실행의 위험이 있습니다 (확실히 알려진 문자열을 평가할 때가 아니라). 그러나 귀하의 입력은 귀하가 생각하는 것처럼 알려 지거나 고정되지 않을 수 있습니다.

더 가능성이 높습니다 (이 경우) 당신은 단지 충돌하고 문자열은 불필요하게 모호한 오류 메시지와 함께 종료됩니다. IMHO, 모든 코드는 가능한 한 깔끔하게 실패해야하며 실패하면 예외가 발생해야합니다 (가장 처리하기 쉬운 오류 형식).

이 예에서는 행동으로 코딩하는 것이 아니라 우연으로 코딩하는 것이 좋습니다. 예, SQL enum 문 (그리고 필드의 enum이 확실합니까?-올바른 데이터베이스 버전의 오른쪽 테이블에서 올바른 필드를 호출 했습니까? 실제로 대답 했습니까?)은 PHP에서 배열 선언 구문처럼 보입니다. 그러나 나는 당신이 정말로 원하는 것은 입력에서 출력까지의 최단 경로를 찾는 것이 아니라 지정된 작업을 처리하는 것입니다.

  • 열거 형이 있는지 확인
  • 내부 목록 추출
  • 목록 값 압축 풀기

대략적으로 옵션 하나가 수행하는 작업이지만 명확성과 안전성을 위해 일부 if 및 주석을 래핑합니다 (예 : 첫 번째 일치 항목이 일치하지 않으면 예외를 throw하거나 null 결과를 설정).

이스케이프 된 쉼표 나 따옴표에는 여전히 몇 가지 문제가있을 수 있으며 데이터의 압축을 풀고 따옴표를 제거해야하지만 최소한 데이터를 코드가 아닌 데이터로 취급합니다.

preg_version을 사용하면 최악의 결과는 $ result = null 일 가능성이 높으며 eval 버전에서는 최악의 상황을 알 수 없지만 최소한 충돌은 발생합니다.


3

eval은 문자열을 코드로 평가합니다. 문제는 문자열이 어떤 식 으로든 "오염 된"경우 엄청난 보안 위협에 노출 될 수 있다는 것입니다. 일반적으로 문제는 사용자 입력이 문자열에서 평가되는 경우입니다. 많은 경우 사용자가 eval 내에서 실행되는 코드 (예 : php 또는 ssi)를 입력 할 수 있으며 php 스크립트와 동일한 권한으로 실행될 수 있습니다. 서버에 대한 정보 / 액세스를 얻는 데 사용됩니다. eval에 전달하기 전에 사용자 입력이 제대로 정리되었는지 확인하는 것은 매우 까다로울 수 있습니다. 다른 문제가 있습니다 ... 일부는 논쟁의 여지가 있습니다


3

PHP는 명시 적 평가를 수행하는 대신 call_user_func를 통해 실행할 수있는 방식으로 코드를 작성할 것을 권장합니다.


2

또 다른 이유 eval는 eAccelertor 또는 ACP와 같은 PHP 바이트 코드 캐시에 의해 캐시 될 수 없다는 것입니다.


2

함수가 아니라 eval ()을 악하게 만드는 것은 나쁜 프로그래밍입니다. 여러 사이트에서 동적 프로그래밍을 할 수 없기 때문에 가끔 사용합니다. 내가 원하는 것을받지 못하므로 한 사이트에서 PHP를 구문 분석 할 수 없습니다. 나는 단지 결과를받을 것이다! eval () 함수가 존재하는 것이 기쁩니다. 그것이 제 삶을 훨씬 더 쉽게 만들어주기 때문입니다. 사용자 입력? 나쁜 프로그래머들만이 해커들에게 연결됩니다. 나는 그것에 대해 걱정하지 않습니다.


2

함수가 아니라 eval ()을 악하게 만드는 것은 나쁜 프로그래밍입니다. 여러 사이트에서 동적 프로그래밍을 할 수 없기 때문에 가끔 사용합니다. 내가 원하는 것을받지 못하므로 한 사이트에서 PHP를 구문 분석 할 수 없습니다. 나는 단지 결과를받을 것이다! eval () 함수가 존재하는 것이 기쁩니다. 그것이 제 삶을 훨씬 더 쉽게 만들어주기 때문입니다. 사용자 입력? 나쁜 프로그래머들만이 해커들에게 연결됩니다. 나는 그것에 대해 걱정하지 않습니다.

곧 심각한 문제가 생길 것으로 예상합니다 ...

솔직히 말해서 PHP와 같은 해석 언어에서 eval과 같은 엄청난 함수를 사용하는 것은 절대적으로 좋지 않습니다. 다른 안전한 방법으로 실행할 수 없었던 eval이 프로그램 기능을 수행하는 것을 본 적이 없습니다.

평가는 모든 악의 근원이며, 사용자 입력 테스트가 도움이 될 것이라고 생각하는 모든 사람들에게 전적으로 동의합니다. 다시 생각해보십시오. 사용자 입력은 다양한 형태로 제공 될 수 있으며 해커는 사용자가 충분히 신경 쓰지 않은 기능을 악용하고 있습니다. 제 생각에는 평가를 아예 피하십시오.

내 창의력을 능가하는 평가 기능을 남용하기 위해 만들어진 예제를 보았습니다. 보안 입장에서, 모든 비용을 피하십시오. 그리고 나는 '주어진'것이 아니라 최소한 PHP 구성의 옵션이되도록 요구할 수 있습니다.


"아무리 신중하게 기능 X에 대한 코드 보안을 시도하더라도 스마트 해커는 항상 한 발 앞서 있습니다 ..." 라는 추론은 X ==뿐만 아니라 다른 모든 기술에도 적용될 수 있습니다 eval. 따라서 모든 기능에 대해 X : X는 모든 평가의 근원입니다 ... 어 ... 악, 그러니 프로그래밍을 완전히 포기하는 것이 좋습니다 (따라서 바보 같은 해커 아래에서 카펫을 끌어내어 결국에는 여전히 능가합니다).
Sz.

"eval과 같은 엄청난 함수는 절대로 좋은 용도가 아닙니다."-> '절대'와 같은 단어를 사용할 수있는 사람은 프로그래밍에 익숙하지 않거나 나쁜 프로그래머입니다.
unity100

2

다음은 eval을 사용하지 않고 데이터베이스에서 가져온 PHP 코드를 실행하는 솔루션입니다. 범위 내 모든 기능 및 예외 허용 :

$rowId=1;  //database row id
$code="echo 'hello'; echo '\nThis is a test\n'; echo date(\"Y-m-d\");"; //php code pulled from database

$func="func{$rowId}";

file_put_contents('/tmp/tempFunction.php',"<?php\nfunction $func() {\n global \$rowId;\n$code\n}\n".chr(63).">");

include '/tmp/tempFunction.php';
call_user_func($func);
unlink ('/tmp/tempFunction.php');

기본적으로 텍스트 파일에 포함 된 코드를 사용하여 고유 한 함수를 만들고 파일을 포함하고 함수를 호출 한 다음 작업이 완료되면 파일을 제거합니다. 나는 이것을 사용하여 매일 데이터베이스 수집 / 동기화를 수행하고 있으며 모든 단계에서 처리하기 위해 고유 한 코드가 필요합니다. 이것은 내가 직면했던 모든 문제를 해결했습니다.


이것은 답변에 대한 응답처럼 보입니다. 가능한 한 게시하십시오.
rfornal

1

나는 eval ()을 많이 사용했지만, 트릭을하기 위해 eval을 사용할 필요가없는 대부분의 경우를 발견했습니다. 음, PHP에는 call_user_func ()와 call_user_func_array ()가 있습니다. 모든 메서드를 정적이고 동적으로 호출하는 것으로 충분합니다.

정적 호출을 수행하려면 콜백을 array ( 'class_name', 'method_name') 또는 'class_name :: method_name'과 같은 간단한 문자열로 구성하십시오. 동적 호출을 수행하려면 array ($ object, 'method') 스타일 콜백을 사용하십시오.

eval ()의 유일한 현명한 용도는 사용자 정의 컴파일러를 작성하는 것입니다. 나는 하나를 만들었지 만 eval은 디버그하기가 너무 어렵 기 때문에 여전히 악합니다. 최악의 것은 평가 된 코드의 치명적인 오류가이를 호출 한 코드와 충돌한다는 것입니다. 최소한 구문을 확인하기 위해 Parsekit PECL 확장을 사용했지만 여전히 기쁨이 없습니다. 알 수없는 클래스와 전체 앱 충돌을 참조하려고합니다.


0

보안 문제 이외는 평가 후면 (), 컴파일 최적화 또는 옵 코드는 따라서 그것은에 allways 느려집니다, 캐시 할 수 없습니다 - 느린 방법 - 일반의 PHP 코드보다. 따라서 eval을 사용하는 것은 성능이 좋지 않지만 그것이 악하게 만들지는 않습니다. ( goto악, eval나쁜 습관 / 냄새 나는 코드 / 못생긴)


eval보다 낮은 사악한 등급을 goto받습니까? 반대 일인가요?
JLRishe 2014 년

goto5.3에서 실제로 구현 한 PHP 개발자에 대해 원한을 품고 있습니다.
Aron Cederholm 2014 년

1
아니, goto-fobians : 도구가 있고 그것을 사용하거나 사용하지 않는 장인이 있습니다. 하지 않습니다 오히려 적절한 도구를 (제대로) 사용할 수없는 실수를 할 때 바보 같은 전문적인 모양을 만드는 도구,하지만. 그러나입니다 항상 ... 비난의 도구
Sz를.

0

대부분의 사람들은 사용자 입력을 다룰 때 위험 할 수 있다는 사실을 지적 할 것입니다.

나에게 최악의 부분은 코드의 유지 관리 가능성을 줄이는 것입니다.

  • 디버그하기 어려움
  • 업데이트하기 어려움
  • 도구 및 도우미 (예 : IDE)의 사용을 제한합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.