'codeIgniter'에 해당하는 글 22건

xss filtering

Daily/Prog 2013. 10. 7. 21:40

본인/실명/IPIN 등의 인증모듈을 연동하면서 한참을 삽질하던 기억이 난다.
그 때의 문제는 인증기관에서 반환한 긴 get값을 suhosin이 강제로 잘라버린것.
원인을 찾아내는데는 긴 시간을 낭비했지만 php.ini 에서 suhosin get 값을 늘리면서 쉽게 해결.

 

오늘은 이니시스 연동에서 치명적(?)인 오류가 발생했다.
안전결제(ISP)만 결제 실패. (복호화 오류)
원나잇 투나잇 한것도 아닌데 이건 또 뭥...
난 단지 이니시스에서 결제가 성공했는지 여부만 가져올 뿐인데 ISP 결제만 안되는건 뭐냐고.
역시 오랜 시간 끝에 post값과 request값이 다르게 들어오는 부분을 발견.

 

훗 또... 잊고 있던 suhosin. 그러나 모든 설정은 post와 request가 같은데... 값이 틀리게 들어오는건...;
혹시 모르니 일단 post설정 값을 늘려보지만 역시 예상대로 해결되지 않음 ㅋ.
그렇다면 CodeIgniter 의 post설정만 남았네.
ci에서 post설정이라면 global_xss_filtering 뿐.
$config['global_xss_filtering'] = false; 로 xss를 꺼보니 해결. ㅜㅜ
요놈이 post 값의 일부 문자들을 변경해 버렸다. 그로 인해 복호화가 실패했다.
이놈은 아군이 확실한데 이따위 문자를 보낸 이니시스를 탓해야 하나, 이걸 간과한 나를 탓해야 하나...

 

이제와서 이걸 차마 끌 수는 없고, (끄면 각각 모든 post 부분에 개별 filtering 을 지정해야 함)
$_POST['encrypted'] = $_REQUEST['encrypted'];
결국 요롷게 문제되는 부분만 바꿔치기로...

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

1. 지역에 맞는 텍스트(국가별 언어)

제어 구문에서의 출력되는 모든 문자는 lang 파일에서 language 변수를 사용해야 합니다.

INCORRECT:
return "Invalid Selection";

CORRECT:
return $this->lang->line('invalid_selection');


2. Private 메소드와 변수

클래스로부터 내부적으로만 접근가능한 메소드와 변수는 밑줄로 시작해야 합니다.

convert_text()  // public method
_convert_text()  // private method


3. Short Open Tags

서버에 short_open_tag 가 enable 이 아닐 수도 있으므로 항상 짧은 시작태그(<?)가 아닌 완벽한 시작태그(<?php)를 사용합니다.

INCORRECT:
<? echo $foo; ?>
<?=$foo?>

CORRECT:
<?php echo $foo; ?>


4. 한 줄당 한 구문 (One Statement Per Line)

한 줄에 여러 구문을 사용하지 않습니다.

INCORRECT:
$foo = 'this'; $bar = 'that'; $bat = str_replace($foo, $bar, $bag);

CORRECT:
$foo = 'this';
$bar = 'that';
$bat = str_replace($foo, $bar, $bag);


5. 문자열(Strings)

변수 해석이 필요하지 않는 한 항상 문자열에 작은 따옴표를 사용하고, 변수 해석이 필요한 곳에 중괄호를 사용합니다.
또한 문자열이 작은 따옴표를 포함한다면 문자열에 큰 따옴표를 사용할 것입니다.
이스케이프(\) 문자를 사용하지 않도록 합니다.

INCORRECT:
"My String"     // no variable parsing, so no use for double quotes
"My string $foo"    // needs braces
'SELECT foo FROM bar WHERE baz = \'bag\'' // ugly

CORRECT:
'My String'
"My string {$foo}"
"SELECT foo FROM bar WHERE baz = 'bag'"


6. SQL Queries

Mysql 키워드는 항상 대문자로 씁니다. SELECT, INSERT, UPDATE, WHERE, AS, JOIN, ON, IN, ...
긴 쿼리는 읽기 쉽도록 각 절마다 여러 라인으로 나눕니다.

