728x90
300x250

[PHP] function - UTF8 (한글 완벽 지원 함수 구현)

 

기존에 php의 iconv 함수를 사용하면 완벽한 한글 지원 함수를 구현하기에는 여러가지 문제가 발생된다.

 

사용 프로그램: PHP 5.26

 

그림 1. iconv 함수로만 처리했을 때의 문제, 도도(Dodo)

 

문자열 처리가 사람이 보는 것과는 달리 이러한 문제도 발생될 수가 있다.

문제를 해결할 수 있는 함수가 있다.

 


1. convertToUTF8 ( %s ) 구현하기

 


  // 한글 지원
  public function convertToUTF8($strTxt)
  {
          if(iconv("utf-8", "utf-8", $strTxt) == $strTxt){
               return $strTxt;
          }
          else
         {
              return iconv("euc-kr", "utf-8", $strTxt );
         }
  }

 

그림 1-1. iconv 함수로 기존 UTF8 문자열 감지

 

제어문과 iconv 함수를 활용하여 사람이 식별하지 못하는 문자열을 감지할 수 있다.

euc-kr로 변환해도 되는 경우를 구분하면 그림 1과 같은 문제를 해결할 수 있다.

 

 

반응형
728x90
300x250
[PHP] XSS 소개, 구현

 

XSS에 대해서 소개한다. 스크립트 변조에 관한 것이다.

너무 어렵게만 생각할 필요가 전혀 없다.

 

사용 프로그램: PHP 5.2, PHP 5.6

 


1. 코드로 살펴보는 XSS Filiter

 

XSS 필터에 대해서 간단하게 이해하는 방법이다.

 

class Security{

/*
 * XSS filter
 *
 * This was built from numerous sources
 * (thanks all, sorry I didn't track to credit you)
 *
 * It was tested against *most* exploits here: http://ha.ckers.org/xss.html
 * WARNING: Some weren't tested!!!
 * Those include the Actionscript and SSI samples, or any newer than Jan 2011
 *
 *
 * TO-DO: compare to SymphonyCMS filter:
 * https://github.com/symphonycms/xssfilter/blob/master/extension.driver.php
 * (Symphony's is probably faster than my hack)
 */

        public function xss_clean($data)
        {
               // Fix &entity\n;
              $data = str_replace(array('&','<','>'), array('&','<','>'), $data);
              $data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
              $data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
              $data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');

              // Remove any attribute starting with "on" or xmlns
              $data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);

              // Remove javascript: and vbscript: protocols
              $data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);

             $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);

             $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);

            // Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
            $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
            $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
            $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);

            // Remove namespaced elements (we do not need them)
            $data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);

            do
            {
                 // Remove really unwanted tags
                 $old_data = $data;
                 $data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
            }

            while ($old_data !== $data);

           // we are done...
           return $data;
     }

}


[첨부(Attachment)]

xssFilter.7z

 

XSS 공격이라는 것은 일반 문자를 UTF8로 변조해서 "<", ">", "applet" 등으로 접근하는 방법도 있을 수 있고. 스크립트 내에 공격하는 기법이다.

 


2. 참고자료(Reference)

 

1. XSS Filiter, https://github.com/symphonycms/xssfilter, Accessed by 2018-08-04

반응형
728x90
300x250
[PHP] PHP 5.6 - xFrame 공격 방지하기(Clickjacking 피하기)

 

이번에 소개할 것은 xFrame 기반의 공격을 방지하는 방법에 대해서 소개하겠다.

 

대상 프로그램: PHP 5.6

 


1. 클릭 재킹(Clickjacking)

 

클릭 재킹 (사용자 인터페이스 교정 공격, UI 교정 공격, UI 교정)은 웹 사용자를 클릭하여 사용자가 클릭 한 것으로 보이는 것과 다른 것을 클릭하여
기밀 정보를 공개하거나 자신의 컴퓨터를 제어하는 악의적인 기법이다.


겉보기에 무해한 웹 페이지를 클릭해라. 이것은 다양한 브라우저와 플랫폼에 걸친 취약점인 브라우저 보안 문제이다.

