'프로그램/php'에 해당되는 글 57건
- 2015.08.23 php 마지막 문자 자르기 / 문자 제거 / 문자열 삭제 / substr 함수 / 문자 찾기 / 문자열 자르기
- 2015.07.22 php ip 변경 / ip 변환 / ip 정보 대체 / ip 값 일부분 문자열 변경하기 / 문자열 ip 변환 / ip주소값 일부 변경
- 2015.07.16 php 웹내용 가져오기 / 웹소스 긁어오기 / 페이지 가져 오기 / url 가져오기 / html 웹페이지 소스 / file / allow_url_fopen / curl
- 2015.07.11 php xss 첨부파일 공격 방어 / XSS 해킹 / php 해킹 막기 / php 보안 / xss 차단 / Cross site scripting
- 2015.07.01 php img src 추출 / img 태그 추출 / 정규식 img src 값 추출 / preg_match / preg_match_all / 이미지 src값만 추출
- 2015.06.24 php htmlpurifier 에러 - Warning: Directory DefinitionCache Serializer not writable, please chmod to 777
- 2015.06.24 PHP HTMLPurifier 설치 / php 보안 / php xss / php script 보안 / cross-site scripting
- 2015.06.06 php pdo like 사용법 / pdo query like / pdo mysql like / pdo bindValue
- 2015.06.05 php pdo db 연결 / pdo db connection / pdo database 접속 / pdo db open
- 2015.06.02 php pdo limit 사용법 / pdo query limit offset / pdo mysql limit / pdo bindValue
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.???
웹 화면의 특정 페이지의 내용을 가져오기 위해 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을 이용해서 특정 웹 소스 내용을 가져온다.
첨부파일을 통한 XSS 공격 방식은
XSS 공격용 파일을 만들어(확장자만 jpg 같은 이미지로 변경한 파일, html, 기타 등) 첨부파일로 업로드 한 후 해당 파일을 클릭하면 실행이 되거나 해커 서버에 연결해서 원하는 정보(예>쿠키)를 얻어 가는 공격이다.
첨부파일이 업로드되는 경로에 다음의 내용으로 .htaccess 파일을 생성한다.
.htaccess
<IfModule mod_headers.c>
Header set Content-Disposition attachment
</IfModule>
생성을 한 후 첨부파일을 클릭하거나
브라우저 입력란에 해당 파일의 url 경로를 직접 입력해서 실행해보면
무조건 다운로드 창이 실행되기 때문에 파일이 실행되는 것을 막을 수 있으며 공격도 막을 수 있게 된다.
참고> 첨부파일 업로드 경로를 웹 서버 경로(DOCUMENT_ROOT)가 아닌 웹으로 접근할 수 없는 경로로 한 후 파일명은 DB 등에 저장을 하고 파일명 자체도 알 수 없는 임의의 파일명으로 바꾸어서 업로드하는 방법이 있다.
다운로드를 하는 경우에는 별도의 다운로드 실행 파일을 만들어서 사용을 한다.
정규식을 이용해서 게시물 내용에서 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);
// 결과
오류>
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
HTMLPurifier는 XSS(cross-site scripting) 취약점을 필터링을 하는 라이브러리로
게시판의 글 제목이나 글 내용 등에 script, onmouseover 등을 삽입해 공격을 하거나 에러 등을 만들어서 원하는 정보를 알아내는 취약점을 필터링해서 안전한 속성, 이벤트, 태그 등만을 허용한다.
[HTML Purifier 설치하기]
http://htmlpurifier.org 에서 다운을 받아 압축을 푼 후 library 디렉토리만 서버에 업로드 하는 것으로 설치가 끝난다. (zip 파일을 사용했다.)
(리눅스에서 바로 다운받고 싶다면 .tar.gz 파일을 사용한다.)
더보기>
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
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
}
더보기>
- php pdo 설치하기 / pdo-mysql 모듈 추가 설치하기 / SQLInjection 공격 / 보안
- php pdo limit 사용법 / pdo query limit offset / pdo mysql limit / pdo bindValue
- php pdo like 사용법 / pdo query like / pdo mysql like / pdo bindValue
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