2017년 2월 9일 목요일

php에서 메일제목 한글이 깨질때


php에서 한글인코딩을 보낼 경우 한글이깨지는 경우가 발생한다.



상황

- 홈페이지(php, linux, mysql)에서 메일(linux)을 보내는데 한글이 깨짐 

현상확인


#그림1
  (그림1 다음메일)


그렇다고 모두 그런것은 아니다.

#그림2
(그림2. 네이버 메일)


많이 쓰는 메일들에 대해서 테스트 해보았는데
(gmail, naver, daum or hanmail, nate 그리고 회사메일)
daum과 회사메일이 그림1과 같은 현상이 발생되었다.





그럼 원인에 대해서 생각해보자

1. 메일서버
2. 웹서버
3. DB
4. backend 언어
5. etc...


그럼 하나씩 짚고 넘어가보자

1. 메일서버 (x)
3. DB (x)
  - 기존 언어(asp, mysql) 홈페이지에서 메일(linux)을 보냈을때 정상적으로 발송됨

2. 웹서버의 문제
  - 리눅스서버 설정은 확인하고 조작해보기 힘드므로 마지막순위로 밀겠다

4. backend 언어(php)
- 남은건 이거 하나


해결

1. php한글깨짐을 검색해보면 관련 블로그가 많다



내용을 살펴보면 메일을 보낼때 헤더값으로 관련 정보를 넘겨준다.
넘겨줄때

$subject = "메일제목";

이럴경우

$subject = '=?UTF-8?B?'.base64_encode( "메일제목" ).'?=';

으로 utf-8로 메일을 보낸다는것을 명시해주면 된다.

기본적으로 메일을 보낼때 ASCII 문자열로 넘어가기때문에 인코딩에 대한 명시를 해줘야된다 한다.

이러한 형태로 인코딩을 적용되어 될 부분은 한글이 들어가야되는 부분(보내는이 이름, 받는이 이름) 들도 포함이다. 
그리고 내용은 하지말아야 한다.(해보니까 더 깨진다.. 그냥 보내야 정상임)
이부분에 대해선 더 확인해봐야될듯 하다.












2016년 12월 28일 수요일

HTTP Referer ?? HTTP Referrer ??

원래 Referrer 라고 써야하지만, 필립 할람-베이커Phillip Hallam-Baker가 HTTP스펙에 필드를 추가로 제안할때 오타로 Referer로 기재함.
오타가 그대로 표준에 반영되어 RFC-1945 문서에 포함됐고, 현재까지 Referer로 사용하고 있다.

2016년 12월 27일 화요일

제로데이 공격(Zero-Day Attack)

제로 데이 공격(또는 제로 데이 위협, Zero-Day Attack)은 컴퓨터 소프트웨어의 취약점을 공격하는 기술적 위협으로, 해당 취약점에 대한 패치가 나오지 않은 시점에서 이루어지는 공격을 말한다. 이러한 시점에서 만들어진 취약점 공격(익스플로잇)을 제로 데이 취약점 공격이라고도 한다.

2016년 12월 21일 수요일

드라이브 바이(drive by), 파밍(pharming) 공격

드라이브 바이(drive by)
~쪽으로 자동차를 운전하다 라는 의미
온라인 광고업체에서 사용자가 아무런 의심없이 동의버튼을 누르는 버릇을 악용해 광고 콘텐츠 설치 유도(드라이브 바이 인스톨 - drive by install) 또는 한번 클릭하는 선택적 설치(one click opt install)
사용자의 동의 없이 자동으로 악성코드 다운로드 및 실행하는 현상


파밍(pharming)
악성코드 또는 다른 공격으로 인해 DNS가 변경되어 피싱사이트로 유도하는 공격
c:\window\system\drivers\etc 에 존재하는 host 파일 조작 혹은 레지스트리를 변조시켜 로컬프락시 설정, 악성코드 자체가 로컬 DNS가 되는 방식도 있다.

2016년 11월 30일 수요일

페인트공 알고리즘, 마세라티 문제, 야크 털 깎기

페인트공 알고리즘

1. 페인트공이 첫날은 차선 페인트 작업을 300야드 칠함
2. 둘째날은 150야드 칠함
3. 셋째날은 30야드 칠함, 첫날은 어떻게 10배를 칠했는지 관리자가 묻자
   "저도 어쩔 수 없었습니다. 매일 페인트 통에서 점점 멀어지니까요."

- 조엘 스폴스키의 “조엘 온 소프트웨어” 중

--> 일정 이상 규모가 되면 급격히 성능 저하되고 문제를 일으키는 코드


마세라티 문제

1. 어떤 마세라티 모델과 색상을 구매할 지 고민하는 것.
2. 나중에 마세라티 살 능력이 됐을 때 할 고민을 미리 하는 것.

* 돈 많은 금융과 증권계에서는 “boat naming” 이라고 함.
* 당장 필요하지 않은 기술을 담보되지 않은 미래의 큰 성공에 대비하여 준비하는 것
* 천만명을 처리할 서비스는 사용자가 10만은 됐을 때 고민
* 엔지니어만 있는 스타트업에서 자주 발생하는 현상

야크 털깍기(Yak Shaving)
어떤 목적을 달성하기 위해 전혀 상관없는 연속된 작업을 해야 하는 상황.
그중 마지막 작업이 야크 털깍기

