[CodeIgniter] User Agent 클래스 사용 시 OS 정보 추가하는 방법

코드이그나이터(CodeIgniter)에서 제공되는 user_agent 클래스의 os 정보 추줄 메소드 사용 시 “Uknown Windows OS” 라고 출력되는 경우가 있습니다.

이는 user agent 값의 문자열 중 os 정보를 읽었으나 정확한 버전을 알 수 없어 “Window이긴한데 버전을 모르겠어”라는 식으로 출력이 되는 것입니다. 즉, “이 문자열은 Windows의 몇 버전이다.”라고 정의를 해줘야 합니다.

코드이그나이터 2.x 버전 기준으로 /application/config/user_agents.php 파일에서 정의를 추가해줄 수 있습니다. $platforms 배열에서 아래 내용을 추가 해줍니다.

저의 경우에는 Windows 7부터 정의가 되어있지 않아 Windows 7부터 10까지 추가했습니다. 그리고 다시 시도해보시면 버전이 정확하게 출력될 것 입니다.

[CI] 로그인시 Session은 처리됐는데 로그인이 안되는 경우

하아.. 이걸로 고생을 좀 한 것 같습니다. 여러 PC로 로그인 테스트를 하던 중 Session은 문제 없이 처리가 되었는데 로그인이 되지 않았습니다. Session 등록 직후 값을 찍어보면 찍히는데 로그인 완료 화면에서 Session을 찍어보면 빈 값으로 출력되는 문제가 있었습니다.

에러로그에도 아무런 문제가 나타나지 않고 특정 PC에서만 발생하니 더 난해한 문제였습니다.

그런데 간단하게 해결이 되었습니다.

해결 방법

1. /application/config/config.php 파일을 엽니다.

2. $config[‘sess_match_useragent’] 값을 TRUE에서 FALSE로 변경합니다.

3. 로그인을 시도해봅니다.

기본적으로 CodeIgniter에서는 Session 데이터 옵션에 User_Agent를 매칭하는 옵션이 설정되어있습니다. 그런데 이 부분에서 문제가 좀 있는 것 같더군요. codeigniter session으로 검색하면 많은 질문글이 올라오는데 저와 같은 증상이었죠.

[CI] Session 데이터를 DB로 저장하는 방법

Session은 일반 적으로 파일로 저장하거나 DB에 저장할 수 있습니다. 기본 값으로는 파일로 저장되도록 설정이 되어있습니다.

이를 DB로 저장하는 방법을 소개드립니다.

1. /application/config/config.php 파일을 열어 아래 내용과 같이 수정 합니다.

sess_table_name은 ci_session으로 이름을 달리하고 싶은 경우 변경하셔도 무방합니다. 단, sess_cookie_name 의 값도 변경된 이름과 동일하게 맞춰주셔야 합니다.

2. ci_session 테이블을 만듭니다. 저장될 DB 테이블을 설정하셨다면 테이블이 필요하겠죠. ci_session 테이블의 스키마는 아래와 같습니다.

3. 로그인을 테스트해봅니다. 로그인을 시도해본 후 ci_session 테이블에 데이터가 쌓이는지 확인해보는 것으로 마무리가 됩니다.

 

 

 

[CI] php.ini에서 error_reporting 설정을 해도 반영이 안되는 경우

php.ini에서 아무리 error_reporting 값을 변경해도 CI에서는 반영이 되지 않습니다.

그 이유는 CI 자체에서 error_reporting 값을 상수로 잡고 있기 때문입니다.

아주 친절하게 설명이 되어있지만 저처럼 이 부분을 미리 숙지하지 못해 php.ini를 마구 수정하거나 아파치를 무한 restart하는 삽질을 하는 불상사가 없기를 바랍니다.

아래 파일은 CI의 최상위 루트에 존재하는 index.php 파일의 일부입니다. 파일을 열자마자 보이는 내용입니다.  이렇게 친절한 설명을 두고도 삽질을 하다니 ㅠㅠ

보시면 아시겠지만 ENVIRONMENT 라는 상수로 에러 출력 여부를 정의하고 있습니다. 기본값은 production이 아닌 development로 되어있습니다. 즉, E_ALL = “모든 에러와 경고를 보여주겠다” 로 되어있던 것이죠.

개발을 완료하고 릴리즈 할땐 production으로 상수 값을 변경해줍니다.

개발이나 디버깅 시에는 testing 으로 상수를 변경하시고 switch 문에서 에러 출력 범위를 정해주시면 됩니다.

난 php.ini 설정대로 갔으면 한다! 하는 분은 뭐 저 부분을 날리셔도 되겠지만 프레임워크에서 정한 룰은 최대한 지켜가며 사용해야 한다는게 저의 생각입니다.

