In an effort to make it more difficult for spammers to scrape email addresses from HTML pages, this technique of encoding the characters of an email address into their HEX code equivalent was created. These HEX codes are then imbedded into a javascript segment into the HTML page and are displayed as their ASCII characters when a browser executes the generated javascript segment.
The following shows the encoding of the example ANCHOR tag, email addresses, and descriptive text into HEX codes and javascript:
<A Href="info@mtxia.com">Mt Xia Information</A>
The above ANCHOR tag becomes:
<SCRIPT Language='javascript' Type='text/javascript'>document.writeln(unescape(''+
'%3C%61%20%68%72%65%66%3D%22%6D%61%69%6C%74%6F%3A'+
'%69%6E%66%6F%40%6D%74%78%69%61%2E%63%6F%6D%22%3E'+
'%4D%74%20%58%69%61%20%49%6E%66%6F%72%6D%61%74%69'+
'%6F%6E%3C%2F%41%3E'))
</SCRIPT>
#!/usr/bin/ksh93
################################################################
#### Copyright 2007 By Dana French, All Rights Reserved
#################################################################
function usagemsg_email2hex {
print -- "
Program: email2hex
Generate a javascript and HEX code representation of an
HTML Anchor HREF tag containing a \"mailto:\" email
address. The generated javascript can then be imbedded
within an HTML document and the email addresses can only
be viewed when processed by a browser. This makes it much
more difficult to scrape email addresses from the source
code of an HTML document.
Usage: ${1##*/} [-?vV] -e 'emailAddress' -t 'Link Text String'
[-p 'Prepended Text'] [-s 'Suffix Text']
Where:
-e emailAddress = Email address to encode as HEX
-t linkText = HTML Link text string to encode as HEX
-p PrependText = Text string to prepend before the Anchor HREF Tag
-s SuffixText = Text string to attach to the end of the Anchor HREF Tag
-v = Verbose mode - displays email2hex function info
-V = Very Verbose Mode - debug output displayed
Author: Dana French (dfrench@mtxia.com)
Copyright 2007 By Dana French, All Rights Reserved
\"AutoContent\" enabled
"
}
################################################################
####
#### Description:
####
#### Generate a javascript and HEX code representation of an
#### HTML Anchor HREF tag containing a \"mailto:\" email
#### address. The generated javascript can then be imbedded
#### within an HTML document and the email addresses cannot
#### be viewed or easily scraped from the pages.
####
#### Assumptions:
####
#### This script will probably not work with IBM's version of
#### ksh93 since IBM's ksh93 is about 7 years out of date. You
#### will need to download a recent version of ksh93 from
#### www.kornshell.com to run this script with IBM AIX.
####
#### Dependencies:
####
#### None
####
#### Products:
####
#### This script generates a snippit of HTML code as a SCRIPT
#### tag. The SCRIPT tag contains HEX code representations of
#### the email address and descriptions provided on the
#### command line of this shell script.
####
#### Configured Usage:
####
#### This script can be run as a function or from the command
#### line. A typical command line would appear as:
####
#### email2hex -e "info@mtxia.com" -t "Mt Xia Information" -p "For Info: "
####
#### Details:
####
################################################################
function mkascii
{
typeset VAL='${CNT}'
[[ "_${2}" != "_" && "_${2}" = "_8" ]] && VAL='$( printf "%o" 0x${i}${j} )'
[[ "_${2}" != "_" && "_${2}" = "_16" ]] && VAL='${i}${j}'
nameref ASCII_TABLE=$1
typeset CNT=0
for i in 0 1 2 3 4 5 6 7 8 9 A B C D E F
do
for j in 0 1 2 3 4 5 6 7 8 9 A B C D E F
do
eval ASCII_TABLE[\\$(print -- $( printf "\\\0%o" 0x${i}${j} ) )]=\"${VAL}\" 2>/dev/null
(( CNT = CNT + 1 ))
done
done
}
################################################################
function email2hex {
typeset VERSION="1.0"
typeset TRUE="1"
typeset FALSE="0"
typeset EXITCODE="0"
typeset VERBOSE="${FALSE}"
typeset VERYVERB="${FALSE}"
typeset EMAIL=""
typeset LINKTEXT=""
typeset PREPTEXT=""
typeset SUFFTEXT=""
typeset MSG="<a href=\"mailto:${EMAIL}\">${LINKTEXT}</A>"
typeset SCRIPT_TAGBEG="<SCRIPT Language='javascript' Type='text/javascript'>document.writeln(unescape(''+\n'"
typeset SCRIPT_TAGEND="</SCRIPT>"
typeset DENOM="16"
typeset -A HEX
typeset IDX
####
#### Process the command line options and arguments, saving
#### the values as appropriate.
####
while getopts ":vVe:t:p:s:" OPTION
do
case "${OPTION}" in
'e') EMAIL="${OPTARG}";;
't') LINKTEXT="${OPTARG}";;
'p') PREPTEXT="${OPTARG}";;
's') SUFFTEXT="${OPTARG}";;
'v') VERBOSE="${TRUE}";;
'V') VERYVERB="${TRUE}";;
[?:#]) usagemsg_email2hex "${0}" && return 1 ;;
esac
done
shift $(( ${OPTIND} - 1 ))
trap "usagemsg_email2hex ${0}" EXIT
if [[ "_${EMAIL}" == "_" ]]
then
print -u 2 "# ERROR: Email address not specified"
return 2
fi
if [[ "_${LINKTEXT}" == "_" ]]
then
print -u 2 "# ERROR: Link text not specified"
return 3
fi
trap "-" EXIT
####
#### Display some program info and the command line arguments specified
#### if "VERBOSE" mode was specified.
####
(( VERYVERB == TRUE )) && set -x
(( VERBOSE == TRUE )) && print -u 2 "# Version........: ${VERSION}"
(( VERBOSE == TRUE )) && print -u 2 "# Email Address..: ${EMAIL}"
(( VERBOSE == TRUE )) && print -u 2 "# Link Text......: ${LINKTEXT}"
(( VERBOSE == TRUE )) && print -u 2 "# Prepended Text.: ${PREPTEXT}"
(( VERBOSE == TRUE )) && print -u 2 "# Suffix Text....: ${SUFFTEXT}"
################################################################
MSG="${PREPTEXT}<a href=\"mailto:${EMAIL}\">${LINKTEXT}</A>${SUFFTEXT}"
mkascii HEX 16
(( VERBOSE == TRUE )) && print -u 2 "# HREF Anchor Tag: ${MSG}"
for (( i=0; i<${#MSG}; ++i ))
do
PARS[i]="${MSG:i:1}"
done
#### The substitution operator with pattern replacement does not
#### seem to work under the cygwin implementation of ksh93. The
#### above "for" loop was added to replace the following code.
# IFS=$'|'
# PARS=( ${MSG//(?)/|\1} )
# unset PARS[0]
# IFS=$' \t\n'
(( VERBOSE == TRUE )) && print -u 2 "# Parsed Array...: ${PARS[@]}"
print -n -- "${SCRIPT_TAGBEG}"
for IDX in "${!PARS[@]}"
do
(( VERBOSE == TRUE )) && print -u 2 "# Char: ${PARS[IDX]} HEX: ${HEX[${PARS[${IDX}]}]}"
print -n -r -- "%${HEX[${PARS[${IDX}]}]}"
(( ( IDX % DENOM ) == 0 )) && print -n -- "'+\n'"
done
print -- "'))\n${SCRIPT_TAGEND}"
return 0
}
################################################################
email2hex "${@}"