Non-Display Image Silently Causes CGI Program to Run
JavaScript can be used to create an image object (an area in computer memory that holds the details the browser will need to display an image). No HTML code is needed.
CGI programs can be launched with JavaScript by telling the browser to fill the image object with information, and giving the browser the URL of the CGI program as the source for the image information it is to use.
This is an exciting method used by savvy programmers to run CGI programs in the background.
The program can run when a page loads or when certain other events happen, such as which link was clicked. The program can run more than once, as often as needed, in fact.
Some implementation ideas:
-
The program can log details of certain activities, like which link was clicked, to continue using the previous example.
The length of time the user spent on the page can be logged. Right-clicks can be logged, along with information about where the cursor was when the mouse was right-clicked.
Numerous activities can be detected and logged.
-
The program can set and read cookies which JavaScript can do by itself but, unlike JavaScript, a CGI program can upate databases.
-
The programs can update databases with items of information like browser used, IP address, and prior visit history (if cookies are used).
Before the CGI script ends its run, it sends the content of an image file to the browser. This satisfies the browser's request.
Note: The introduction article, "Running a CGI Program On Page Load," contains numerous examples for automatically running a script when a page loads and has links to several different methods of implementing those features for your web site.
Page Events Automatically Run a CGI Program
To cause a page event to automatically run a CGI program, JavaScript is used to detect the event and then launch the program.
The following JavaScript detects a page load event (when a page completes loading) and sends the URL of itself to the CGI program.
<script type="text/javascript" language="JavaScript"> <!-- Copyright 2005 Bontrager Connection, LLC function LaunchCGIprogram() { var holder = new Image(); holder.src = "/cgi-bin/logger.cgi?" + document.location.href; } window.onload = LaunchCGIprogram; //--> </script>
The above JavaScript can be placed in the HEAD or the BODY area of the web page source code.
Before putting the page with the JavaScript on your server, verify the URL of the CGI program is correctly specified between the quotes on the line beginning with holder.src (the question mark must be at the end of the URL).
The browser expects an image to be returned. Therefore, the CGI program should, but doesn't actually need to, return an image to the browser. But it does need to return something, even if it's a web page.
The reason the CGI program doesn't need to return an image is because the image will never actually be displayed. The information is only stored in memory; the browser is never told to display it. The CGI program needs to return something, however, so the browser doesn't just sit there waiting for the server to respond until it times out.
The CGI Program
Following is a CGI program that logs what was sent to it with the JavaScript and includes the site visitor's IP address. The log file name is log.txt which may be changed. After updating the log file, an image is returned to the browser.
#!/usr/bin/perl use strict; open W,">log.txt" unless open W,">>log.txt"; print W "$ENV{QUERY_STRING}\t$ENV{REMOTE_ADDR}\n"; close W; # Put the image file to be sent to the browser # in the same directory where this script is # installed. Put the image file's name between # the quotes on the next line. my $image = "image.gif"; open R,"<$image"; binmode R; print "Content-type: image/*\n\n"; binmode STDOUT; while(<R>) { print $_; } close R; # end of script
Before installing the above CGI program, verify the image file name, changing the file name if needed.
The script assumes the image is in the same directory the script is installed in. If the image is at some other location on the server, provide the relative or absolute directory path to the script as part of the file name.
The CGI program used in this implementation does not return an HTML web page. It returns only the contents of an image file to the browser.
Email Notification When a Page Event Occurs
Email notification and many other features are available if the CGI program being used is Master
To use Master
Here is the previous JavaScript modified to do exactly that.
<script type="text/javascript" language="JavaScript"> <!-- Copyright 2005 Bontrager Connection, LLC function LaunchCGIprogram() { var parameters = "URL=" + document.location.href; parameters += "&emailtemplate=" + "notifyemail.txt"; parameters += "&flowto=" + "http://example.com/image.gif"; var holder = new Image(); holder.src = "/cgi-bin/MasterFormV4.cgi?" + parameters; } window.onload = LaunchCGIprogram; //--> </script>
The location of the image is specified as a complete http://... URL, between the quotes on the line containing "&emailtemplate=" if the email template file is not in the directory where the MasterFormV4.cgi script is located, the directory path must be provided with the file name, which may be a directory path relative to the CGI script.
The location of the email template file is between the quotes on the line containing "&flowto="
The URL to the MasterFormV4.cgi script is specified between the quotes on the line beginning with holder.src (the question mark at the end of the URL is required).
Will Bontrager