프로그램/php2015. 8. 23. 17:18

php 문자열 중 마지막 문자 자르기

 

자주 사용하는 php 문자열 관련 함수 중 substr를 이용해서 마지막 문자를 제거하는 방법이다.

 

예> 문자열 : 1,2,3,4,5,

마지막 문자인 "," 콤마 문자를 제거하는 방법

 

<?php

$str = '1,2,3,4,5,';

$result = substr($str , 0, -1);

 

echo '<br />결과 = ' . $result;

?>

 

 

결과 = 1,2,3,4,5

Posted by 은둔고수
프로그램/php2015. 7. 22. 15:47

IP 정보의 일부분을 다른 문자열로 변경한다.

 

>

변경 전 : 111.222.333.444

변경 후 : 111.222.xxx.444

 

 

/* ip의 일부를 문자로 변경해서 반환

ary['ip'] : ip 값(필수)

ary['c'] : 대체 문자(기본:'xxx'), 글자 수 최대 3자리

ary['i'] : 대체 index (기본:2), :0~3

반환 예>111.111.xxx.111

*/

function rtn_ip_xxx($ary = array()) {

  if(empty($ary['ip'])) return false;

  if(empty($ary['c'])) $ary['c'] = 'xxx';

  if(strlen($ary['c']) > 3) return false;

  if(empty($ary['i'])) $ary['i'] = 2;

  if($ary['i'] < 0 || $ary['i'] > 3) return false;

  $rtn = explode('.', $ary['ip']);

  $rtn[$ary['i']] = $ary['c'];

  return implode('.', $rtn);

}

 

 

사용 예>

$ip = '111.222.333.444';  // $_SERVER['REMOTE_ADDR']

echo "<br />ip =" . rtn_ip_xxx(array('ip' => $ip));

결과 : 111.222.xxx.444

 

 

사용 예>

$ip = '111.222.333.444';  // $_SERVER['REMOTE_ADDR']

$c = ‘-’;

