The Common Gateway Interface, or CGI, is a set of standards that define how information is exchanged between the web server and a custom script.
The CGI specs are currently maintained by the NCSA and NCSA defines CGI is as follows:
The Common Gateway Interface, or CGI, is a standard for external gateway programs to interface with information servers such as HTTP servers.
The current version is CGI/1.1 and CGI/1.2 is under progress.
Web Browsing
To understand the concept of CGI, let's see what happens when we click a hyperlink to browse a particular web page or URL.
Your browser contacts the HTTP web server and demand for the URL ie. filename.
Web Server will parse the URL and will look for the filename. If it finds requested file then web server sends that file back to the browser otherwise sends an error message indicating that you have requested a wrong file.
Web browser takes response from web server and displays either the received file or error message based on the received response.
However, it is possible to set up the HTTP server in such a way that whenever a file in a certain directory is requested, that file is not sent back; instead it is executed as a program, and produced output from the program is sent back to your browser to display.
The Common Gateway Interface (CGI) is a standard protocol for enabling applications (called CGI programs or CGI scripts) to interact with Web servers and with clients. These CGI programs can be a written in Python, PERL, Shell, C or C++ etc.
CGI Architecture Diagram
The following simple program shows a simple architecture of CGI:
Web Server Configuration
Before you proceed with CGI Programming, make sure that your Web Server supports CGI and it is configured to handle CGI Programs. All the CGI Programs to be executed by the HTTP server are kept in a pre-configured directory. This directory is called CGI directory and by convention it is named as /var/www/cgi-bin. By convention CGI files will have extension as .cgi, though they are C++ executable.
By default, Apache Web Server is configured to run CGI programs in /var/www/cgi-bin. If you want to specify any other directory to run your CGI scripts, you can modify the following section in the httpd.conf file:
<Directory"/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory><Directory"/var/www/cgi-bin">
Options All
</Directory>
Here, I assumed that you have Web Server up and running successfully and you are able to run any other CGI program like Perl or Shell etc.
First CGI Program
Consider the following C++ Program content:
#include<iostream>usingnamespace std;int main (){
cout <<"Content-type:text/html\r\n\r\n";
cout <<"<html>\n";
cout <<"<head>\n";
cout <<"<title>Hello World - First CGI Program</title>\n";
cout <<"</head>\n";
cout <<"<body>\n";
cout <<"<h2>Hello World! This is my first CGI program</h2>\n";
cout <<"</body>\n";
cout <<"</html>\n";return0;}
Compile above code and name the executable as cplusplus.cgi. This file is being kept in /var/www/cgi-bin directory and it has following content. Before running your CGI program make sure you have change mode of file using chmod 755 cplusplus.cgi UNIX command to make file executable. Now if you click cplusplus.cgi then this produces the following output:
Hello World! This is my first CGI program
Above C++ program is a simple program which is writing its output on STDOUT file ie. screen. There is one important and extra feature available which is first line to be printed Content-type:text/html\r\n\r\n. This line is sent back to the browser and specify the content type to be displayed on the browser screen. Now you must have understood basic concept of CGI and you can write many complicated CGI programs using Python. A C++ CGI program can interact with any other exernal system, such as RDBMS, to exchange information.
HTTP Header
The line Content-type:text/html\r\n\r\n is part of HTTP header, which is sent to the browser to understand the content. All the HTTP header will be in the following form
There are few other important HTTP headers, which you will use frequently in your CGI Programming.
Header
Description
Content-type:
A MIME string defining the format of the file being returned. Example is Content-type:text/html
Expires: Date
The date the information becomes invalid. This should be used by the browser to decide when a page needs to be refreshed. A valid date string should be in the format 01 Jan 1998 12:00:00 GMT.
Location: URL
The URL that should be returned instead of the URL requested. You can use this filed to redirect a request to any file.
Last-modified: Date
The date of last modification of the resource.
Content-length: N
The length, in bytes, of the data being returned. The browser uses this value to report the estimated download time for a file.
Set-Cookie: String
Set the cookie passed through the string
CGI Environment Variables
All the CGI program will have access to the following environment variables. These variables play an important role while writing any CGI program.
Variable Name
Description
CONTENT_TYPE
The data type of the content. Used when the client is sending attached content to the server. For example file upload etc.
CONTENT_LENGTH
The length of the query information. It's available only for POST requests
HTTP_COOKIE
Return the set cookies in the form of key & value pair.
HTTP_USER_AGENT
The User-Agent request-header field contains information about the user agent originating the request. Its name of the web browser.
PATH_INFO
The path for the CGI script.
QUERY_STRING
The URL-encoded information that is sent with GET method request.
REMOTE_ADDR
The IP address of the remote host making the request. This can be useful for logging or for authentication purpose.
REMOTE_HOST
The fully qualified name of the host making the request. If this information is not available then REMOTE_ADDR can be used to get IR address.
REQUEST_METHOD
The method used to make the request. The most common methods are GET and POST.
SCRIPT_FILENAME
The full path to the CGI script.
SCRIPT_NAME
The name of the CGI script.
SERVER_NAME
The server's hostname or IP Address
SERVER_SOFTWARE
The name and version of the software the server is running.
Here is small CGI program to list out all the CGI variables. Click this link to see the result Get Environment
#include<iostream>#include<stdlib.h>usingnamespace std;conststring ENV[24]={"COMSPEC","DOCUMENT_ROOT","GATEWAY_INTERFACE","HTTP_ACCEPT","HTTP_ACCEPT_ENCODING","HTTP_ACCEPT_LANGUAGE","HTTP_CONNECTION","HTTP_HOST","HTTP_USER_AGENT","PATH","QUERY_STRING","REMOTE_ADDR","REMOTE_PORT","REQUEST_METHOD","REQUEST_URI","SCRIPT_FILENAME","SCRIPT_NAME","SERVER_ADDR","SERVER_ADMIN","SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL","SERVER_SIGNATURE","SERVER_SOFTWARE"};int main (){
cout <<"Content-type:text/html\r\n\r\n";
cout <<"<html>\n";
cout <<"<head>\n";
cout <<"<title>CGI Envrionment Variables</title>\n";
cout <<"</head>\n";
cout <<"<body>\n";
cout <<"<table border = \"0\" cellspacing = \"2\">";for(int i =0; i <24; i++){
cout <<"<tr><td>"<< ENV[ i ]<<"</td><td>";// attempt to retrieve value of environment variablechar*value = getenv( ENV[ i ].c_str());if( value !=0){
cout << value;}else{
cout <<"Environment variable does not exist.";}
cout <<"</td></tr>\n";}
cout <<"</table><\n";
cout <<"</body>\n";
cout <<"</html>\n";return0;}
C++ CGI Library
For real examples, you would need to do many operations by your CGI program. There is a CGI library written for C++ program which you can download from ftp://ftp.gnu.org/gnu/cgicc/ and following the following steps to install the library:
You must have come across many situations when you need to pass some information from your browser to web server and ultimately to your CGI Program. Most frequently browser uses two methods two pass this information to web server. These methods are GET Method and POST Method.
Passing Information using GET method:
The GET method sends the encoded user information appended to the page request. The page and the encoded information are separated by the ? character as follows:
The GET method is the default method to pass information from browser to web server and it produces a long string that appears in your browser's Location:box. Never use the GET method if you have password or other sensitive information to pass to the server. The GET method has size limitation and you can pass upto 1024 characters in a request string.
When using GET method, information is passed using QUERY_STRING http header and will be accessible in your CGI Program through QUERY_STRING environment variable
You can pass information by simply concatenating key and value pairs alongwith any URL or you can use HTML <FORM> tags to pass information using GET method.
Simple URL Example : Get Method
Here is a simple URL which will pass two values to hello_get.py program using GET method.
Below is program to generate cpp_get.cgi CGI program to handle input given by web browser. We are going to use C++ CGI library which makes it very easy to access passed information:
#include<iostream>#include<vector>#include<string>#include<stdio.h>#include<stdlib.h>#include<cgicc/CgiDefs.h>#include<cgicc/Cgicc.h>#include<cgicc/HTTPHTMLHeader.h>#include<cgicc/HTMLClasses.h>usingnamespace std;usingnamespace cgicc;int main (){Cgicc formData;
cout <<"Content-type:text/html\r\n\r\n";
cout <<"<html>\n";
cout <<"<head>\n";
cout <<"<title>Using GET and POST Methods</title>\n";
cout <<"</head>\n";
cout <<"<body>\n";
form_iterator fi= formData.getElement("first_name");if(!fi->isEmpty()&&fi!=(*formData).end()){
cout <<"First name: "<<**fi<< endl;}else{
cout <<"No text entered for first name"<< endl;}
cout <<"<br/>\n";fi= formData.getElement("last_name");if(!fi->isEmpty()&&fi!=(*formData).end()){
cout <<"Last name: "<<**fi<< endl;}else{
cout <<"No text entered for last name"<< endl;}
cout <<"<br/>\n";
cout <<"</body>\n";
cout <<"</html>\n";return0;}
Now, compile the above program as follows:
$g++-o cpp_get.cgi cpp_get.cpp -lcgicc
Generate cpp_get.cgi and put it in your CGI directory and try to access using following link:
Here is a simple example which passes two values using HTML FORM and submit button. We are going to use same CGI script cpp_get.cgi to handle this input.
<formaction="/cgi-bin/cpp_get.cgi"method="get">
First Name: <inputtype="text"name="first_name"><br/>
Last Name: <inputtype="text"name="last_name"/><inputtype="submit"value="Submit"/></form>
Here is the actual output of the above form, You enter First and Last Name and then click submit button to see the result.
Passing Information using POST method:
A generally more reliable method of passing information to a CGI program is the POST method. This packages the information in exactly the same way as GET methods, but instead of sending it as a text string after a ? in the URL it sends it as a separate message. This message comes into the CGI script in the form of the standard input.
The same cpp_get.cgi program will handle POST method as well. Let us take same example as above, which passes two values using HTML FORM and submit button but this time with POST method as follows:
<formaction="/cgi-bin/cpp_get.cgi"method="post">
First Name: <inputtype="text"name="first_name"><br/>
Last Name: <inputtype="text"name="last_name"/><inputtype="submit"value="Submit"/></form>
Here is the actual output of the above form, You enter First and Last Name and then click submit button to see the result.
Passing Checkbox Data to CGI Program
Checkboxes are used when more than one option is required to be selected.
Here is example HTML code for a form with two checkboxes
TEXTAREA element is used when multiline text has to be passed to the CGI Program.
Here is example HTML code for a form with a TEXTAREA box:
<formaction="/cgi-bin/cpp_textarea.cgi"method="post"target="_blank"><textareaname="textcontent"cols="40"rows="4">
Type your text here...
</textarea><inputtype="submit"value="Submit"/></form>
The result of this code is the following form
Below is C++ program, which will generate cpp_textarea.cgi script to handle input given by web browser through text area.
#include<iostream>#include<vector>#include<string>#include<stdio.h>#include<stdlib.h>#include<cgicc/CgiDefs.h>#include<cgicc/Cgicc.h>#include<cgicc/HTTPHTMLHeader.h>#include<cgicc/HTMLClasses.h>usingnamespace std;usingnamespace cgicc;int main (){Cgicc formData;
cout <<"Content-type:text/html\r\n\r\n";
cout <<"<html>\n";
cout <<"<head>\n";
cout <<"<title>Text Area Data to CGI</title>\n";
cout <<"</head>\n";
cout <<"<body>\n";
form_iterator fi= formData.getElement("textcontent");if(!fi->isEmpty()&&fi!=(*formData).end()){
cout <<"Text Content: "<<**fi<< endl;}else{
cout <<"No text entered"<< endl;}
cout <<"<br/>\n";
cout <<"</body>\n";
cout <<"</html>\n";return0;}
Passing Drop Down Box Data to CGI Program
Drop Down Box is used when we have many options available but only one or two will be selected.
Here is example HTML code for a form with one drop down box
Below is C++ program, which will generate cpp_dropdown.cgi script to handle input given by web browser through drop down box.
#include<iostream>#include<vector>#include<string>#include<stdio.h>#include<stdlib.h>#include<cgicc/CgiDefs.h>#include<cgicc/Cgicc.h>#include<cgicc/HTTPHTMLHeader.h>#include<cgicc/HTMLClasses.h>usingnamespace std;usingnamespace cgicc;int main (){Cgicc formData;
cout <<"Content-type:text/html\r\n\r\n";
cout <<"<html>\n";
cout <<"<head>\n";
cout <<"<title>Drop Down Box Data to CGI</title>\n";
cout <<"</head>\n";
cout <<"<body>\n";
form_iterator fi= formData.getElement("dropdown");if(!fi->isEmpty()&&fi!=(*formData).end()){
cout <<"Value Selected: "<<**fi<< endl;}
cout <<"<br/>\n";
cout <<"</body>\n";
cout <<"</html>\n";return0;}
Using Cookies in CGI
HTTP protocol is a stateless protocol. But for a commercial website it is required to maintain session information among different pages. For example one user registration ends after completing many pages. But how to maintain user's session information across all the web pages.
In many situations, using cookies is the most efficient method of remembering and tracking preferences, purchases, commissions, and other information required for better visitor experience or site statistics.
How It Works
Your server sends some data to the visitor's browser in the form of a cookie. The browser may accept the cookie. If it does, it is stored as a plain text record on the visitor's hard drive. Now, when the visitor arrives at another page on your site, the cookie is available for retrieval. Once retrieved, your server knows/remembers what was stored.
Cookies are a plain text data record of 5 variable-length fields:
Expires : The date the cookie will expire. If this is blank, the cookie will expire when the visitor quits the browser.
Domain : The domain name of your site.
Path : The path to the directory or web page that set the cookie. This may be blank if you want to retrieve the cookie from any directory or page.
Secure : If this field contains the word "secure" then the cookie may only be retrieved with a secure server. If this field is blank, no such restriction exists.
Name=Value : Cookies are set and retrieved in the form of key and value pairs.
Setting up Cookies
This is very easy to send cookies to browser. These cookies will be sent along with HTTP Header before to Content-type filed. Assuming you want to set UserID and Password as cookies. So cookies setting will be done as follows
From this example, you must have understood how to set cookies. We use Set-Cookie HTTP header to set cookies.
Here, it is optional to set cookies attributes like Expires, Domain, and Path. It is notable that cookies are set before sending magic line "Content-type:text/html\r\n\r\n.
Compile above program to produce setcookies.cgi, and try to set cookies using following link. It will set four cookies at your computer:
To upload a file the HTML form must have the enctype attribute set to multipart/form-data. The input tag with the file type will create a "Browse" button.
Note: Above example has been disabled intentionally to save people uploading files on our server. But you can try above code with your server.
Here is the script cpp_uploadfile.cpp to handle file upload:
#include<iostream>#include<vector>#include<string>#include<stdio.h>#include<stdlib.h>#include<cgicc/CgiDefs.h>#include<cgicc/Cgicc.h>#include<cgicc/HTTPHTMLHeader.h>#include<cgicc/HTMLClasses.h>usingnamespace std;usingnamespace cgicc;int main (){Cgicc cgi;
cout <<"Content-type:text/html\r\n\r\n";
cout <<"<html>\n";
cout <<"<head>\n";
cout <<"<title>File Upload in CGI</title>\n";
cout <<"</head>\n";
cout <<"<body>\n";// get list of files to be uploaded
const_file_iterator file = cgi.getFile("userfile");if(file != cgi.getFiles().end()){// send data type at cout.
cout <<HTTPContentHeader(file->getDataType());// write content at cout.
file->writeToStream(cout);}
cout <<"<File uploaded successfully>\n";
cout <<"</body>\n";
cout <<"</html>\n";return0;}
The above example is writing content at cout stream but you can open your file stream and save the content of uploaded file in a file at desired location.
Hope you enjoyed this tutorial. If yes, please send me your feedback at: Contact Us
crontab은 스케줄링을 관리하는 프로그램으로 시스템 관리자에게 중요한 유틸 중 하나이다. 특정 시간대에 사용자가 작성한 스트립트나 명령을 실행 할 수 있다. 이는 rsync 같은 툴을 같이 사용하여 굉장히 편리한 백업 시스템을 만들 수도 있고 데이터 베이스관리나 기타 반복적인 업무를 간편하게 등록하여 사용 할 수 있다.
MIN HOUR DOM MON DOW CMD
필드
명세
허용 값
MIN
분
0~59
HOUR
시간
0~23
DOM
날짜
1-31
MON
달
1-12
DOW
주
0-6
CMD
명령어
실행 가능 한 모든 명령어
1. 다음 시간 6월 10일 오전 8시 30분 을 cron 명령어에 맞게 작성해보자.
30 08 10 06 * /home/script/backup
30: 30분
08: 오전 8시 <24시제>
10: 10일
06: 6월
*: 매주
2. crontab 목록 수정
목록 수정을 vi/vim으로 편집하려면 변수를 선언해줘야 한다. export VISUAL=vim
1. 토르를 실행하고 설정-서비스들에서 서비스를 추가한다. 가상포트는 80, 디렉터리는 히든서비스 정보가 저장될 위치를 지정한다. 위치를 지정하기 전에 폴더가 존재하는지 확인한다. 없으면 만들어주자. ex)C:\xampp\torrc\
2. 확인을 누른 후 다시 설정-서비스들에 가면 양파주소가 생긴것을 확인할 수 있다. 이제 주소를 복사하기 위해 서비스를 선택하고(80을 누르면 선택된다) 복사 아이콘(겹친 종이모양)을 누르면 주소가 복사된다. 토르가 실행중이 아닐 때에는 위에서 설정한 C:\xampp\torrc\ 에서 확인할 수 있다.
3. 토르 브라우저에 주소를 복사하여 접속한다.
히든위키에 홍보
이제 내가 만든 사이트를 딥웹 세계에 알리기 위해 히든위키에 접속해서 자신의 주소를 올리고 간략히 설명하도록 한다. 단, 아동포르노(그림이 아닌 실제아동)는 해외 해커들의 공격대상이 될 수 있으니 자제하도록 한다.
주의사항
토르 네트워크 자체는 익명성을 보장하지만 접속자의 PC나 서버가 바이러스에 감염되면 스스로 개인정보를 유출해버릴 수 있다. 보안을 위해 다음과 같은 사항을 지켜야 한다.
1. 백신설치
2. 사이트 내에 개인정보를 남기지 말 것
3. IP와 같은 서버의 정보를 보여줄 수 있는 코드를 넣지 말 것
4. 아동포르노와 같이 미국정부나 해커를 자극할만한 사이트를 함부로 히든위키에 홍보하지 말 것, 자신의 보안실력을 100% 신뢰하지 않는다면 정말로 하지 않는편이 좋다
self.timeout = 640000 #640 seconds / 10 minutes (value is in milliseconds) #self.timeout = 120000 #120 seconds / 2 minutes # This is how long the service will wait to run / refresh itself (see script below)
while 1: # Wait for service stop signal, if I timeout, loop again rc = win32event.WaitForSingleObject(self.hWaitStop, self.timeout) # Check to see if self.hWaitStop happened if rc == win32event.WAIT_OBJECT_0: # Stop signal encountered servicemanager.LogInfoMsg("SomeShortNameVersion - STOPPED!") #For Event Log break else: t=time.localtime() if t.tm_min==0 or t.tm_min==30: #Ok, here's the real money shot right here. #[actual service code between rests] try: file_path = "C:\PYTHON\filename.py" execfile(file_path) #Execute the script except: pass #[actual service code between rests] else: pass
def ctrlHandler(ctrlType): return True
if __name__ == '__main__': win32api.SetConsoleCtrlHandler(ctrlHandler, True) win32serviceutil.HandleCommandLine(aservice)
Search memory for the sequence of bytes specified byval1,val2, etc. The search begins at addressstart_addrand continues for eitherlenbytes or through toend_addrinclusive.