커서위치에 글자(문자) 삽입하기

Insert script at cursor position

매게변수는 접근아이디, 텍스트


function insertAtCursor(areaId,text)

{

    var txtarea = document.getElementById(areaId);

    var scrollPos = txtarea.scrollTop;

    var strPos = 0;

    var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ?

        "ff" : (document.selection ? "ie" : false ) );

    if (br == "ie") {

        txtarea.focus();

        var range = document.selection.createRange();

        range.moveStart ('character', -txtarea.value.length);

        strPos = range.text.length;

    }

    else if (br == "ff") strPos = txtarea.selectionStart;

 

    var front = (txtarea.value).substring(0,strPos);

    var back = (txtarea.value).substring(strPos,txtarea.value.length);

    txtarea.value=front+text+back;

    strPos = strPos + text.length;

    if (br == "ie") {

        txtarea.focus();

        var range = document.selection.createRange();

        range.moveStart ('character', -txtarea.value.length);

        range.moveStart ('character', strPos);

        range.moveEnd ('character', 0);

        range.select();

    }

    else if (br == "ff") {

        txtarea.selectionStart = strPos;

        txtarea.selectionEnd = strPos;

        txtarea.focus();

    }

    txtarea.scrollTop = scrollPos;

}



신고

php file download


<?

include"./system.php";





$dir = './duri/goods/pdf';

$filekeyname = $_GET['filekeyname'];

$fpath = $dir."/".$filekeyname;

$filename = preg_replace("/\s| /",'',$_GET['filename']).".pdf";

//echo $fpath;

//exit;



if (file_exists($fpath)) {

    header('Content-Description: File Transfer');

    header('Content-Type: application/octet-stream');

    header("Content-Type: application/force-download");

    header('Content-Disposition: attachment; filename=' . urlencode(basename($filename)));

    // header('Content-Transfer-Encoding: binary');

    header('Expires: 0');

    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

    header('Pragma: public');

    header('Content-Length: ' . filesize($fpath));

    ob_clean();

    flush();

    readfile($fpath);

    exit;

}


?>


신고

'Web > PHP' 카테고리의 다른 글

php 파일 다운로드 (pdf 파일 다운로드 예), php file download  (0) 2017.04.06
php foreach 반복문  (0) 2016.07.07


 


<script type="text/javascript">

jQuery(function(){

    // 숫자 제외하고 모든 문자 삭제.

    $.fn.removeText = function(_v){

        //console.log("removeText: 숫자 제거 합니다.");

        if (typeof(_v)==="undefined")

        {

            $(this).each(function(){

                this.value = this.value.replace(/[^0-9]/g,'');

            });

        }

        else

        {

            return _v.replace(/[^0-9]/g,'');

        }

    };

     

    // php의 number_format과 같은 효과.

    $.fn.numberFormat = function(_v){

        this.proc = function(_v){

            var tmp = '',

                number = '',

                cutlen = 3,

                comma = ','

                i = 0,

                len = _v.length,

                mod = (len % cutlen),

                k = cutlen - mod;

                 

            for (i; i < len; i++)

            {

                number = number + _v.charAt(i);

                if (i < len - 1)

                {

                    k++;

                    if ((k % cutlen) == 0)

                    {

                        number = number + comma;

                        k = 0;

                    }

                }

            }

            return number;

        };

         

        var proc = this.proc;

        if (typeof(_v)==="undefined")

        {

            $(this).each(function(){

                this.value = proc($(this).removeText(this.value));

            });

        }

        else

        {

            return proc(_v);

        }

    };

    $.fn.onlyNumber = function (p) {

        $(this).each(function(i) {

            $(this).attr({'style':'text-align:left'});



             

            this.value = $(this).removeText(this.value);

            this.value = $(this).numberFormat(this.value);

             

            $(this).bind('keypress keyup',function(e){

                this.value = $(this).removeText(this.value);

                this.value = $(this).numberFormat(this.value);

            });

        });

    };

    $('.numberformat').onlyNumber();

});

</script>




1. 위 소스 추가

2. 콤마찍고싶은 input 클래스에 numberformat 추가