echo "<br />ip =" . rtn_ip_xxx(array('ip' => $ip, ‘c' => $c));

결과 : 111.222.-.444

 

 

사용 예>

$ip = '111.222.333.444';  // $_SERVER['REMOTE_ADDR']

$c = ‘???’;

$i = 3;

echo "<br />ip =" . rtn_ip_xxx(array('ip' => $ip , ‘c' => $c , i' => $i));

결과 : 111.222.333.???

Posted by 은둔고수
프로그램/php2015. 7. 16. 16:37

웹 화면의 특정 페이지의 내용을 가져오기 위해 allow_url_fopen 또는 curl을 사용하는 방법

 

$url = 'http://okkks.tistory.com/1083';

if(function_exists('allow_url_fopen')) {

    $result = file($url);

} else if(function_exists('curl_init')) {

    $curl = curl_init($url);

    curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/5.0 (compatible; with PHP');

    curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);

    curl_setopt($curl,CURLOPT_NOSIGNAL,1);

    curl_setopt($curl,CURLOPT_HEADER,0);

    $result = curl_exec($curl);

    if(!$result) return false;

    curl_close($curl);

    $result= explode("\r\n", $result);  // 개행 문자를 이용해서 문자열을 배열 형식으로 변환(주의>\r\n을 반드시 쌍따옴표(")로 감싸야 한다.)

}

 

// 출력

var_dump($result);

 

 

 

참고>

allow_url_fopen을 지원 안 하는 경우(예>웹호스팅 업체인 경우 보안을 위해 지원을 안 하는 경우가 있다.) curl을 이용해서 특정 웹 소스 내용을 가져온다.

Posted by 은둔고수
프로그램/php2015. 7. 11. 18:27

첨부파일을 통한 XSS 공격 방식은

XSS 공격용 파일을 만들어(확장자만 jpg 같은 이미지로 변경한 파일, html, 기타 등) 첨부파일로 업로드 한 후 해당 파일을 클릭하면 실행이 되거나 해커 서버에 연결해서 원하는 정보(예>쿠키)얻어 가는 공격이다.

 

 

 

첨부파일이 업로드되는 경로에 다음의 내용으로 .htaccess 파일을 생성한다.

.htaccess

 

<IfModule mod_headers.c>
    Header set Content-Disposition attachment
</IfModule>

 

생성을 한 후 첨부파일을 클릭하거나

브라우저 입력란에 해당 파일의 url 경로를 직접 입력해서 실행해보면

무조건 다운로드 창이 실행되기 때문에 파일이 실행되는 것을 막을 수 있으며 공격도 막을 수 있게 된다.

 

 

참고> 첨부파일 업로드 경로를 웹 서버 경로(DOCUMENT_ROOT)가 아닌 웹으로 접근할 수 없는 경로로 한 후 파일명은 DB 등에 저장을 하고 파일명 자체도 알 수 없는 임의의 파일명으로 바꾸어서 업로드하는 방법이 있다.

다운로드를 하는 경우에는 별도의 다운로드 실행 파일을 만들어서 사용을 한다.

Posted by 은둔고수
프로그램/php2015. 7. 1. 12:10

정규식을 이용해서 게시물 내용에서 img 태그 전체 또는 src 값만 추출할 수 있다.

 

 

예제>

$contents = "<img src='http://okkks.tistory.com/img/2015/07/01/okkks.tisotry.com_01.jpg' alt='okkks.tisotry.com_01.jpg' /><br /><img src='http://okkks.tistory.com/img/2015/07/01/okkks.tisotry.com_02.jpg' />";

 

 

// 정규식을 이용해서 img 태그 전체 / src 값만 추출하기
preg_match_all("/<img[^>]*src=[\"']?([^>\"']+)[\"']?[^>]*>/i", $contents, $matches);

 

// img 태그 전체 추출하기

print_r($matches[0]);

 

// src 값만 추출하기

print_r($matches[1]);

 

// 이미지 태그 src 값 중에서 "img" 문자열 이하 값 알아내기

$ary_rtn = array();

foreach($matches[1] as $k => $v) {
    $t = explode("img", $v);
    array_push($ary_rtn, $t[1]);
}

 

echo "<br />";
var_dump($ary_rtn);

 

 

// 결과


Posted by 은둔고수
프로그램/php2015. 6. 24. 17:39

오류>

Warning: Directory /설치경로/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer not writable, please chmod to 777 in /설치경로/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php on line 272

 

 

 

 

설명>

Serializer는 작업효율을 높이기 위해 임시 데이터를 저장하는 디렉토리로 저장할 수 있는 권한이 필요하며 사용하지 않아도 된다.

 

 

해결 방법>

사용을 원하면 777권한을 부여한다.

]# chmod 777 Serializer

또는 해당 권한을 부여할 그룹으로 변경한다.

]# chown ftpuser.nobody Serializer

 

사용을 원하지 않으면

- 임시 폴더 사용 안하기
$
config->set('Cache.DefinitionImpl', null);

- 임시 폴더를 다른 곳으로 지정:
$
config->set('Cache.SerializerPath', '/tmp');

 



 

더보기>

- PHP HTMLPurifier 설치 / php 보안 / php xss / php script 보안 / cross-site scripting

Posted by 은둔고수
프로그램/php2015. 6. 24. 17:08

HTMLPurifierXSS(cross-site scripting) 취약점을 필터링을 하는 라이브러리로

게시판의 글 제목이나 글 내용 등에 script, onmouseover 등을 삽입해 공격을 하거나 에러 등을 만들어서 원하는 정보를 알아내는 취약점을 필터링해서 안전한 속성, 이벤트, 태그 등만을 허용한다.

 

[HTML Purifier 설치하기]

http://htmlpurifier.org 에서 다운을 받아 압축을 푼 후 library 디렉토리만 서버에 업로드 하는 것으로 설치가 끝난다. (zip 파일을 사용했다.)

(리눅스에서 바로 다운받고 싶다면 .tar.gz 파일을 사용한다.)

 


 

 