봄이 와서 세차를 하려는데 호스가 터졌음
차로 홈 디포우에 가서 호스를 사려보니 다리를 지나야 하는데 통행 카드가 필요
통행카드가 없어서 옆집 Bob 한테 빌리려는데
아들이 캠핑가려고 Bob 한테 베개를 빌린 후에 안 갖다 줌

그런데 베개에 있는 야크털이 많이 빠져서 지금 베개를 갖다 줄 수 없음
그래서 세차를 하기 위해 동물원에 가서 야크 털을 깍는중
       
        - 세스 고딘의 “이제는 작은 것이 큰 것이다“ 중

     
* 야크 털깍기로 배우는 것도 많지만 문제는 일정
* 예정보다 많은 시간이 소요된다면 잠시 멈출 것
* 하려고 했던게 무엇인지 떠올려 보고 야크털깍기라 생각되면 했던 일을 과감히 중지

2016년 9월 9일 금요일

datepicker 삭제 버튼(firefox 오류수정 버전)

jquery datepicker를 사용 할 경우 해당 input text를 삭제버튼으로 한번에 내용을 제거 하고 싶을때가 있다.

1.
그래서 얼마전까지 사용했던 방법은 jquery 초기화 옵션중에

            showButtonPanel: true, // 캘린더 하단에 버튼 패널을 표시한다. 

showButtonPanel 옵션을 true로 주면

이렇게 [오늘날짜]와 [닫기] 버튼이 최초에 생긴다.


2. 이 닫기 버튼의 이름을 clear로 변경
3. 닫기 버튼을 눌렀을때 해당 input text를 clear해주는 이벤트를 bind 해준다.


 closeText: 'clear'
 ,onClose: function (dateText, inst) {
   if ($(window.event.srcElement).hasClass('ui-datepicker-close'))
   {
     document.getElementById(this.id).value = '';
   }
 }

이렇게 하면 ~ie엣지, 크롬에선 정상적으로 동작한다.
문제는 firefox에서는 

라 에러가 생김 
기존에 onClose 안에 준 이벤트 자체가 현재 이벤트가 일어나는 엘리먼트의 클래스를 여부를 판단하는것인다. window.event 자체가 firefox에서는 존재 하지 않아 해당라인에서 error발생

구글링 후 가장 깔끔하게 처리되는것은


function cleanDatepicker(){

  var old_fn = $.datepicker._updateDatepicker;

  $.datepicker._updateDatepicker = function(inst) {
   old_fn.call(this, inst);

   var buttonPane = $(this).datepicker("widget").find(".ui-datepicker-buttonpane");

   $("<button type='button' class='ui-datepicker-clean ui-state-default ui-priority-primary ui-corner-all'>clear</button>").appendTo(buttonPane).click(function(ev) {
    $.datepicker._clearDate(inst.input);
   }) ;
  }
 }


위 함수를 선언 후 datepicker init 하기전에 한번 실행해주는 것이 가장 브라우저도 안타고 잘 동작하게 해결하는 방법이었습니다.

4. 해당 함수를 실행하고 
5. 기존에 clear버튼을 "닫기" 버튼으로 변경 
6. onClose에 bind했던 함수는 제거하면
   아래와 같이 버튼 3개가 생기고 각 버튼들이 잘 동작 하는걸 확인 할 수 있다.









2016년 8월 10일 수요일

Laravel 5 optimization commands

Laravel 5 optimization commands

============================
php artisan optimize
php artisan config:cache
php artisan route:cache
============================

1. storage paths optimize
optimize 명령을 사용하면 "bootstrap/cache/" 폴더 안에 컴파일 된 파일 기록

2. artisan optimize
php artisan optimize 명령어를 실행하면 "bootstrap/cache/compiled.php" 형태로 저장 하거나 덮어쓴다.
더 컴파일 하고 싶은 class가 있을경우 config/compile.php 에서 추가 할 수 있다.
--force 옵션을 사용하면 컴파일 되는 것을 피할 수 있다.

service provider는  "bootstrap/cache/services.php" 파일 생성(json) 경로를 등록해두고 최적화를 시도한다.

php artisan clear-compiled 명령을 하면 compile된 파일 캐시를 지움

artisan optimize는 "config/app.php"의 설정에 따라 달라질수 있다.
배포중에도 php artisan config:cache 명령으로 캐시 클리어 가능

3. artisan config:cache
config 파일 들에 대한 캐싱을 진행
bootstrap/cache/config.php 라는 파일명으로 생성된다.
기존에 생성되 있을경우 덮어쓴다.
삭제 하는 방법은 php artisan config:clear

4. artisan route:cache
route에 대한 정보도 cache로 등록.
bootstrap/cache/routes.php 라는 파일명으로 생성된다.
기존에 생성되 있을경우 덮어쓴다.

삭제 하는 방법은 php artisan route:clear

5. artisan view:clear
프레임워크를 통해 최초 렌더링 되는 파일을 해당 경로(storage/framework/views) 에 (MD5).php파일 형태로 컴파일 됨
캐시를 없애고 싶으면 artisan view:clear



Laravel 5.0

5.1 버전 이전에는 artisan 명령을 사용하면 vendor 폴더에 기록됨
경로를 storage/framework/ 바꾸고 싶을 경우 bootstrap/app.php안에 $app->useStoragePathForOptimizations(true);

출처 : http://sentinelstand.com/article/laravel-5-optimization-commands