3. 콤마데이터 전송시 db 구성에 문제가 있을 수 있으니 submit 할때에 $('.numberformat').removeText(); 를 호출해주면 콤마를 삭제하고 데이터를 전송

4. 감사 댓글 달기

신고

 

일반적인 order by 필드 asc 를 할 경우

 

숫자가 순차적으로 되는것이 아니고 아래 예제처럼 정렬

 

select name from table  order by codename  asc;

 

+-------------------+
| name                    |
+-------------------+
| 1.면                      |
| 10.O                     | 
| 11.마                    |
| 12.브                    |
| 2.린                      |
| 3.의                      |
| 4.계                      |
| 5.방                      |
| 6.커                      |
| 7.누                      |
| 8.패                      |
| 9.부                       |
+-------------------+

 

 

이것을 1,2,3,... 등 숫자 순으로 정렬하기 위해서는 order by 필드 *1 asc 로 정렬조건을 변경

 

정렬하고자 하는 필드 뒤에 *1 이 핵심이며 여러가지로 응용도 가능

 

select name from table  order by cname*1 asc;

 

+-------------------+
cname          |

+-------------------+
| 1.면          |
| 2.린            |
| 3.의        |
| 4.계        |
| 5.방   |
| 6.커        |
| 7.누        |
| 8.패   |
| 9.부          |
| 10.O |
| 11.마     |
| 12.브     |
+-------------------+

신고

사용 예  UPDATE TABLE SET zipcode =  CONCAT(zipcode1, '-', zipcode2); 


위 결과 zipcode 컬럼은 zipcode1(123) , - ,zipcode2(456) 을 더한 = 123-456으로 업데이트 된다.

신고




로그인에 관련된 보안얘기를 하려고 합니다.

password(); // mysql.
md5(); // php.
crypt(); // php.

뭐, 암호화에 관련된 함수들이 여러 가지 있겠지만 위 3가지 함수는 범용적으로 많이들 쓰고 있고
안정성이 검증된 함수들이죠.. 그리고 모두 복호화가 안되거나, 어려운 해쉬함수들입니다.

흔히 password() 로 암호화시킨 비밀번호... 원래의 값을 절대 알 수 없다고들 표현합니다......

절대 알 수 없다 ?
절대 알 수 없다 ?
절대 알 수 없다 ?

id = 'abcd'
pw = '4ed0bdda4ee8f6a5'

위 pw 원래의 값을 과연 절대 알 수 없을까요 ? 정말 그럴까요 ?


password() 뿐 아니라, md5(), crypt() 등 해쉬함수들이 있는데요....
지금부터 제가 생각하고 있는 바를 차근차근 얘기해 나가려고 합니다....

그다지 어려운얘기 아니고요,

누구나 알 수 있는 쉬운 얘기들뿐입니다..

( 제가 워낙 쉬운 것만 좋아해서 쉬운 것밖에는 모릅니다 ^^ )


--------------------------------------------------------------------------------------


가령,

사용자가 비밀번호를 '3204' 라고 입력한 것을  md5() 로 해쉬시키면

' 640258597cbc50037072712f964cf5d8 ' 라는 값이 나오게 되지요...

md5() 는 디코딩을 지원하지 않는 단방향성 해쉬함수이기에 위 문자열을 보고 원래 값 '3204'를
추출 할 수는 없을 것입니다.

나머지 password(), crypt() 들도 마찬가지죠.. 상당히 어려운 알고리즘을 통해 해쉬된 문자열이
나오면서 원래의 값을 알아낼 수는 없게 됩니다.

특히 crypt() 는 두 번째에 주어지는 salt 값에 따라  똑같은 패스워드를 해쉬해도 결과는
매번 틀리게 됩니다...

가령,

$password = '20930';
$savepw = crypt( $password, md5( time() ) );
이런식으로 하면

실행 할 때마다 94JrlBxXigCZU , 30K4887zrFHBw , 등의 틀린 결과를 나오게 합니다.

모두 대단한 함수들입죠 ~~


------------------------- 그런데, 취약점은 항상 있는 법 --------------------------------

