'XSS'에 해당하는 글 2건

html doctype

W3C/HTML 2013. 2. 4. 21:34

우리가 브라우저(i.e, chrome...)로 보는 웹페이지(html)는,
웹페이지에 정의된 DOCTYPE과 그에 해당하는 브라우저의 해석기로 렌더링 되어 보여집니다.
예를 들면 html 문서에서 doctype 을 xhtml1.0 transitional로 정의했으면
브라우저에서도 xhtml1.0 transitional로 모든 markup을 렌더링하여 보여줍니다.
만약 doctype 을 정의하지 않는다면, 브라우저 마다 내장된 호환모드(quirks mode)로 웹페이지를 해석하고,
제각기 화면들을 출력할 것입니다. 이러길 원하는 분은 없겠죠?
그래서 어느 브라우저든 동일한 화면이 보여지도록 하기 위해 웹페이지에 doctype 을 정의하고,
그에 맞는 markup 형식을 사용하도록 w3c 는 권고하고 있습니다.
이것이 바로 웹표준, 크로스 브라우징의 시작입니다.

 

다음은 (X)HTML DOCTYPE 리스트 입니다.

 

 HTML 4.01  Strict  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">
 Transitional  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
 Frameset  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
 XHTML 1.0  Strict  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 Transitional  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 Frameset  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
 XHTML 1.1    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 HTML 5    <!DOCTYPE html>

 

 

HTML4.01, XHTML1.0, HTML5 는 HTML 의 버전이라고 생각하면 될 듯 합니다.
버전을 선택했다면 어떤 DTD를 사용할 것인지 정의하고 그에 맞는 markup 을 사용합니다.
DTD는 Strict, Transitional, Frameset(Transitional+Frameset) 이 있으며 Strict 를 권장합니다.
Transitional는 DTD와 다르게 사용된 markup을 어느 정도 지원해 주지만,
Strict의 렌더링 속도가 더 빠르기 때문에 요즘 대세인 모바일웹에서는 의미가 있습니다.
HTML5는 아직까지는 표준이 아니며,
현재 대부분의 웹브라우저에서 가장 잘 표현이 되는 doctype 은 XHTML 1.0 Strict 입니다.


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

,

PHP Security

Tip/PHP 2012. 12. 12. 00:10

1. 외부/입력 데이터 처리

 

GET/POST/COOKIE/SESSION 변수, DB, php config 등으로 전달되는 데이터는 변조될 수 있으므로 정규식을 사용하여 입력 처리.

 

function cleanInput($input){
    $clean = strtolower($input);
    $clean = preg_replace("/[^a-z]/", "", $clean);
    $clean = substr($clean,0,12);
    return $clean;
}

 

$userId = cleanInput($_POST['userid']);

 

입력받은 $_POST['userid'] 변수의 형식이 영문(소문자), 12자 이내로만 이루어져야 한다면,
위와 같이, 입력 변수를 체크할 수 있도록 처리합니다.
특히 사용자 입력값에 길이 제한을 두는 것은 여러 공격에 대하여 방지해 줍니다.

 

 

2. PHP config 의 보안 설정

 

php.ini 파일 편집

 

register_globals = off  
// GET,POST,COOKIE,SESSION,SERVER 등의 변수 공유 악용 방지
// php5.3 deprecated, 5.4 removed)

 

display_errors = off
// 오류정보 출력에 대한 악용 방지.
// 개발시에는 많은 오류가 보고되는 것이 좋지만, 완료 후에는 오류 대신에 파일로 대체.

 

 

3. SQL Injection 공격 회피

 

where username = '{$_GET['username'}' and password = '{$_GET['password']}' 의 경우
$_GET['password'] 에 악의적인 코드를 삽입하여 쿼리를 통과할 수 있습니다.
password 입력 항목에 ' or '1'='1 이라고 입력한다면,
where username = '' and password = '' or '1'='1' 이 되어 무조건 통과하게 됩니다.
이를 방지하기 위해 입력 값에 mysql_real_escape_string 함수를 사용하여 '등의 특수문자를 회피할 수 있도록 합니다.

 

 

4. 버퍼 오버플로우 공격 방지

 

특정 버퍼를 전복시키거나 다음 버퍼에 악성 코드를 삽입하여 데이터를 손상시키는 오버플로우에 대해서는 데이터 길이 제한을 두고,
16진 문자열에 대해서는 이 문자열을 제거하는 정규식을 추가합니다.

 

function cleanHex($input){
    $clean = preg_replace("![\][xX]([A-Fa-f0-9]{1,3})!", "",$input);
    return $clean;
}

 

$name = cleanHex($_POST['name']);

 

 

5. 교차 사이트 스크립팅(XSS) 공격 방지

 

사용자 입력 폼에서 이름, 이메일, 내용 등을 넣을 때 악성 스크립트로 쿠키 등의 정보를 훔칠 수 있습니다.
전달된 값에 태그 변환 strip_tags(), HTML 엔티티 변환 htmlspecialchars() 등을 사용해 공격을 차단하도록 합니다.

 

 

6. 원격 폼 전송 차단

 

폼 페이지를 저장하여 타 사이트에 게재하고 form action 값을 위장할 수 있습니다.
HTTP_REFERER 을 확인할 수도 있으나 가장 좋은 대처 방법은,
토큰을 생성하여 session 변수와 폼에 배치시키고 전송 뒤에 이 값들을 확인하는 방법입니다.
토큰을 무작위로 작성하려면 md5(), uniqid(), rand() 함수를 사용해야 합니다.

 

#form.php
$token = md5( uniqid( rand(), true ) );
$_SESSION['token']= $token;

 

<input type="hidden" name="token" value="<?=$token?>"/>

 

#action.php
if ( $_SESSION['token'] != $token ) {
    die( 'Invalid token!' );
}


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

,