클릭 잭은 다른 기능을 수행하는 것으로 보이는 버튼을 클릭하는 것과 같이 사용자의 지식없이 실행할 수 있는 임베디드 코드 또는 스크립트 형태를
취한다.
"클릭 재킹"이라는 용어는 2008년에 Jeremiah Grossman과 Robert Hansen이 만들었다.
클릭 재킹(Clickjacking)은 컴퓨터가 그 권한을 오용하는 것에 순진하게 속아 넘어갈 때를 기술하는 용어인 혼란스러운 대리 문제의 한 예이다.


[설명]
HTML 웹 페이지의 겉보기에 무해한 기능을 사용하여 예기치 않은 작업을 수행 할 수 있으므로 클릭 재킹이 가능하다.

클릭 재킹 페이지는 숨겨진 링크를 클릭하여 원치 않는 작업을 수행하도록 사용자를 속인다.
클릭 재킹 된 페이지에서 공격자는 투명 레이어에서 다른 페이지를 로드한다.
사용자는 보이지 않는 페이지에서 실제로 작업을 수행하는 동안 보이는 버튼을 클릭한다고 생각한다.
숨겨진 페이지는 인증 된 페이지 일 수 있다. 따라서 공격자는 사용자가 의도하지 않은 작업을 수행하도록 속일 수 있다.
사용자가 숨겨진 페이지에서 진실로 인증되었으므로 나중에 공격자를 추적 할 방법이 없다.

 

결과적으로 웹 브라우저가 가지고 있는 취약점을 막는 것이다.

 


2. php코드에 클릭 재킹 피하기 코드 삽입하기

 

<      ? php

header("Content-Type: text/html; charset=UTF-8");
header('X-Frame-Options: DENY');  // 'X-Frame-Options'
// header('X-Frame-Options: ALLOW-FROM https://youtube.com/');

?    >

 

이런 형태로 삽입할 수 있다.

 


3. 참고자료(Reference)

 

1. Clickjacking, Last Modified 07-27-2018, 08:17 (UTC)., Accessed by 2018-07-31, https://en.wikipedia.org/wiki/Clickjacking, Wikipedia.

2. X-Frame-Options SAMEORIGIN blocking iframe on my domain, Last Modified, Accessed by 2018-07-31, https://stackoverflow.com/questions/12182768/x-frame-options-sameorigin-blocking-iframe-on-my-domain, Stack Overflow

3. header, Last Modified, Accessed by 2018-07-31, http://php.net/manual/en/function.header-remove.php, PHP.net

4. X-Frame-Options, Last Modified, Accessed by 2018-07-31, https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options, MDN(Developer Mozila)

반응형
728x90
300x250

[PHP] PHP 5.6 - 시큐어 코딩하기(SQL Injection)

 

실제 작성한 코드를 통해서 소개한다.

외부의 사용자가 스크립트 언어를 삽입하여 SQL 문장으로 공격하는 문제 등이 존재할 수 있다.

 

이를 막는 방법에 대해서 소개한다.

 

대상: PHP Version 5.6.36

         (선택) mysqlnd 5.0.11-dev - 20120503 

 


1. SQL 문장 변형이 일어나기 쉬운 코드

 

          /*
          $query = 'SELECT password FROM board_' . $boardName . '_comment ' .
                    'where id = \'' . $comment->getID() . '\' ' .
                    'and password = \'' . $password . '\'';
         */ // SQL Injection 미점검  

 

그림 1-1. 문자열로 생성하는 SQL 문장

 

이런 코드로 프로그래밍을 작성하면 다음과 같은 일들이 생길 수 있다.

 

 SELECT password FROM board_{임의의 질의값}_comment where id = {랜덤아이디, 스크립트} and password = {랜덤비밀번호 대칭};

 

그림 1-2. SQL 문장으로 공격하기

 

예를 들어서 화면을 아래처럼 꾸몄다고 가정하자.

 

번호

{id}

 

글 제목

{subject}

 

조회수

{count}

 

 

 

 

 

 

 

 