아이디 해킹을 하기위한 몇 가지 조건들이 있기 마련이죠..
그중, 해킹에 의해 DB가 노출되었다고 칩니다......

DB 비번관리를 잘못하던지, 디렉토리파싱을 당하던지 여러 이유로 DB가 노출되었다고 치구요..

DB 내용에는 사용자 계정 정보가

id = 'abcd'
pw = '640258597cbc50037072712f964cf5d8'

위처럼 되있다고 치구요.....


비밀번호가 암호화 되어있으니, 과연 안전할까요 ?

그런데 위 문자열 패턴을 보면, md5 로 해쉬된 것을 쉽게 알 수 있습니다.
지금부터 md5() 함수를 이용해서 원래의 비번을 찾아보도록 하겠습니다.

<?
for( $pw = 0; $pw < 99999; $pw ++ ) {
       if( '640258597cbc50037072712f964cf5d8' == md5( $pw ) ) {
              echo "find ok : $pw ";
              break;
       }
}
// 출력 -> find ok : 3204
?>

간단하게 찾았습니다.



그러면, crypt() 는 안전 할까요 ??

아닙니다.. crypt() 역시 똑 같습니다..

노출된 DB 에.
id = 'abcd'
pw = '12FP8QJo.OCVg';

위 문자열 패턴을 보면, crypt() 로 해쉬된 것을 알 수 있습니다.
이것도 원래의 비번을 찾아보도록 하겠습니다.
<?
for( $i = 0; $i < 99999; $i ++ ) {
       if( '12FP8QJo.OCVg' == crypt( $i, '12FP8QJo.OCVg' ) ) {
              echo " find ok : $i ";
              break;
       }
}
// 출력 -> find ok : 20930
?>

이번에도 결과가 나와 버립니다.


하지만 실제 암호는 숫자만 쓰는 것이 아니고, 문자열을 섞어서 입력하겠지요?
그렇다고 못 찾는 건 아닙니다.
.....
.....
$pw = $chk.chr($i);
if( '640258597cbc50037072712f964cf5d8' == md5( $pw ) ) {
.....
.....
}
$i ++;
if( $i > 126 ) $chk = ( ord( $chk ) + 1 );
.....
.....

저런 식으로 숫자 대신 문자를 자동으로 대입하게 해서 돌아가게 만들면 된다는 것이죠....

수행시간이 오래 걸린 것입니다만,,
문자 하나당 유효값이 93 자 인가? 그러니, 비밀번호가 4글자만 되도
loop 를 93 * 93 * 93 * 93 = 74,805,201 번을 돌아야 할 것입니다...

문제는 요즘 컴퓨터 성능이 워낙 좋아져서, loop 도는 시간이 그리 오래 걸리지도 않고,
또, 단위별로 끊어서 몇 단계 나누어서 병렬로 돌리면 결과는 더욱 빨리 나오게 된다는 것이죠.

그리고, 시간이 좀 걸려서 1주일쯤 걸렸다고 칩니다.
그 1주일동안 해커가 컴퓨터 앞에 매달려 있습니까 ? 잠을 못잡니까 ?
계속 지켜봐야 합니까 ?? 아니면 컴퓨터가 망가집니까 ?

그냥 디코드 돌려놓고 지 할일 하다가 결과 나오면 그때 해킹하는 것이죠...



------------------------------------------------------------------------------

결국은 DB 가 노출되거나, 해쉬된 비밀번호의 결과값이 노출되면 게임은 끝이라는 겁니다.

가령, 비밀번호를 암호화시켰다고 해서 비밀번호를 쿠키로 날아다니게한다던지,
페이지에 폼값으로 날려준다던지 하는 것은 해커에게 비밀번호를 다이렉트로 알려주는 것과
같습니다......

그럼,

비밀번호 안 날라 다니게 하고 DB노출만 막으면 안전할까요 ??


그것도 만만치 않습니다.

크라이언트에서 서버 접속해서 비밀번호 처음에 날려줄 때,,,,
네트웍을 감시당하면 아예, 원 비밀번호가 그대로 노출될 수 있습니다...

