[문제해결] UTF-8 + BOM 인코딩 2015-06-16

1. 문제상황

> json파일을 업로드하여 데이터를 저장하는 툴을 개발중에 전달받은 샘플 파일이 파싱이 되지 않는 문제가 발생하였다.

$readJson = file_get_contents($_FILES['json_file']['tmp_name']);

2. 문제확인

> 파일은 정상적으로 업로드 되는것으로 보여 읽어드린 스트링을 로그로 남겨 보았다.

DEBUG - 2015-06-16 06:38:33 --> 癤?
	{
		"index":1,
		"name":"a",
		"gold":0,
		"resource":"A"
	},
	{
		"index":2,
		"name":"b",
		"gold":1000,
		"resource":"B"
	},
	{
		"index":3,
		"name":"c",
		"gold":2000,
		"resource":"C"
	}
]

* 앞의 첫글짜가 깨져있다.

> 샘플파일의 인코딩을 확인해 보니 UTF-8 + BOM 형태였다. 윈도우즈의 특정 에디터(메모장 등)로 저장시 자동으로 BOM(Byte Of Mark)을 집어 넣는다고 한다. BOM은 유니코드 인코딩 방식인 UTF-8, UTF-16, UTF-32의 문서 맨앞에 특정 바이트를 넣어 인코딩 방식을 명시 하는 것으로 {UTF-8 : “EF BB BF”}, {UTF-16(Big Endian) : “FE FF”}, {UTF-16(Little Endian) : “FF FE”}, {UTF-32(Big Endian) : “00 00 FE FF”}, {UTF-32(Little Endian) : “FF FE 00 00”} 이 문서 맨에 붙게 된다.

UTF-8 BOM


3. 문제해결

> 파일을 읽어들여 다음 코드로 BOM을 제거 한 후 파싱을 하도록 한다.

$readJson = file_get_contents($_FILES['json_file']['tmp_name']);
				
// BOM 필터링
if (substr($readJson, 0, 3) == "\xEF\xBB\xBF") {
	$readJson = substr($readJson, 3);
}

[TIP] 아파치 인증 2015-04-22

간단하게 인증이 필요한 페이지를 개발하고자 할때 아파치에서 제공하는 인증기능을 사용할 수 있다. 디자인이 필요없고 서버단에서의 세션관리 기능을 구현할 필요가 없어 편리하다.
윈도우 리눅스 모두 가능하다.

 

1. 접근경로 최상위 폴더에 .htaccess파일을 생성하고 다음과 같이 설정한다.
AuthName "{인증명 - 인증창에 보여지게 됨}"
AuthType Basic  #인증유형 기본 Basic
AuthUserFile {인증정보저장 경로}/.htpasswd
#AuthGroupFile {그룹명}    # 그룹별 인증 원할경우
# GET POST 방식의 접근만 허용하도록 설정
<Limit GET POST>
   require valid-user   # 인증된 사람만이 접속을 허용
</Limit>
2. htpasswd 명령을 실행하여 사용자를 생성합니다.
# 최초 생성
{apache 경로}/bin/htpasswd -c .htpasswd {아이디}
# 아이디 추가
{apache 경로}/bin/htpasswd .htpasswd {아이디}
3. 인증창에 설정한 아이디 비밀번호를 입력해야만 접근이 가능함

apacheAuth

4. 인증된 상태로만 유지될 경우 보안에 문제가 생기므로 다음과 같이 로그아웃을 처리해야만 함
header('HTTP/1.1 401 Unauthorized', true, 401);
echo "{화면에 표시될 로그아웃 메시지 (※ html로 구성가능)}";
exit;

 

[PHP] 여러줄의 문자열 다루기 (HereDoc) 2014-09-29

> 웹서비스 작업시 html 혹은 javascript로 표현될 부분을 변수에 담아야 하는 경우가 있다. PHP에서는 여러줄의 문자열을 쉽게 변수에 담을 수 있는 문법을 제공한다.

>>> PHP 4.0이상 부터 제공되며 다음과 같은 형태를 따른다.
$code = <<<{구분명}
<script type="text/javascript">
	location.href = "{$url}"
</script>
{구분명};
echo $code;
>>>>>> description
– 구분명에는 대부분 EOD(End Of Document)를 사용하나 다른 단어도 상관없다.
– <<<{구분명} 또는 {구분명}; 뒤에는 어떤 글자가나 공백이 있어서는 안된다.