더보기>

- php htmlpurifier 에러 - Warning: Directory DefinitionCache Serializer not writable, please chmod to 777

Posted by 은둔고수
프로그램/php2015. 6. 6. 16:53

PHP PDO를 이용해서 Query문 작성 중 주로 검색에 사용하는 LIKE PDOStatement::bindValue 를 사용해서 구현할 수 있다.

 

$dbh = dbhOpen(‘데이터베이스');

 

$ec_fld = array(':str' => '%' . 문자열 .'%');

$res = $dbh->prepare("SELECT * FROM 테이블 WHERE str = :str");

 

$res->execute($ec_fld);

 

echo "<br />que=" . $res->queryString;  // 사용한 쿼리문 출력(":변수" 값은 알 수 없다.)

 

dbhClose($dbh);

$res = null;


 

 

더보기>

- php pdo 설치하기 / pdo-mysql 모듈 추가 설치하기 / SQLInjection 공격 / 보안

- php pdo db 연결 / pdo db connection / pdo database 접속 / pdo db open

- php pdo limit 사용법 / pdo query limit offset / pdo mysql limit / pdo bindValue


Posted by 은둔고수
프로그램/php2015. 6. 5. 16:02

PHP PDO Database Connection 방법

 

 

function dbhOpen($_db = '') {

  $_DB_CFG = array();

  $_DB_CFG['db_driver'] = 'mysql';

  $_DB_CFG['db_host'] = 'localhost';

  $_DB_CFG['db_user'] = '사용자';

  $_DB_CFG['db_password'] = '비밀번호';

  $_DB_CFG['db_database'] = $_db?$_db:'데이터베이스';

 

  // PDO

  try {

      // MySQL PDO 객체 생성

      // mysql을 다른 DB로 변경하면 다른 DB도 사용 가능

      $dbh = new PDO("mysql:host={$_DB_CFG['db_host']};dbname={$_DB_CFG['db_database']}", $_DB_CFG['db_user'], $_DB_CFG['db_password']);

      $dbh->exec("SET CHARACTER SET utf8");

  //$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);  // 에러 출력하지 않음

      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  // 에러 출력

  //$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);  // Warning만 출력

 

  } catch(PDOException $e) {  // 실 서버에서는 오류 내용을 보여주면 안된다.

  //echo $e->getMessage();

  print "Error!: " . $e->getMessage() . "<br/>";

      die();

  }

  //return $dbc;

  return $dbh;

  }

  function dbhClose($dbh = '') { $dbh = null; }  // PDO Close

}

 

Posted by 은둔고수
프로그램/php2015. 6. 2. 16:13

PHP PDO를 이용해서 Query문 작성 중 LIMIT ?, ? 처럼 동적으로 값이 변경이 되는 LIMIT를 사용하기 위해서

PDOStatement::bindValue 를 사용해서 구현할 수 있다.

 

$dbh = dbhOpen(‘데이터베이스');

 

$res = $dbh->prepare("SELECT * FROM 테이블 WHERE num = :num AND name = :name ORDER BY uq LIMIT :s, :cnt");

 

$res->bindValue(':num', (int)$num, PDO::PARAM_INT);

$res->bindValue(':name', $name, PDO::PARAM_STR);

$res->bindValue(':s', (int)$s, PDO::PARAM_INT);

$res->bindValue(':cnt', (int)$cnt, PDO::PARAM_INT);

 

$res->execute();

 

//echo "<br />query = " . $res->queryString;  // 사용한 쿼리문 출력(":변수" 값은 알 수 없다.)

 

dbhClose($dbh);

$res = null;


 

 

더보기>

- php pdo 설치하기 / pdo-mysql 모듈 추가 설치하기 / SQLInjection 공격 / 보안

- php pdo db 연결 / pdo db connection / pdo database 접속 / pdo db open

- php pdo like 사용법 / pdo query like / pdo mysql like / pdo bindValue

Posted by 은둔고수