그래서 클라이언트에서도 JavaScript 를 이용해서 나름대로 암호화시킨 문자열을
날아다니게 하지요...

네트웍 감시를 당했을 때, 암호화된 비밀번호가 노출되는 것이구요..

하지만,, 이 역시 결과는 마찬가지죠.......

이 경우는 암호를 풀고 자시고도 없이
그냥 암호화된 비번 그 자체를 login 페이지로 날려서 그대로 접속해 버리면 되지요..
이 경우라면 원래의 암호는 알 필요도 없는 것이지요..


-------------------- 그럼 가장 안전한 방법은 무엇인가 ---------------------------------

개발자는 어떤 상황이던 비밀번호 스트링이 네트웍감시를 당하던, DB 가 노출되던 해서
해커에게 알려진다고 간주해야 합니다.

그럼 이러던 저러던 끝이라는 얘기일까요 ?
... 꼭 그렇지만은 않다고 봅니다.

여기서 우리는 보안을 위해 몇 가지 노력해야 할 것이 있습니다.


#-------------- 비밀번호가 어떤 모듈로 해쉬가 됐는지 모르게 하자.

가장 쉬운 방법은,, 암호화함수 1개에 의존하지 않고 여러 함수를 거쳐 2중 3중으로 돌려야 합니다.



#-------------- 외부에 노출이 안되는 서버만의 고유한 토큰키를 만들자.

가령,

사용자가 '1234' 라는 비밀번호를 쳤을 때 DB 저장할 때는 고유의 '키값'을 정해 눌러서 저장합니다.
예) 키값 '1011' + 비밀번호 '1234' = '2245'
저장도 '2245' 로 저장하고 로그인 인증 때도 또 키값을 더해서 인증하는 것이죠...

'키값'은 절대 DB 에 저장하지 않고, 파일로 접근하게 만듭니다.
서버 자체가 해킹당하기 전에는 절대 볼 수 없도록 실행권한과 접근권한도 설정 되야 겠지요..



#-------------- 클라이언트와 주고받는 비밀번호역시 또 다른 유일한 '키값'을 부여해서 주고받습니다...

서버쪽에서 DB 저장할 때와는 조금 틀리죠...
이 '키값'은 접속시마다 틀리게 합니다.

예) 키값 '0012'

클라이언트 '1234' + '0012' = '1246' ---- 송신 ----> 서버 '1246' - '0012' = '1234' 저장.

그런데,
주고 받을때 사용하는 키값은 클라이언트 페이지에 남아 있으면 안됩니다.

가령,

<form name=hashKey type=hidden value='<?=$hashKey?>'>

저렇게 되 있다면,

Temporary Internet Files 디렉토리만 뒤져봐도 키값이 노출되겠지요...

그러니 페이지에 남기지 않고 로그아웃시 메모리에서 사라지게
lifetime 0 짜리 1회용 쿠키나 세션에 담아쓰면 좀 낳을 수 있겠지요...

페이지에서 쿠키값을 검색해서 '키값'을 뽑아내고 메모리 상에서만 연산을 하면 되겠지요..

저렇게나마 해 두면 네트웍 감시를 당해도

id = 'abcd'
pw = '1246'
이라는 해쉬된 값이 나오기 때문에 원래의 비밀번호 '1234' 는
'키값'을 알기 전에는 무용지물이 되겠지요....

그리고  login 페이지로 '1246'을 날려도 소용없게 해야죠...
주고받는 그 때만 생성되는 유니크한 값을 '키값'으로 사용해서
어떨 때는 '1246' 이 '1234' 로 해석되지만,
어떨 때는 '3266' 이 '1234' 로 해석이 되게 하는 등.....
지속적으로 키값이 바뀌게 해야 하는 것이죠.....


보통 setCookie("hashKey", rand( 1000, 9000), 0 ) 식으로 라이프타임을 0 으로 주면
페이지 접속창이 닫힐 때 까지만 한번 정해진 '키값'이 유효한 상태가 되고,
이후 새로운 창이 열리거나 기존 창을 닫으면 사라지게 되지요..