그림 1-3. UI - View.php

 

예를 들면, 그림 1-3에서 {id}의 내용에 불법적인 스크립트 등을 삽입하여 공격할 수가 있다.

이러한 것을 예방하려면, 아래의 코드처럼 개선하면 좋을 것으로 보인다.

 


  public function isPasswordComment($boardName, $comment){
  
          $link = mysql_connect($this->conn->getHost(),
                                          $this->conn->getUser(),
                                          $this->conn->getPw()) or
                                          die('Could not connect' . mysql_error());
                       
          mysql_set_charset('utf8', $link);
  
          mysql_select_db($this->conn->getDBName()) or die('Could not select database');

          mysql_query("set session character_set_connection=utf8;");
          mysql_query("set session character_set_results=utf8;");
          mysql_query("set session character_set_client=utf8;");
   
          $password = $this->crypt->decrypt( $comment->getPassword() );

         

          /*
          $query = 'SELECT password FROM board_' . $boardName . '_comment ' .
                    'where id = \'' . $comment->getID() . '\' ' .
                    'and password = \'' . $password . '\'';
         */ // SQL Injection 미점검  
  
          $query = sprintf("SELECT password FROM board_%s_comment WHERE `id` = '%s' AND " .
                     "`password` = '%s'",
                    mysql_real_escape_string($boardName),
                    mysql_real_escape_string($comment->getID()),
                    mysql_real_escape_string($password));       // SQL Injection 점검

  
           $result = mysql_query($query, $link) or die('Query failed: ' . mysql_error());

 

           // DB Article
           $password = "";
           while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
                  $password = $row['password'];
           }
  
           // Free resultset
           mysql_free_result($result);
  
           // Closing connection
           mysql_close($link);
  
           if ( empty($password) )
               return false;
           else
               return $password;
  
 } 

 그림 1-4. 개선된 코드(SQL Injection)

 


2. 참고자료(Reference)

 

1. SQL Injection, PHP.NET, http://php.net/manual/en/security.database.sql-injection.php, Accessed by 2018-07-31

반응형
728x90
300x250
[PHP/GPLv3] Feng Office 2.32Rc1 한글화 - 그룹웨어 오픈소스

 

한글화를 다시 수작업으로 재진행하였습니다.

이전 한글화 파일이 최신 2.32Rc 형태가 아니어서 새로 2.32 형태로 작업하였습니다.

 


1. Feng Office 2.32Rc 1 (Community Edition)

 

[도도(dodo) / 한글화 작업 수행] 2.32 RC1

fengoffice.vol1.egg

fengoffice.vol2.egg

 

License(라이센스): GNU/GPL 3 license.

 

공식 프로젝트 사이트: http://fengoffice.com/

소스포지 사이트: https://sourceforge.net/projects/opengoo/

반응형
728x90
300x250

[PHP/GPLv2] PHP SysInfo 프로젝트 - Sysinfo

저번에 올렸던 한국 LinuxChannel.net 의 sysinfo 프로그램보다 더 역사가 깊고 지금 현재까지 최신버전으로 릴리즈가 되고 있는 PHP SysInfo 프로젝트의 Sysinfo라는 프로그램이 있습니다.

사용환경 : Apache, PHP
운영체제 : 거의 모든 기종 지원
언어지원 : 한국을 비롯한 세계 주요 나라의 언어 지원.

http://phpsysinfo.sourceforge.net/

파일 첨부 :
phpSysInfo-3.0-RC8.tar.gz

스크린샷 :

반응형
728x90
300x250

[PHP/GPLv2] PHP 시스템 정보 확인(sysinfo) - 수정(PHP 5.2 지원)

몇 가지 오류가 수정된 파일입니다.
한글로 번역한 파일인데, 오류가 있어서 수정하였습니다.

[첨부(Attachments)]
sysinfo.2009.07.30.tar.gz

비록 오래된 버전이긴 하나 태스팅을 해보면 동작할 것입니다.
코드를 다룰 수 있다면 수정해서 사용해도 됩니다.
반응형

+ Recent posts