INCORRECT:
// keywords are lowercase and query is too long for
// a single line (... indicates continuation of line)
$query = $this->db->query("select foo, bar, baz, foofoo, foobar as raboof, foobaz from exp_pre_email_addresses
...where foo != 'oof' and baz != 'zab' order by foobaz limit 5, 100");

CORRECT:
$query = $this->db->query("SELECT foo, bar, baz, foofoo, foobar AS raboof, foobaz
                                        FROM exp_pre_email_addresses
                                        WHERE foo != 'oof'
                                        AND baz != 'zab'
                                        ORDER BY foobaz
                                        LIMIT 5, 100");


7. 기본 함수 인자 (Default Function Arguments)

잘못된 호출시 PHP 오류를 방지하기 위해 기본적인 인수를 사용합니다.

function foo($bar = '', $baz = FALSE)

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,


1. 클래스나 파일 이름

클래스나 파일명이 너무 단순하다면 다른 PHP 스크립트와 충돌할 수 있으므로, 고유한 접두어를 붙이는 것이 좋습니다.
개발자의 이름이나 회사의 이름을 접두어로 쓰면 좋습니다.

INCORRECT:
class Email  pi.email.php
class Xml  ext.xml.php
class Import  mod.import.php

CORRECT:
class Pre_email  pi.pre_email.php
class Pre_xml  ext.pre_xml.php
class Pre_import mod.pre_import.php



2. 데이터베이스 테이블 이름

추가적으로 작성하는 모든 테이블은 'exp_' 접두어를 사용하고, 그 뒤에 개발자나 회사 이름으로 식별 가능한 접두어를 넣고, 그 다음 테이블 이름을 간략하게 기술합니다.

INCORRECT:
email_addresses  // missing both prefixes
pre_email_addresses // missing exp_ prefix
exp_email_addresses // missing unique prefix

CORRECT:
exp_pre_email_addresses



3. 공백 (Whitespace)

코드에 공백을 넣고 싶을 때 스페이스가 아닌 을 사용하는 것이 단계별 들여쓰기에도 좋고, 아주 미세하지만 소스코드의 크기도 줄여줍니다.


4. 코드 들여쓰기

Allman 스타일의 들여쓰기를 사용하세요.
클래스 선언만 제외하고, 중괄호는 항상 한라인을 차지하도록 하며, 자기가 속한 조건문과 같은 레벨의 들여쓰기를 합니다.

INCORRECT:
function foo($bar) {
    // ...
}

foreach ($arr as $key => $val) {
    // ...
}

if ($foo == $bar) {
    // ...
} else {
    // ...
}

for ($i = 0; $i < 10; $i++)
    {
    for ($j = 0; $j < 10; $j++)
       {
       // ...
       }
    }

CORRECT:
function foo($bar)
{
    // ...
}

foreach ($arr as $key => $val)
{
    // ...
}

if ($foo == $bar)
{
    // ...
}
else
{
    // ...
}

for ($i = 0; $i < 10; $i++)
{
    for ($j = 0; $j < 10; $j++)
    {
       // ...
    }
}



5. 괄호의 여백

일반적으로 괄호에는 공백을 사용하지 말아야 합니다.
가독성을 높이고 함수와 구별하기 위해, PHP 조건문에 매개변수를 사용할때는 예외입니다.

INCORRECT:
$arr[ $foo ] = 'foo';

CORRECT:
$arr[$foo] = 'foo'; // no spaces around array keys

 

INCORRECT:
function foo ( $bar )
{
}

CORRECT:
function foo($bar) // no spaces around parenthesis in function declarations
{
}

 

INCORRECT:
foreach( $query->result() as $row )

CORRECT:
foreach ($query->result() as $row) // single space following PHP control structures, but not in interior parenthesis

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

1. 주석 달기

일반적으로 코드는 많은 주석을 포함하는 것이 좋습니다.
클래스와 메소드 선언 전의 DocBlock 스타일의 주석은 통합개발환경(IDE)등에서 인식될 수 있습니다.

/**
 * Super Class
 *
 * @package Package Name
 * @subpackage Subpackage
 * @category Category
 * @author Author Name
 * @link http://example.com
 */

class Super_class {

/**
 * Encodes string for use in XML
 *
 * @access public
 * @param string
 * @return string
 */

function xml_encode($str)

코드에 한 줄 주석을 사용할 수 있고, 큰 주석 블럭과 코드 사이에는 빈 줄을 넣습니다.

// break up the string by newlines
$parts = explode("\n", $str);

// A longer comment that needs to give greater detail on what is
// occurring and why can use multiple single-line comments.  Try to
// keep the width reasonable, around 70 characters is the easiest to
// read.  Don't hesitate to link to permanent external resources
// that may provide greater detail:
//
// http://example.com/information_about_something/in_particular/


$parts = $this->foo($parts);


2. TRUE, FALSE, NULL

이 키워드는 항상 대문자가 되어야 합니다.

INCORRECT:
if ($foo == true)
$bar = false;
function foo($bar = null)

CORRECT:
if ($foo == TRUE)
$bar = FALSE;
function foo($bar = NULL)


3. 논리 연산자

|| 연산자는 숫자 11과 비슷해 보이므로 사용하지 않는 것이 좋습니다.
&& 연산자는 AND 보다 많이 쓰이지만 둘다 가능합니다.
! 연산자의 경우 앞뒤로 공백이 와야 합니다.

INCORRECT:
if ($foo || $bar)
if ($foo AND $bar)  // okay but not recommended for common syntax highlighting applications
if (!$foo)
if (! is_array($foo))

CORRECT:
if ($foo OR $bar)
if ($foo && $bar) // recommended
if ( ! $foo)
if ( ! is_array($foo))


4. 리턴값 비교와 형 변환

어떤 PHP 함수는 실패했을 때 FALSE를 반환하지만, "" 나 0 값을 반환할 수도 있을 것입니다.
조건문에서 반환된 값을 사용할 때 가능하면 변수 유형을 비교하여 명시합니다. (===, !== 이용)

INCORRECT:
// If 'foo' is at the beginning of the string, strpos will return a 0,
// resulting in this conditional evaluating as TRUE
if (strpos($str, 'foo') == FALSE)

CORRECT:
if (strpos($str, 'foo') === FALSE)

INCORRECT:
function build_string($str = "")
{
    if ($str == "") // uh-oh!  What if FALSE or the integer 0 is passed as an argument?
    {

    }
}

CORRECT:
function build_string($str = "")
{
    if ($str === "")
    {

    }
}

typecasting 도 매우 유용할 수 있습니다.

$str = (string) $str; // cast $str as a string


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

다음은 CodeIgniter를 개발할 때 준수한 코딩 규칙의 사용을 설명합니다.


1. File Format

텍스트에디터 사용시 아래 사항에 유의 합니다.
- 파일들은 유니코드(UTF-8, no BOM) 인코딩 저장. (UTF-16, UTF-32 와 달리 UTF-8에는 BOM을 사용하지 않습니다.)
- 라인 끝은 LF(\n)를 사용해야 합니다.


2. PHP 닫는 태그

PHP 문서에서 닫는 태그(?>)를 사용했을 때 닫는 태그 뒤에 공백 있다면, 빈 페이지나 원치 않는 화면을 출력할 것입니다.
주석으로 파일의 끝을 표시하여, 파일의 경로를 표시하면 파일의 끝 임을 알 수 있으므로 파일의 마지막에 주석을 권장합니다.
(PHP 여는 태그(<?)의 앞에도 공백이 있어서는 안됩니다.)

INCORRECT:
<?php

echo "Here's my code!";

?>

CORRECT:
<?php

echo "Here's my code!";

/* End of file myfile.php */
/* Location: ./system/modules/mymodule/myfile.php */


3. 클래스명과 메소드명

클래스는 항상 대문자로 시작합니다.
여러 단어일 경우 동사가 포함된 것이 좋으며 카멜케이스(CamelCased) 가 아닌 언더바(_)로 구분해야 합니다.
너무 길지 않게 목적을 잘 설명할 수 있는 이름으로 지어야 합니다.
다른 클래스 메소드는 모두 소문자로 되어야 합니다.

INCORRECT:
class superclass
class SuperClass

CORRECT:
class Super_class


INCORRECT:
function fileproperties()
function fileProperties()
function getfileproperties()
function getFileProperties()
function get_the_file_properties_from_the_file()

CORRECT:
function get_file_properties()


4. 변수명

클래스 메소드와 거의 흡사하게 이름 짓습니다. (소문자, 언더바 구별 등)
너무 짧거나 단어가 아닌 변수는 for문 등의 루프 등에만 사용해야 합니다.

INCORRECT:
$j = &apos;foo&apos;;
$Str
$bufferedText
$groupid
$name_of_last_city_used

CORRECT:
for ($j = 0; $j < 10; $j++)
$str
$buffer
$group_id
$last_city


5. 상수

상수는 모두 대문자로 하는 것을 제외하고는 변수명 짓는 것과 같습니다.
CodeIgniter는 적절할 때 SLASH, LD, RD, PATH_CACHE 상수를 항상 사용합니다.

INCORRECT:
myConstant
N
S_C_VER
$str = str_replace('{foo}', 'bar', $str); // should use LD and RD constants

CORRECT:
MY_CONSTANT
NEWLINE
SUPER_CLASS_VERSION
$str = str_replace(LD.'foo'.RD, 'bar', $str);

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,