쿠키도 마찬가지로 라이프타임을 0 으로 주면 되구요,.,



------------- 이정도 가지만 해도 ---------------------------------------------------

# DB 가 노출되었을 때 사용자들을 보호할 수 있습니다.

# 네트웍이 감시를 당해도 원래의 아이디를 모를 뿐 아니라
    해쉬된 스트링으로 로그인을 시도해도 키값이 수시로 변하기에 안전할 수 있습니다.



물론 헤커가 세션과, 쿠키까지 파싱하고, 서버디렉토리도 들락날락거린다면 속수무책이 되게지만,
최소한 실력없는 헤커로부터는 안전을 보장받을 수 있게 됩니다.




아참,
mysql 의 password() 함수를 실험 안 해 보았군요....



id = 'abcd'
pw = '4ed0bdda4ee8f6a5'

<?
for( $i = 0; $i < 99999; $i ++ ) {

       $temp = mysql_fetch_array( mysql_query ( "select password('$i')" ) );

       if( '4ed0bdda4ee8f6a5' == $temp[0] ) {
              echo " find ok : $i ";
              break;
       }
}
// 출력 -> find ok : 50267
?>

 

출처 : http://www.phpschool.com



※ 비밀번호가 숫자가 아닌경우 해당 정규식 패턴으로 찾아야 하기 때문에 루프 시간이 걸린다.

신고




<style type="text/css">

* { margin:0; padding:0; }

ul,li { list-style:none; }

a { text-decoration:none; color:#000; }

.tab { border:1px solid #ddd; border-left:none; background:#fff; overflow:hidden; }

.tab li { float:left; width:33.3%; border-left:1px solid #ddd; text-align:center; box-sizing:border-box; }

.tab li { display:inline-block; padding:20px; cursor:pointer; }

.tab li.on { background-color:#eee; color:#f00; }

.tab_con { clear:both; margin-top:5px; border:1px solid #ddd; }

.tab_con div { display:none; height:100px; background:#fff; line-height:100px; text-align:center; }

</style>


<script type="text/javascript">

$(function () {

tab('#tab',0);

});


function tab(e, num){

    var num = num || 0;

    var menu = $(e).children();

    var con = $(e+'_con').children();

    var select = $(menu).eq(num);

    var i = num;


    select.addClass('on');

    con.eq(num).show();


    menu.click(function(){

        if(select!==null){

            select.removeClass("on");

            con.eq(i).hide();

        }


        select = $(this);

        i = $(this).index();


        select.addClass('on');

        con.eq(i).show();

    });

}

</script>

<ul class="tab" id="tab">

    <li>A</li>

    <li>B</li>

    <li>C</li>

</ul>


<div class="tab_con" id="tab_con">

    <div>1st Contents</div>

    <div>2nd Contents</div>

    <div>3rd Contents</div>

</div>


※ jquery import 필요

신고



APMSETUP7 'MySQL'에서 한글깨짐을 처리하기 위한 UTF-8 캐릭터셋 설정


mysql->콘솔 메뉴 접속, 비밀번호 입력(apmsetup)


mysql> show variables like 'c%';   은 아래 결과





my.ini 파일 수정


C:\APM_Setup\Server\MySQL5\data(경로확인)  my.ini



다음의 내용 추가 해당 []타이틀 안에만 포함되면 줄번호는 상관없음


[client]

default-character-set=utf8


[mysqld]

init_connect=SET collation_connection = utf8_general_ci

init_connect=SET NAMES utf8

default-character-set=utf8

character-set-server=utf8

collation-server=utf8_general_ci


[mysql]

default-character-set=utf8



3. 저장 후 상위 폴더인 mysql5 에도 똑같은 파일을 복사 



C:\APM_setup\Server\MYSQL5\data 폴더 my.ini

C:\APM_setup\Server\MYSQL5 폴더 my.ini 


이렇게 하지 않으면 인식하지 못함



4. apm 모니터 재시작, stop > start





변경 확인 mysql> show variables like 'c%';



신고

+ Recent posts

티스토리 툴바