2010-04-30 2 views
9

필자는 Encoding::FixLatin Perl 모듈을 수정하여 과도한 UTF-8 바이트 시퀀스를 처리하고이를 가장 짧은 일반 형식으로 변환했습니다.UTF-8 문자열을 가장 짧은 일반 형식으로 변환해야합니까?

내 질문에 "이 나쁜 생각입니까?"입니다.

많은 소스 (this RFC 포함)는 긴 길이의 UTF-8은 오류로 간주되어 거부되어야한다고 제안합니다. 그들은 "순진 구현"에주의하고 이러한 것들이 본질적으로 안전하지 않다는 인상을받습니다.

내 모듈의 목적이 혼합 된 인코딩으로 지저분한 데이터 파일을 정리하고 멋진 깨끗한 utf8로 변환하기 때문에 응용 프로그램 계층을 처리 할 필요가 없도록 정리할 수있는 한 가지 더있는 것처럼 보입니다. 그것으로. 내 코드는 결과적인 문자가 가질 수있는 의미 론적 의미와 관련이 없으며 단순히 정규화 된 형식으로 변환합니다.

뭔가 누락되었습니다. 내가 고려하지 않은 숨겨진 위험이 있습니까?

답변

4

예, 이것은 좋지 않은 아이디어입니다.

어쩌면이 지저분한 데이터 파일 중 하나에있는 데이터 중 일부가 위험한 ASCII 문자 시퀀스가 ​​포함되어 있지 않은지 확인하기 위해 검사했을 수 있습니다.

많은 문제를 일으킨 표준 예 : '\xC0\xBCscript>'. overlong 시퀀스를 일반 ASCII <으로 '수정'하여 실수로 보안 구멍을 만들었습니다.

어떤 합법적 인 목적으로도 도구가 과잉을 생성하지 않았습니다. 혼합 인코딩 파일을 복구하려는 경우 인코딩을 잘못 추측했다는 표시로 간주해야합니다.

+0

을 오류를 통지하지 않습니다 것을 알고 난 당신의 논리를 따르지 않는 두려워 .내 모듈은 응용 프로그램이 아니며 데이터 필터입니다. 나는 본질적으로 '

2

나는 이것이 보안 또는 유용성 관점에서 나쁜 생각이라고 생각하지 않습니다.

보안 관점에서 사용자는 사용하기 전에 사용자 입력을 암호화해야합니다. 따라서 정리 루틴을 실행 한 다음 데이터가 인쇄되기 전에보다 큰 /보다 작은 기호 <>을 포함하지 않는지 확인하십시오. 또한 데이터베이스에 삽입하기 전에 mysql_real_escape_string()을 호출해야한다. GBK와 Latin1 같은 언어 인코딩 문제는 mysql_real_escape_string()을 사용하지 않을 때 sql injection으로 이어질 수 있습니다. (이 함수 이름은 플랫폼에 특정한 mysql 라이브러리 바인딩에 관계없이 꽤 비슷해야합니다.)

모든 사용자 입력을 살균하는 것은 특정 변수의 사용법을 모르기 때문에 일반적으로 끔찍한 생각입니다. 예를 들어 sql injection과 xss에는 매우 다른 제어 문자가 포함되어 있으며 두 가지 모두에 대해 동일한 민감도가 종종 취약성을 유발합니다.

1

시나리오에서 나쁜 생각인지는 모르겠지만 이런 종류의 변화가 전체적인 것이 아니기 때문에 데이터가 손실 될 수 있습니다.

데이터 인코딩을 잘못 감지 한 경우 데이터를 합법적 인 UTF-8 오버롱으로 해석하고 가장 짧은 일반 형식으로 변경할 수 있습니다. 나중에 원래 데이터를 검색 할 방법이 없습니다.

는 개인적인 경험으로, 나는 그런 일이 발생할 수 있습니다 때 너무 늦기 전에, 그들은 당신이 잠재적으로 ...

+0

답변 해 주셔서 감사합니다. 알려진 단일 바이트 인코딩에서 UTF-8로 변환하는 것과 별개로 설명하는 상황을 처리 할 수있는 안전한 방법은 없습니다.이 경우 오버런 시퀀스가 ​​발생하지 않습니다. Encoding :: FixLatin이 차지하는 틈새는 여러 인코딩의 문자가 포함 된 데이터를 정리하는 것입니다. 사용 된 경험적 방법은 데이터 손상을 초래할 가능성이 있으며 모듈 문서는 위험을 설명합니다. –

관련 문제