[CI] hwp 파일 업로드가 안되는 문제

파일 업로드 기능을 CodeIgniter 로 작업하고 있는데 hwp 파일만 서버가 인식하지 못하고 업로드를 하지 못하는 증상이 발생했습니다. 물론 다른 이미지나 zip, doc, ppt 파일등은 정상적으로 업로드가 되고 있었습니다.

전에 mime type 정보가 없어 업로드 되지 않는 증상이 있어 mimes.php 에도 이미 hwp 확장명에 대한 정의를 한 상태 였고 이상이 세팅에는 없었습니다.  이 상태로 개발서버로 옮겨 테스트해보니 증상이 발견되지 않아 서버 세팅의 문제 여부도 보였기 때문에 서버 세팅도 비교해봤지만 상이한 점은 없었습니다.

그래서 CI의 core 안에 있는 Upload 클래스를 뜯어보았습니다. 관련된 upload_do 메소드와 is_allowed_filetype 메소드를 디버깅하기 위해 true/false로 찍히는 리턴값을 일일히 값을 찍어 확인해봤습니다. 그런데 리턴값을 bool형식이 아닌 string이나 int 값으로 리턴하면 hwp 확장명을 인식합니다. -_-;;

디버깅을 해보니 CI의 file_type 은 “CDF V2 Document,corrupt: Cannot read summary info.”
$_FILE의 type 속성은 “application/haansofthwp”
CI 업로드 에러 메세지는 “The filetype you are attempting to upload is not allowed”

 

이렇게 나왔습니다.. CI upload 객체는 file_type을 읽어오기 때문에 $_FILE 속성이 제대로 잡혀있다해도 업로드 로직에 이상이 생길 수 밖에 없습니다.

core를 뜯어 고치는건 좀 무리수가 아닌가 생각이 되어 증상만 확인하고 일단 접어두었습니다.

다른 사례를 찾아보니 이 분도 저와 같은 증상.. 결국 allowed_types 속성을 * 로 처리해서 임시로 해결했다고 합니다. 저도 *로 설정해 모든 확장자를 받아들이도록 하니 또 잘됩니다. -_-;;;

하지만 allowed_types 값을 모두 허용해버리면 보안상 문제가 되기 때문에 별도 처리가 필요했습니다.

1. allowed_types 을 허용할 확장자로 세팅해서 초기화 시킵니다.
2. 업로드 된 파일의 이름을 읽어 확장자를 구합니다.
3. 확장자가 hwp 인 경우 allowed_types 값을 *로 바꿔줍니다.

allowed_types 세팅은 유지한채 hwp를 업로드하는 경우 설정을 임시로 변경해주는 방법입니다. 이 방법이 최선이었습니다. -_-;

hwp 파일에 대한 이슈는 글쎄요.. 해외에서는 그렇게 알려지지 않은 파일 형식이라 사례를 찾아보기도 힘들었습니다. 국내에서도 자료는 마찬가지로 찾아보기 힘들더군요..

CI의 버그가 아닌가 조심스레 짐작해보지만 일단 이렇게 해결을 해봅니다.

[Codeigniter] is_file, file_exists 사용시 경로를 FALSE로 리턴하는 경우

PHP로 개발 하면서 파일의 유무를 알기 위해서 is_file이나 file_exists 를 많이 사용합니다.

코드이그나이터에서도 예외는 아니죠. 하지만 기존 PHP와 코드이그나이터에서 위 함수의 경로를 읽어들이는 방법이 다릅니다.

PHP에서는 웹사이트의 도큐먼트루트를 참초해 파일을 찾지만 코드이그나이터에서는 HOME 디렉토리에서 부터 파일을 찾게 됩니다. 그러므로 기존 PHP에서 사용하던 is_file(‘/aaa/bbb/ccc.js’); 와 같은 코드를 코드이그나이터에서 그대로 쓰면 FALSE값을 리턴하게 됩니다. 코드이그나이터에서는 경로를 시스템루트에서부터 읽어 들이기에 경로부분을 조금 달리해야합니다.

코드이그나이터에서는 시스템루트에서 도큐먼트루트까지의 경로를 상수를 이용해 쉽게 구해올 수 있습니다,

제공되는 상수 중에서 FCPATH 라는 녀석입니다.

위 파일 경로에서 수정을 한다면 is_file(FCPATH . ‘/aaa/bbb/ccc.js’); 로 상수를 추가해주시면 됩니다.

[PHP] CI (코드이그나이터) POST 전송 보안처리 방법

POST로 들어오는 모든 값에 대해 XSS clean 처리를 해줌