지난주 금요일 부터 난해한 문제가 있었는데 charset 관련 된 내용이었다. 요약하면 윈도우에서 만들어진 Zip 파일을 리눅스 서버에서 압축 풀었을 때 이름이 utf8 형식이 아닌 다른 언어셋으로 되어있는 경우에 문자가 깨지는 문제인데, 예를 들면 윈도우에서 만들어진 한글 파일명이 그러했다. 깨지는 이유는 Zip 에는 그 안에 들어있는 파일명에 대한 charset 정보가 없기 때문. 이 문제를 해결하기 위해 세 가지 방법을 생각했다.1. 서버가 redhat 기반의 리눅스인데 redhat 에서 기본 제공되는 unzip binary 가 아닌 debian 에서 제공되는 unzip bianry 를 가져다 쓴다. 이유는 간단하다. debian 에는 압축을 풀 때 언어셋을 지정하는 옵션이 있다. (버전이 레드햇,..
여러가지 이유로 웹셸(Web-Shell)이 필요 했습니다. 보통 Shell을 사용하기 위해서는 terminal에 접속을 해야 하는데, 이때는 console이나 telnet, ssh등의 서비스를 이용하게 됩니다.또한 그러한 서비스를 이용하기 위해서는 putty나 Xshell등과 같은 접속 프로그램이 필요하죠. - OS가 Linux, Unix같은 계통이면 패스.. 또한 80 포트는 열려 있지만 보안상의 이유로 telnet, ssh는 막혀 있는 경우가 종종 있습니다.그리하여 80으로.. 웹 브라우저에서 사용할 수 있는 Shell을 만들게 됩니다. 단, 일반 bash와는 다르게 모든 명령어를 사용할 수 있을 필요는 없습니다.어쨌든 보안을 생각해야 하므로 시스템에 장애를 유발할 수 있는 무언가는 안됩니다. - r..
회사 바로 앞에 버스 정류장이 있는데, 퇴근해서 내려가 보면 눈앞에서 떠나는 버스..요즘은 버스가 정류장을 떠나면 잘 세워주지도 않죠?- 안전을 위해 당연한 거죠? 그래서 이제는 버스의 도착 시간을 미리 알아야겠다는 생각이 들었습니다사실 버스 홈페이지나 국토부 등에서 정보를 쉽게 구할 수는 있는데, 로그인이나 웹페이지 여는 것조차 우리에겐 귀찮습니다.- (검은 바탕에 흰 글씨)터미널이 눈에 더 익는 것도 사실이고 ^^;; 일단 웹에서 제공하는 서비스를 웹페이지 개발자 모드로 분석하고 PHP에서 curl 하기로 했습니다결과는 XML이기 때문에 그에 맞게 parsing 했습니다. 소스는 아래와 같습니다. 리눅스 터미널에서 실행은.. 대략 이렇게 하면 되겠죠?while [ 1 ] ;do clear;php bu..
기사 링크 : http://www.boannews.com/media/view.asp?idx=46219 좀 오래된(?) 떡밥이긴 한데, 여전히 문제가 되는 코드를 사용하는 곳이 많습니다.. 내용을 요약하면 "0e"로 시작하는 해시 값은 '0'과 비교할때 "==" 혹은 "!=" 로 비교시에 문제가 된다고 이야기하고 있습니다. (0e로 시작하는 스트링이 '0'과 같게 취급 됨) 코드로 보면 아래와 같습니다. 자 그럼 "240610708"과 같은 "MAGIC" NUMBER / STRING 에는 무엇이 있을까요 코드 출처를 따라가면 각종해시에 대한 "MAGIC" NUMBER / STRING 를 나열하고 있습니다. 이제 이러한 잠재적인 문제를 회피하기 위해 코드를 수정해야 하는데, 아래와 같은 오퍼레이터로 대체하는..
흔히 mysql_query()의 반환 값은 resource ID 혹은 False로 알고 있지요.하지만 모든 경우에 그런 것은 아닙니다. http://php.net/manual/kr/function.mysql-query.phpmysql_query()에 대한 메뉴얼을 살펴보면 아래와 같은 문구가 나옵니다.mysql_query()는 다른 형식의 SQL 구문, INSERT, UPDATE, DELETE, DROP 등에서 성공하면 TRUE를, 실패하면 FALSE를 반환합니다. 당연한 내용이죠? (당연하지 않다면.. 평소 메뉴얼을 제대로 보지 않은 자신에게 채찍질을..)그럼 아래 내용을 살펴봅시다.$query = "....."; $link = mysql_connect("localhost","root","secret"..
mail()함수 사용시에 수신측 body에 !(느낌표)가 중간중간 삽입되는 경우가 발생합니다. 이때는 여기를 참고해서 처리하도록 합니다.(혹시 링크가 열리지 않을 경우..)// 1000자 이상에서 ! 생기는것 방지 (아래 2줄) $add_mailheader="Content-Transfer-Encoding: base64 \r\n"; $body = chunk_split(base64_encode($body)); mail($to,$subject,$body,"Content-Type: ".$content_type."; charset=euc-kr\r\n".$add_mailheader.$shopname."\r\n"); 반나절간의 삽질이.. 삽질로 끝나지 않아서 다행입니다...ㅠㅠ
php 실행 시에 입력 받은 인자의 종류가 다양할때 옵션 처리가 필요합니다. argc와 argv[]로도 가능하지만 코드가 지저분해질 염려가 있으니까요. 이럴때 필요한 함수가 getopt 입니다. 우선 아래 코드를 봅니다. char는 "-"로 구분되는 옵션이고, string은 "--"로 구분되는 옵션입니다. 뒤에 ":"는 옵션 뒤에 인자를 필수로 입력 받는다는 의미 입니다. 아래와 같은 결과를 얻을 수 있습니다.oops$ php getopt.php --i386 --compile=busybox array(2) { ["i386"]=> bool(false) ["compile"]=> string(4) "busybox" } compile true i386 true oops$ php 버전에 따라 $longopts 는..
lighttpd와 php를 웹서버로 사용할 때 취약성 부분입니다. 웹사이트 주소를 아래와 같이 입력 했을때 phpinfo()의 내용이 출력되는데요. https://192.168.0.10/test.php/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000 (test.php 는 php형태를 갖추는 파일만 존재하는 상태입니다. 내용물에는 실제 코드가 없습니다.) 해당 취약성은 php.ini의 수정을 통해 감출 수 있습니다. php.ini에 아래 내용을 추가하고 php를 재시작하도록 합니다. expose_php = off 그리고 웹서버에 접속해보면 내용이 더이상 출력 되지 않습니다. 이런 사소한 부분도 CC에서는 취약성에 걸린다고 하네요~ [ expose_php = off ] 외에도 ph..
array array_splice ( array input, int offset [, int length [, array replacement]] ) : 배열의 일부를 삭제하고, 그 위치에 다른 내용을 대체합니다 배열의 일부를 삭제만 하면 그 뒤 배열이 땡겨지고, ($a[10] 배열에서 $a[3] ~ $a[5] 구간을 삭제한다고 치면 $a[6]~$a[10]이 $a[3] 쪽으로 땡겨지는 것을 의미) replacement 인자가 있다면 삭제한 구간에 해당 배열을 삽입합니다. 동치 array_push($input, $x, $y) array_splice($input, count($input), 0, array($x, $y)) array_pop($input) array_splice($input, -1) array..
xml parser ◆ xml paser의 두 종류 1. DOM(Document Object Model) - XML 전체를 object화해서 tree형태로 들고 있기 때문에 무겁습니다 (메모리 소모 많음) - XMLParser() 2. SAX(Simple API for XML) - 발생된 이벤트는 그때그때 이벤트 처리 핸들러로 처리 되기 때문에 가볍습니다 (메모리 소모 적음), 단 잦은 이벤트의 경우 DOM에 비해 느리다는 단점이 있습니다. (매번 이벤트 핸들러가 돌기 때문에) - simplexml_load_file() 참조 : http://www.php.net/manual/en/function.simplexml-load-file.php
php 배열을 만지다 보니, 요놈 메모리가 좀 수상합니다. $oops = array(); 문제는 위와 같이 선언만 했음에도 약 88bytes를 소모한다는것, : php에서 기본 제공되는 memory_get_usage()로 확인 - 꽤 신뢰할만 합니다. 관련해서 검색의 검색을 더하다보니 역시 나와 공통된 궁금증은 세계에 있기 마련이지요..관련된 링크를 여기 첨부하도록 합니다.참고하면 좋고,~ psphp 버전 5.3 부터는 php garbage collection 기능이 포함된답니다.
유사한 기능을 하는 함수인 split와 explode.. 꽤 많은 루프를 돌아야 하는 상황에서 성능을 고려하지 않을 수 없었습니다. 그래서 간단하게 테스트 진행. 테스트 코드는 아래와 같이 단순 문자열을 "="로 구분 (100만번 반복) 위와 같이 split와 explode 함수를 각각 100만번 루프 돌린 결과 explode의 결과 # php aa.php X-Powered-By: PHP/5.2.6 Content-type: text/html; charset=utf-8 1.3024411201477 sec split의 결과 # php aa.php X-Powered-By: PHP/5.2.6 Content-type: text/html; charset=utf-8 1.7867012023926 sec 결과적으로 ex..
※ memory_get_usage (PHP 4 >= 4.3.2, PHP 5)memory_get_usage -- Returns the amount of memory allocated to PHP Descriptionint memory_get_usage ( void ) Returns the amount of memory, in bytes, that's currently being allocated to your PHP script. memory_get_usage() will only be defined if your PHP is compiled with the --enable-memory-limit configuration option. ※ ini_set('memory_limit', '..M') (PHP 4..
php 는 "Array To String"이나, "String To Array" 가 지원됩니다, implode가 그 전자이고, explode가 후자. 일단 형식은 implode ( string glue, array pieces) glue를 구분자로 배열 pieces를 string으로 만듭니다. ""와 같은 형태로 구분자 없이 string으로 만들수도 있습니다. 아래는 간단한 예제 explode의 형식은 explode ( string separator, string string [, int limit] ) 위와 같은 형태가 되겠습니다. 아래는 간단한 예제
array_fill ( int start_index, int num, mixed value ) start_index 부터 num 까지의 값을 value로 채웁니다. 배열 초기화를 위해 c언어의 memset 같은 함수를 찾다가 발견, 나름 유용할때가 있습니다, 이를테면, size 200인 배열에 특정 index만큼만 값을 세팅해야 하는 경우가 있는데, 나머지는 default로 채워야 한다거나, 특정 값으로 채워야 할때 불필요하게 for문이라든지 반복문을 통해 값을 채워야 하는 .. 그런 비생산적인 코드를 막을 수 있습니다.
코드가 방대해지기 시작하면, 배열이 커지기 마련이고, 특히나 php의 경우 사기언어(?) 이므로... 최초 의도했던 용도와는 다르게 배열의 차수가 달라지기도 합니다. 이를테면 1차원 배열로 사용을 하는게 목적이었으나... 급히 2차원 배열로 변경한다든가.. (이는 목적에 따라 최초1차원 배열로 사용을 하였지만, 요구사항에 따라 2차원 배열로 행해지는 경우) 그렇게 되면 나중에 특정 배열 변수를 놓고 값을 체크하는게 난감한 경우가 있습니다. 보통의 1차원 배열이나, 그 이상의 배열의 경우 목적이 분명하고 차원이 분명하다면, for문 돌려서 echo로 충분히 배열 내용을 알수 있다. 하지만 배열의 키(index)값이 default(0부터 증가하는 숫자)가 아니라면, 정확히 그 배열에 어떤 키와 값이 있는지 ..
간단한 php Warning, 우선 코드상에 아래와 같은 구문을 찾아냅니다, $a = 5; $a[0] = 3 당연히 말도 안되게 쉬운 예로 들었지만, 코드가 길어지고 변수를 global 하게 사용하다 보면 종종 발생하는 실수입니다. (어쩌면 php 이기 때문에 발생하는 버그라는 생각도 듭니다, 왜냐하면 php는 왠지 모르게 뭐든 될것같은 .. 그런 느낌이 강해서일까..) scalar 와 array를 정확하게 구분지어 사용하는 버릇을 들이도록 합시다 :) 모든 코딩의 기본이고, 우리의 코드는 소중하니까요~
hash_hmac을 이용한 암호화, hash의 성격대로 복호화는 사실상 불가능입니다. 함수 설명을 간단히 살펴보면 "Generate a keyed hash value using the HMAC method" 자, 예를 들어봅시다. test라는 FILE에는 "1"만 기록되어 있고 이 파일을 hash_hmac_file()하면 87a7fa188c5f20be866a6de2eaba1ce71a6cf50 요런 값을 얻을 수 있습니다, 그렇다면 test라는 FILE에 2를 기록하고 hash_hmac_file()하게 되면? 26ae63ad577ee2071c66b09aab72f9247e76c743 전혀 다른 결과를 얻게 됩니다, hash_hmac_file()은 파일의 무결성을 검증하는데 사용되고.... 특정 문자열은 hm..
- Total
- Today
- Yesterday