Ruby on Rails 3 양식의 _snowman 매개 변수는 무엇입니까?


174

Ruby on Rails 3 (현재 베타 4 사용)에서 form_tag또는 form_for헬퍼 를 사용할 때 _snowman값이 ☃ ( Unicode) 인 숨겨진 필드가 있음을 알 수 있습니다. \ x9731) 인 나타납니다.

그래서이게 뭐야?


2
이것은 '문서화'유형 Q & A입니다. 여기서 답을 찾고 커밋 메시지를 파헤쳐 서 눈사람에 대해 궁금해하는 다른 사람들을 위해 여기에서 공유하겠다고 생각했습니다 ...
Matthew Savage

답변:


308

Internet Explorer (5, 6, 7 8)가 해당 매개 변수를 유니 코드로 인코딩하도록하기 위해이 매개 변수가 양식에 추가되었습니다 .

특히, 사용자가 브라우저의 인코딩을 Latin-1로 전환하면이 버그가 발생할 수 있습니다. 사용자가 왜 그렇게 미치게 행동하기로 결정했는지 이해하려면 이 Google 검색을 확인하십시오 . 사용자가 웹 사이트를 라틴 -1 모드로 설정 한 후 라틴 -1과 유니 코드로 이해 될 수있는 문자 (예 : é 또는 ç, 이름에서 공통)를 사용하는 경우 Internet Explorer는 라틴어로 인코딩합니다. -1.

이는 사용자가 "Ché Guevara"를 검색하면 서버 측에서 잘못 통과 함을 의미합니다. Ruby 1.9에서는 텍스트가 필연적으로 정규 표현식 엔진으로 들어갈 때 인코딩 오류가 발생합니다. Ruby 1.8에서는 사용자에게 결과가 깨집니다.

IE에서 유니 코드 문자로만 이해할 수있는 매개 변수를 만들면 IE는 accept-charset 특성을보고 강제로 인코딩하여 모든 문자를 UTF-8로 인코딩하도록 지시합니다. 라틴어 -1.

Ruby 1.8에서는 라틴 -1 데이터를 UTF-8 데이터베이스로 가져 오는 것이 매우 사소한 일임을 명심하십시오 ( 전체 스택에서 사용자가 어떤 시점에서 보냈던 바이트가 유효한 UTF-8 문자인지 검사 하지 않기 때문에 ). 결과적으로 Ruby 응용 프로그램 (및 PHP 응용 프로그램 등)이이 사용자 관련 버그를 나타내는 것이 매우 일반적이므로 사용자는 완화 조치로 인코딩을 변경하려고 시도하는 것이 매우 일반적입니다.

이 패치를 작성할 때 매개 변수의 이름이 사용자가있는 장소 (검색 양식과 같은 GET 조치를 사용하는 양식과 관련됨)에 나타날 것임을 알지 못했습니다. 그렇게하기 때문에이 매개 변수의 이름을로 바꾸고 _e더 무해한 유니 코드 문자를 사용합니다.


1
이것이 _method와 같은 투명한 매개 변수로 끝나면 혼란스럽지 않을 것입니다. 그래도 해결해야 할 미친 짓입니다.
tadman

1
자세한 답변 감사합니다 Yehuda-비록 눈사람을 유지하는 것이 아마도 가장 좋은 결과라고 생각합니다. 이것은 게임이 아니라 사업입니다! '.. 어.
Matthew Savage

1
@Matthew, 이상하게도 당신이 옳습니다. 그러나 나는 해결책이 인상적이라고 생각합니다.
JP Silvashy

10
이후 눈사람은 값이 "& # x2713"인 utf8이라는 숨겨진 입력으로 대체되었습니다. 언어 스위처에 form_tag를 사용하고 하나의 크롤러 가이 값에 문제가있는 것으로 보이고 utf8 매개 변수와 그 값을 양식의 선택 옵션 값과 잘못 연결하기 때문에 많은 예외가 발생하기 시작했습니다.
Christer Fernstrom

56

이것은 Internet Explorer 5를 지원 하고 양식에 UTF-8 을 사용하도록 권장합니다 .

여기에 표시된 커밋 메시지 는 다음과 같이 자세히 설명합니다.

몇 가지 알려진 웹 인코딩 문제를 해결하십시오.

  • 모든 양식에 accept-charset을 지정하십시오. IE5 +뿐만 아니라 모든 최신 브라우저는 양식 매개 변수에 지정된 인코딩을 사용합니다.
  • 불행히도 IE5 +는 폼의 값에서 적어도 하나의 문자가 페이지의 문자 집합에 있지 않으면 accept- 문자 집합을 보지 않습니다. 사용자가 기본값을 무시할 수 있기 때문에
    문자 세트 (Rails가 UTF-8로 설정)를 유니 코드 문자를 포함하는 숨겨진 입력을 제공하여 IE가 accept-charset을 보도록합니다.
  • 이제 대부분의 웹 입력이 UTF-8이므로 인바운드 매개 변수를 UTF-8로 설정했습니다. 이것은 ASCII-8BIT와
    UTF-8 사이에 호환되지 않는 인코딩의 많은 경우를 제거 합니다.
  • params [: _ snowman]를 안전하게 무시할 수 있습니다

즉,이 매개 변수를 무시해도됩니다.

여전히 Internet Explorer 5와 같은 오래된 기술을 지원하는 이유는 확실하지 않습니다. 요청하면 Ruby on Rails가 아닌 결정처럼 보입니다.


7
인용문에 "IE5 +"라고 표시되어 있으므로 최신 IE 버전에서도 문제가 발생합니까?
Philipp

5
더 긴 응답을 원하시면 github.com/rails/rails/commit/…보십시오 (또한 아래의 응답 참조).
Yehuda Katz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.