Subversion Repositories php_antispam

Rev

Rev 6 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5 daniel-mar 1
<?php
2
 
3
/*
4
 * ViaThinkSoft Anti-Spam Script for PHP
6 daniel-mar 5
 * (C) 2009-2022 ViaThinkSoft
7 daniel-mar 6
 * Revision: 2022-11-05 (Version 4.1.1)
6 daniel-mar 7
 * License: Apache 2.0 License
5 daniel-mar 8
 */
9
 
6 daniel-mar 10
class VtsAntiSpam4 {
5 daniel-mar 11
 
6 daniel-mar 12
        public $garbageLength = 5;
13
 
14
        public function __construct() {
15
                self::randomize();
16
        }
17
 
18
        private static function randomize() {
19
                // Anfagswert über aktuelle Mikrosekunde setzen
5 daniel-mar 20
                // http://de2.php.net/manual/de/function.srand.php
6 daniel-mar 21
                list($usec, $sec) = explode(' ', microtime());
7 daniel-mar 22
                $seed = (int)((int)$sec + ((float)$usec * 100000));
6 daniel-mar 23
                srand($seed);
24
        }
5 daniel-mar 25
 
6 daniel-mar 26
        private function RandomString($len) {
5 daniel-mar 27
                // http://www.jonasjohn.de/snippets/php/rand-str.htm
6 daniel-mar 28
                $randstr = '';
29
                //srand((double)microtime()*1000000);
30
                for($i=0;$i<$len;$i++) {
31
                        $n = rand(48,120);
32
                        while (($n >= 58 && $n <= 64) || ($n >= 91 && $n <= 96)) {
5 daniel-mar 33
                                $n = rand(48,120);
34
                        }
6 daniel-mar 35
                        $randstr .= chr($n);
5 daniel-mar 36
                }
6 daniel-mar 37
                return $randstr;
38
        }
5 daniel-mar 39
 
6 daniel-mar 40
        private function js_randombreaks() {
41
                $len = rand(0, $this->garbageLength);
42
                $r = '';
43
                $one_line_comment = false;
44
                for($i=0;$i<$len;$i++) {
45
                        $m = rand(0, 3);
46
                        if ($m == 0) {
47
                                $r .= ' ';
48
                        } else if ($m == 1) {
49
                                $r .= '//';
50
                                $r .= $this->RandomString($i);
51
                                $one_line_comment = true;
52
                        } else if ($m == 2) {
53
                                $r .= "\r\n";
54
                                $one_line_comment = false;
55
                        } else {
56
                                $r .= "\t";
5 daniel-mar 57
                        }
58
                }
6 daniel-mar 59
                if ($one_line_comment) $r .= "\r\n";
60
                return $r;
61
        }
5 daniel-mar 62
 
6 daniel-mar 63
        private function alas_js_crypt($text) {
64
                $tmp = '';
65
                for ($i=0; $i<strlen($text); $i++) {
66
                        $tmp .= $this->js_randombreaks();
67
                        $tmp .= 'document.write("&#'.ord(substr($text, $i, 1)).';");';
68
                        $tmp .= $this->js_randombreaks();
5 daniel-mar 69
                }
6 daniel-mar 70
                $tmp = $this->js_randombreaks().$tmp.$this->js_randombreaks();
71
                return $tmp;
72
        }
5 daniel-mar 73
 
6 daniel-mar 74
        private function alas_noscript_crypt($text){
75
                $tmp = '';
76
                for ($i=0; $i<strlen($text); $i++) {
77
                        $tmp .= '<span style="display:inline;">&#'.ord(substr($text, $i, 1)).';</span>';
78
                        $tmp .= '<!--'.$this->js_randombreaks().'-->';
79
                        $tmp .= '<span style="display:none;">'.$this->RandomString(rand(0, $this->garbageLength)).'</span>';
5 daniel-mar 80
                }
6 daniel-mar 81
                return $tmp;
82
        }
5 daniel-mar 83
 
6 daniel-mar 84
        private function alas_js_write($text) {
85
                $text = str_replace('\\', '\\\\', $text);
86
                $text = str_replace('"', '\"', $text);
87
                $text = str_replace('/', '\/', $text); // W3C Validation </a> -> <\/a>
5 daniel-mar 88
 
6 daniel-mar 89
                $ret  = '';
90
                $ret .= $this->js_randombreaks();
91
                $ret .= 'document.write("'.$text.'");';
92
                $ret .= $this->js_randombreaks();
5 daniel-mar 93
 
6 daniel-mar 94
                return $ret;
95
        }
96
 
97
        public function secure_email($email, $linktext, $crypt_linktext)
98
        {
99
                // No new lines to avoid a JavaScript error!
100
                $linktext = str_replace("\r", ' ', $linktext);
101
                $linktext = str_replace("\n", ' ', $linktext);
102
 
103
                $aus = '';
104
                if ($email != '') {
105
                        $zid  = 'ALAS-4.0-'.DecHex(crc32($email)).'-'.DecHex(crc32($linktext)).'-'.($crypt_linktext ? 'S' : 'L');
106
                        $title = 'ViaThinkSoft "ALAS" Anti-Spam';
107
 
108
                        $aus .= "<!-- BEGIN $title [ID $zid] -->\r\n";
109
                        $aus .= '<script language="JavaScript" type="text/javascript"><!--'."\n";
110
                        $aus .= $this->alas_js_write('<a href="');
111
                        $aus .= $this->alas_js_crypt('mailto:'.$email);
112
                        $aus .= $this->alas_js_write('">');
113
                        $aus .= $crypt_linktext ? $this->alas_js_crypt($linktext) : $this->alas_js_write($linktext);
114
                        $aus .= $this->alas_js_write('</a>').'// --></script>';
115
 
116
                        $aus .= '<noscript>';
117
                        if ($linktext != $email) $aus .= ($crypt_linktext ? $this->alas_noscript_crypt($linktext) : $linktext).' ';
118
                        $aus .= $this->alas_noscript_crypt("[ $email ]");
119
                        $aus .= '</noscript>';
120
                        $aus .= "\r\n<!-- END $title [ID $zid] -->\r\n";
5 daniel-mar 121
                }
122
 
6 daniel-mar 123
                return $aus;
5 daniel-mar 124
        }
125
 
6 daniel-mar 126
        public function secure_email_autodetect($email, $linktext) {
127
                // Automatisch erkennen, ob der $linktext für Spambots interessant ist oder nicht
128
                $pos = strpos($linktext, '@');
5 daniel-mar 129
 
6 daniel-mar 130
                return $this->secure_email($email, $linktext, $pos !== false);
131
        }
5 daniel-mar 132
 
6 daniel-mar 133
        public function secure_email_identical_text($email) {
134
                return $this->secure_email_autodetect($email, $email);
5 daniel-mar 135
        }
136
 
137
}
138
 
6 daniel-mar 139
# ------------------------------------------------------------------------------
5 daniel-mar 140
 
6 daniel-mar 141
function secure_email($email, $linktext, $crypt_linktext, $css_class='') {
142
        if (!empty($css_class)) {
143
                // TODO
144
                throw new Exception("CSSClass is not yet implemented in AntiSpam v4");
145
        }
146
 
147
        $antispam = new VtsAntiSpam4();
148
        $res = $antispam->secure_email($email, $linktext, $crypt_linktext);
149
        return $res;
5 daniel-mar 150
}
151
 
6 daniel-mar 152
function secure_email_autodetect($email, $linktext) {
153
        $antispam = new VtsAntiSpam4();
154
        $res = $antispam->secure_email_autodetect($email, $linktext);
155
        return $res;
156
}
157
 
5 daniel-mar 158
function secure_email_identical_text($email) {
6 daniel-mar 159
        $antispam = new VtsAntiSpam4();
160
        $res = $antispam->secure_email_identical_text($email);
161
        return $res;
162
}