Posted by on the 6th of February, 2018 at 10:51 pm under 사는이야기.  Post is not tagged.  This post has 2 comments.

iwinv에서 perl CGI script를 어떻게 했나 궁금하신 분이 계셔서 정리 해 봅니다.

안 해본 방법

홈페이지를 옮기고 나서 perl CGI script가 동작하지 않는 것을 확인하고 게시판에 문의를 넣어봤습니다. 거기에 이런 답변을 받았습니다. 답변 받은 내용이니 아마 될 거 같은데 전 답변을 확인한 시점이 이미 아래 적을 PHP를 만든 뒤여서 확인은 안했습니다.

안녕하세요.

iwinv 입니다.

웹호스팅에서 perl과 cgi 기능을 이용 하실 수는 있으나, 웹방화벽을 사용 하고 계시면 정상적으로 이용 할 수 없을 수도 있습니다.

관리 콘솔 – 계정 – 웹방화벽 off 를 해보시기 바랍니다.

감사합니다.

PHP wrapper script로 돌리는 방법

php로 직접 perl cgi를 실행하고 그 결과를 HTML로 전달하는 방법입니다.

<?php
echo "<!--".PHP_EOL;

$num_get = count($_GET);
$num_post = count($_POST);

echo " # of _GET:".$num_get.PHP_EOL;
echo " # of _POST:".$num_post.PHP_EOL;

$param = "";

if($num_get > 0)
{
    foreach($_GET as $key => $value)
    {
        echo $key.'='.$value.PHP_EOL;
        $param = $param."$key=$value&";
    }
}

if($num_post > 0)
{
    foreach($_POST as $key => $value)
    {
        echo $key.'='.$value.PHP_EOL;
        $param = $param."$key=$value&";
    }
}

echo "-->".PHP_EOL;

exec("QUERY_STRING=\"$param\" /usr/bin/perl ".dirname($_SERVER['SCRIPT_FILENAME'])."/pldbbs.cgi", $output);

$header_found = 0;

foreach($output as $line)
{
    if($header_found == 0)
    {
        if(strlen($line) > 0)
        {
            continue;
        }
        else
        {
            $header_found = 1;
        }
    }    

    $line = str_replace("pldbbs.cgi", "pldbbs.php", $line);
    echo $line.PHP_EOL;
}
?>

GET 또는 POST 변수들을 만들어서 QUERY_STRING으로 전달하고 perl을 이용해 직접 스크립트를 실행합니다. 실행한 결과에서 http header 부분을 제거하고 html 부분에서 pldbbs.cgi를 pldbbs.php로 바꿨습니다. 저 같은 경우는 예전에 사용한 방명록을 읽기 전용으로 바꿨기 때문에 이 정도 수정으로 충분 했습니다. 쿠키를 쓰는 경우는 해당 코드를 추가로 구현해야 합니다.

덧붙여서 cgi 파일 소스가 그대로 나오기 때문에 다음과 같이 .htaccess 파일을 추가해서 소스가 나오지 않게 하는 것이 좋습니다.

<Files ~ "^.*\.([cC][gG][iI]|[lL][oO][gG])">
order allow,deny
deny from all
satisfy all
</Files>