home *** CD-ROM | disk | FTP | other *** search
/ ftp.f-secure.com / 2014.06.ftp.f-secure.com.tar / ftp.f-secure.com / support / hotfix / fsis / IS-SpamControl.fsfix / iufssc / rules / 20_html_tests.cf < prev    next >
Text File  |  2006-11-29  |  18KB  |  350 lines

  1. # SpamAssassin rules file: HTML tests
  2. #
  3. # Please don't modify this file as your changes will be overwritten with
  4. # the next update. Use @@LOCAL_RULES_DIR@@/local.cf instead.
  5. # See 'perldoc Mail::SpamAssassin::Conf' for details.
  6. #
  7. # <@LICENSE>
  8. # Copyright 2004 Apache Software Foundation
  9. # Licensed under the Apache License, Version 2.0 (the "License");
  10. # you may not use this file except in compliance with the License.
  11. # You may obtain a copy of the License at
  12. #     http://www.apache.org/licenses/LICENSE-2.0
  13. # Unless required by applicable law or agreed to in writing, software
  14. # distributed under the License is distributed on an "AS IS" BASIS,
  15. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. # See the License for the specific language governing permissions and
  17. # limitations under the License.
  18. # </@LICENSE>
  19. #
  20. ###########################################################################
  21.  
  22. #require_version @@VERSION@@
  23.  
  24. # HTML parser tests
  25. #
  26. # please sort these by eval type then name
  27.  
  28. # HTML control test, HTML spam rules should all have better S/O than this
  29. body HTML_MESSAGE        eval:html_test('html')
  30. describe HTML_MESSAGE        HTML included in message
  31.  
  32. # the HTML percentage range
  33. # should really be converted into a numeric function test
  34. body HTML_00_10            eval:html_range('ratio','0.00','0.10')
  35. body HTML_10_20            eval:html_range('ratio','0.10','0.20')
  36. body HTML_20_30            eval:html_range('ratio','0.20','0.30')
  37. body HTML_30_40            eval:html_range('ratio','0.30','0.40')
  38. body HTML_40_50            eval:html_range('ratio','0.40','0.50')
  39. body HTML_50_60            eval:html_range('ratio','0.50','0.60')
  40. body HTML_60_70            eval:html_range('ratio','0.60','0.70')
  41. body HTML_70_80            eval:html_range('ratio','0.70','0.80')
  42. body HTML_80_90            eval:html_range('ratio','0.80','0.90')
  43. body HTML_90_100        eval:html_range('ratio','0.90','1.00')
  44. describe HTML_00_10        Message is 0% to 10% HTML
  45. describe HTML_10_20        Message is 10% to 20% HTML
  46. describe HTML_20_30        Message is 20% to 30% HTML
  47. describe HTML_30_40        Message is 30% to 40% HTML
  48. describe HTML_40_50        Message is 40% to 50% HTML
  49. describe HTML_50_60        Message is 50% to 60% HTML
  50. describe HTML_60_70        Message is 60% to 70% HTML
  51. describe HTML_70_80        Message is 70% to 80% HTML
  52. describe HTML_80_90        Message is 80% to 90% HTML
  53. describe HTML_90_100        Message is 90% to 100% HTML
  54.  
  55. # HTML shouting range
  56. # should really be converted into a numeric function test
  57. body HTML_SHOUTING3        eval:html_range('max_shouting','2','3')
  58. body HTML_SHOUTING4        eval:html_range('max_shouting','3','4')
  59. body HTML_SHOUTING5        eval:html_range('max_shouting','4','5')
  60. body HTML_SHOUTING6        eval:html_range('max_shouting','5','6')
  61. body HTML_SHOUTING7        eval:html_range('max_shouting','6','7')
  62. describe HTML_SHOUTING3        HTML has very strong "shouting" markup
  63. describe HTML_SHOUTING4        HTML has very strong "shouting" markup
  64. describe HTML_SHOUTING5        HTML has very strong "shouting" markup
  65. describe HTML_SHOUTING6        HTML has very strong "shouting" markup
  66. describe HTML_SHOUTING7        HTML has very strong "shouting" markup
  67.  
  68. body HTML_TEXT_AFTER_HTML    eval:html_test('text_after_html')
  69. describe HTML_TEXT_AFTER_HTML    HTML contains text after HTML close tag
  70.  
  71. body HTML_TEXT_AFTER_BODY    eval:html_test('text_after_body')
  72. describe HTML_TEXT_AFTER_BODY    HTML contains text after BODY close tag
  73.  
  74. # HTML comment tests
  75. body HTML_COMMENT_SHORT        eval:html_text_match('comment', '<!(?!-).{0,6}>')
  76. describe HTML_COMMENT_SHORT    HTML comment is very short
  77.  
  78. body HTML_COMMENT_SAVED_URL    eval:html_text_match('comment', '<!-- saved from url=\(\d{4}\)')
  79. describe HTML_COMMENT_SAVED_URL    HTML message is a saved web page
  80.  
  81. body HTML_EMBEDS        eval:html_test('embeds')
  82. describe HTML_EMBEDS        HTML with embedded plugin object
  83.  
  84. body HTML_EVENT_UNSAFE        eval:html_test('html_event_unsafe')
  85. describe HTML_EVENT_UNSAFE    HTML contains unsafe auto-executing code
  86.  
  87. body HTML_EXTRA_CLOSE        eval:html_range('closed_extra_ratio', '0.09', 'inf')
  88. describe HTML_EXTRA_CLOSE    HTML contains far too many close tags
  89.  
  90. body HTML_FONT_SIZE_TINY    eval:html_eval('min_size', '< 1')
  91. describe HTML_FONT_SIZE_TINY    HTML font size is tiny
  92.  
  93. body HTML_FONT_SIZE_NONE    eval:html_eval('min_size', '< 0')
  94. describe HTML_FONT_SIZE_NONE    HTML font size is negative
  95.  
  96. body HTML_FONT_SIZE_LARGE    eval:html_range('max_size', '5', '6')
  97. describe HTML_FONT_SIZE_LARGE    HTML font size is large
  98.  
  99. body HTML_FONT_SIZE_HUGE    eval:html_range('max_size', '6', 'inf')
  100. describe HTML_FONT_SIZE_HUGE    HTML font size is huge
  101.  
  102. body HTML_FONT_BIG        eval:html_test('big_font')
  103. describe HTML_FONT_BIG        HTML tag for a big font size
  104.  
  105. body HTML_FONT_TINY        eval:html_test('tiny_font')
  106. describe HTML_FONT_TINY        HTML tag for a tiny font size
  107.  
  108. body HTML_FONT_INVISIBLE    eval:html_test('font_invisible')
  109. describe HTML_FONT_INVISIBLE    HTML font color is same as background
  110.  
  111. body HTML_FONT_LOW_CONTRAST    eval:html_test('font_low_contrast')
  112. describe HTML_FONT_LOW_CONTRAST    HTML font color similar to background
  113.  
  114. body HTML_FONT_FACE_BAD        eval:html_test('font_face_bad')
  115. describe HTML_FONT_FACE_BAD    HTML font face is not a word
  116.  
  117. body HTML_FONT_FACE_CAPS    eval:html_test('font_face_caps')
  118. describe HTML_FONT_FACE_CAPS    HTML font face has excess capital characters
  119.  
  120. body HTML_FORMACTION_MAILTO    eval:html_test('form_action_mailto')
  121. describe HTML_FORMACTION_MAILTO    HTML includes a form which sends mail
  122.  
  123. # HTML_IMAGE_ONLY - not much raw HTML with images (absolute)
  124. body HTML_IMAGE_ONLY_04        eval:html_image_only('0000','0400')
  125. body HTML_IMAGE_ONLY_08        eval:html_image_only('0400','0800')
  126. body HTML_IMAGE_ONLY_12        eval:html_image_only('0800','1200')
  127. body HTML_IMAGE_ONLY_16        eval:html_image_only('1200','1600')
  128. body HTML_IMAGE_ONLY_20        eval:html_image_only('1600','2000')
  129. body HTML_IMAGE_ONLY_24        eval:html_image_only('2000','2400')
  130. body HTML_IMAGE_ONLY_28        eval:html_image_only('2400','2800')
  131. body HTML_IMAGE_ONLY_32        eval:html_image_only('2800','3200')
  132. describe HTML_IMAGE_ONLY_04    HTML: images with 0-400 bytes of words
  133. describe HTML_IMAGE_ONLY_08    HTML: images with 400-800 bytes of words
  134. describe HTML_IMAGE_ONLY_12    HTML: images with 800-1200 bytes of words
  135. describe HTML_IMAGE_ONLY_16    HTML: images with 1200-1600 bytes of words
  136. describe HTML_IMAGE_ONLY_20    HTML: images with 1600-2000 bytes of words
  137. describe HTML_IMAGE_ONLY_24    HTML: images with 2000-2400 bytes of words
  138. describe HTML_IMAGE_ONLY_28    HTML: images with 2400-2800 bytes of words
  139. describe HTML_IMAGE_ONLY_32    HTML: images with 2800-3200 bytes of words
  140.  
  141. # HTML_IMAGE_RATIO - more image area than text (ratio)
  142. body HTML_IMAGE_RATIO_02    eval:html_image_ratio('0.000','0.002')
  143. body HTML_IMAGE_RATIO_04    eval:html_image_ratio('0.002','0.004')
  144. body HTML_IMAGE_RATIO_06    eval:html_image_ratio('0.004','0.006')
  145. body HTML_IMAGE_RATIO_08    eval:html_image_ratio('0.006','0.008')
  146. describe HTML_IMAGE_RATIO_02    HTML has a low ratio of text to image area
  147. describe HTML_IMAGE_RATIO_04    HTML has a low ratio of text to image area
  148. describe HTML_IMAGE_RATIO_06    HTML has a low ratio of text to image area
  149. describe HTML_IMAGE_RATIO_08    HTML has a low ratio of text to image area
  150.  
  151. body HTML_LINK_IMAGE_BUG    eval:html_test('anchor_image_bug')
  152. describe HTML_LINK_IMAGE_BUG    HTML link plus image plus web bug
  153.  
  154. body HTML_LINK_PUSH_HERE    eval:html_text_match('anchor', '(?i)(?:push|go|cl[1l]ck)\s*(?:here|this)')
  155. describe HTML_LINK_PUSH_HERE    HTML link text says "push here" or similar
  156.  
  157. body HTML_LINK_OPT_OUT        eval:html_text_match('anchor', '(?i)opt.?out')
  158. describe HTML_LINK_OPT_OUT    HTML link text says "opt out" or similar
  159.  
  160. # HTML obfuscation
  161. body HTML_OBFUSCATE_05_10    eval:html_range('obfuscation_ratio','.05','.1')
  162. body HTML_OBFUSCATE_10_20    eval:html_range('obfuscation_ratio','.1','.2')
  163. body HTML_OBFUSCATE_20_30    eval:html_range('obfuscation_ratio','.2','.3')
  164. body HTML_OBFUSCATE_30_40    eval:html_range('obfuscation_ratio','.3','.4')
  165. body HTML_OBFUSCATE_40_50    eval:html_range('obfuscation_ratio','.4','.5')
  166. body HTML_OBFUSCATE_50_60    eval:html_range('obfuscation_ratio','.5','.6')
  167. body HTML_OBFUSCATE_60_70    eval:html_range('obfuscation_ratio','.6','.7')
  168. body HTML_OBFUSCATE_70_80    eval:html_range('obfuscation_ratio','.7','.8')
  169. body HTML_OBFUSCATE_80_90    eval:html_range('obfuscation_ratio','.8','.9')
  170. body HTML_OBFUSCATE_90_100    eval:html_range('obfuscation_ratio','.9','1.0')
  171. describe HTML_OBFUSCATE_05_10    Message is 5% to 10% HTML obfuscation
  172. describe HTML_OBFUSCATE_10_20    Message is 10% to 20% HTML obfuscation
  173. describe HTML_OBFUSCATE_20_30    Message is 20% to 30% HTML obfuscation
  174. describe HTML_OBFUSCATE_30_40    Message is 30% to 40% HTML obfuscation
  175. describe HTML_OBFUSCATE_40_50    Message is 40% to 50% HTML obfuscation
  176. describe HTML_OBFUSCATE_50_60    Message is 50% to 60% HTML obfuscation
  177. describe HTML_OBFUSCATE_60_70    Message is 60% to 70% HTML obfuscation
  178. describe HTML_OBFUSCATE_70_80    Message is 70% to 80% HTML obfuscation
  179. describe HTML_OBFUSCATE_80_90    Message is 80% to 90% HTML obfuscation
  180. describe HTML_OBFUSCATE_90_100    Message is 90% to 100% HTML obfuscation
  181.  
  182. # backhair - idea from backhair set by Jennifer Wheeler and Adam Lopresto.
  183. body HTML_BACKHAIR_2        eval:html_range('backhair_count', '1', '4')
  184. body HTML_BACKHAIR_4        eval:html_range('backhair_count', '4', '8')
  185. body HTML_BACKHAIR_8        eval:html_range('backhair_count', '8', 'inf')
  186. describe HTML_BACKHAIR_2    HTML tags used to obfuscate words
  187. describe HTML_BACKHAIR_4    HTML tags used to obfuscate words
  188. describe HTML_BACKHAIR_8    HTML tags used to obfuscate words
  189.  
  190. # HTML attribute testing
  191. body HTML_ATTR_BAD        eval:html_range('attr_bad','0.75','1.0')
  192. describe HTML_ATTR_BAD        HTML has many bad attributes in tags
  193. body HTML_ATTR_UNIQUE        eval:html_range('attr_unique_bad','0.5','1.0')
  194. describe HTML_ATTR_UNIQUE    HTML appears to have random attributes in tags
  195.  
  196. body HTML_WEB_BUGS        eval:html_test('web_bugs')
  197. describe HTML_WEB_BUGS        Image tag intended to identify you
  198.  
  199. body HTML_TAG_BALANCE_BODY    eval:html_tag_balance('body', '!= 0')
  200. describe HTML_TAG_BALANCE_BODY    HTML has unbalanced "body" tags
  201.  
  202. body HTML_TAG_BALANCE_HEAD    eval:html_tag_balance('head', '!= 0')
  203. describe HTML_TAG_BALANCE_HEAD    HTML has unbalanced "head" tags
  204.  
  205. body HTML_TAG_EXIST_BGSOUND    eval:html_tag_exists('bgsound')
  206. describe HTML_TAG_EXIST_BGSOUND    HTML has "bgsound" tag
  207.  
  208. body HTML_TAG_EXIST_MARQUEE    eval:html_tag_exists('marquee')
  209. describe HTML_TAG_EXIST_MARQUEE    HTML has "marquee" tag
  210.  
  211. body HTML_TAG_EXIST_TBODY    eval:html_tag_exists('tbody')
  212. describe HTML_TAG_EXIST_TBODY    HTML has "tbody" tag
  213.  
  214. # percentage of tags that are not legal elements in HTML
  215. body HTML_BADTAG_00_10    eval:html_range('bad_tag_ratio','0.00','0.10')
  216. body HTML_BADTAG_10_20    eval:html_range('bad_tag_ratio','0.10','0.20')
  217. body HTML_BADTAG_20_30    eval:html_range('bad_tag_ratio','0.20','0.30')
  218. body HTML_BADTAG_30_40    eval:html_range('bad_tag_ratio','0.30','0.40')
  219. body HTML_BADTAG_40_50    eval:html_range('bad_tag_ratio','0.40','0.50')
  220. body HTML_BADTAG_50_60    eval:html_range('bad_tag_ratio','0.50','0.60')
  221. body HTML_BADTAG_60_70    eval:html_range('bad_tag_ratio','0.60','0.70')
  222. body HTML_BADTAG_70_80    eval:html_range('bad_tag_ratio','0.70','0.80')
  223. body HTML_BADTAG_80_90    eval:html_range('bad_tag_ratio','0.80','0.90')
  224. body HTML_BADTAG_90_100    eval:html_range('bad_tag_ratio','0.90','1.00')
  225. describe HTML_BADTAG_00_10    HTML message is 0% to 10% bad tags
  226. describe HTML_BADTAG_10_20    HTML message is 10% to 20% bad tags
  227. describe HTML_BADTAG_20_30    HTML message is 20% to 30% bad tags
  228. describe HTML_BADTAG_30_40    HTML message is 30% to 40% bad tags
  229. describe HTML_BADTAG_40_50    HTML message is 40% to 50% bad tags
  230. describe HTML_BADTAG_50_60    HTML message is 50% to 60% bad tags
  231. describe HTML_BADTAG_60_70    HTML message is 60% to 70% bad tags
  232. describe HTML_BADTAG_70_80    HTML message is 70% to 80% bad tags
  233. describe HTML_BADTAG_80_90    HTML message is 80% to 90% bad tags
  234. describe HTML_BADTAG_90_100    HTML message is 90% to 100% bad tags
  235.  
  236. # percentage of unique non-elements in HTML
  237. body HTML_NONELEMENT_00_10    eval:html_range('non_element_ratio','0.00','0.10')
  238. body HTML_NONELEMENT_10_20    eval:html_range('non_element_ratio','0.10','0.20')
  239. body HTML_NONELEMENT_20_30    eval:html_range('non_element_ratio','0.20','0.30')
  240. body HTML_NONELEMENT_30_40    eval:html_range('non_element_ratio','0.30','0.40')
  241. body HTML_NONELEMENT_40_50    eval:html_range('non_element_ratio','0.40','0.50')
  242. body HTML_NONELEMENT_50_60    eval:html_range('non_element_ratio','0.50','0.60')
  243. body HTML_NONELEMENT_60_70    eval:html_range('non_element_ratio','0.60','0.70')
  244. body HTML_NONELEMENT_70_80    eval:html_range('non_element_ratio','0.70','0.80')
  245. body HTML_NONELEMENT_80_90    eval:html_range('non_element_ratio','0.80','0.90')
  246. body HTML_NONELEMENT_90_100    eval:html_range('non_element_ratio','0.90','1.00')
  247. describe HTML_NONELEMENT_00_10    0% to 10% of HTML elements are non-standard
  248. describe HTML_NONELEMENT_10_20    10% to 20% of HTML elements are non-standard
  249. describe HTML_NONELEMENT_20_30    20% to 30% of HTML elements are non-standard
  250. describe HTML_NONELEMENT_30_40    30% to 40% of HTML elements are non-standard
  251. describe HTML_NONELEMENT_40_50    40% to 50% of HTML elements are non-standard
  252. describe HTML_NONELEMENT_50_60    50% to 60% of HTML elements are non-standard
  253. describe HTML_NONELEMENT_60_70    60% to 70% of HTML elements are non-standard
  254. describe HTML_NONELEMENT_70_80    70% to 80% of HTML elements are non-standard
  255. describe HTML_NONELEMENT_80_90    80% to 90% of HTML elements are non-standard
  256. describe HTML_NONELEMENT_90_100    90% to 100% of HTML elements are non-standard
  257.  
  258. # short HTML messages with certain attributes
  259. body __HTML_LINK_IMAGE        eval:html_text_match('anchor', '<img>')
  260. body __HTML_LENGTH_0000_1024    eval:html_range('length', '0', '1024')
  261. body __HTML_LENGTH_1024_1536    eval:html_range('length', '1024', '1536')
  262. body __HTML_LENGTH_1536_2048    eval:html_range('length', '1536', '2048')
  263. meta HTML_SHORT_LINK_IMG_1    __HTML_LENGTH_0000_1024 && __HTML_LINK_IMAGE
  264. meta HTML_SHORT_LINK_IMG_2    __HTML_LENGTH_1024_1536 && __HTML_LINK_IMAGE
  265. meta HTML_SHORT_LINK_IMG_3    __HTML_LENGTH_1536_2048 && __HTML_LINK_IMAGE
  266. describe HTML_SHORT_LINK_IMG_1    HTML is very short with a linked image
  267. describe HTML_SHORT_LINK_IMG_2    HTML is very short with a linked image
  268. describe HTML_SHORT_LINK_IMG_3    HTML is very short with a linked image
  269.  
  270. body HTML_SHORT_LENGTH        eval:html_eval('length', '< 170')
  271. describe HTML_SHORT_LENGTH    HTML is extremely short
  272.  
  273. body __HTML_LENGTH_512        eval:html_eval('length', '< 512')
  274. body __COMMENT_EXISTS        eval:html_text_match('comment', '<!.*?>')
  275. meta HTML_SHORT_COMMENT        (__HTML_LENGTH_512 && __COMMENT_EXISTS)
  276. describe HTML_SHORT_COMMENT    HTML is very short with HTML comments
  277.  
  278. body __HTML_LENGTH_384        eval:html_eval('length', '< 384')
  279. body __TAG_EXISTS_CENTER    eval:html_tag_exists('center')
  280. meta HTML_SHORT_CENTER        (__HTML_LENGTH_384 && __TAG_EXISTS_CENTER)
  281. describe HTML_SHORT_CENTER    HTML is very short with CENTER tag
  282.  
  283. body HTML_TITLE_EMPTY        eval:html_text_not_match('title', '(?s)\S')
  284. describe HTML_TITLE_EMPTY    HTML title contains no text
  285.  
  286. # __MIME_ATTACHMENT also used in 20_meta_tests.cf
  287. body __MIME_ATTACHMENT        eval:check_for_mime('mime_attachment')
  288.  
  289. body __HTML_TITLE_120        eval:html_text_match('title', '.{120}')
  290. meta HTML_TITLE_LONG        __HTML_TITLE_120 && !__MIME_ATTACHMENT
  291. describe HTML_TITLE_LONG    HTML title is very long
  292.  
  293. body __HTML_TITLE_SUBJ_DIFF    eval:html_title_subject_ratio('3.5')
  294. meta HTML_TITLE_SUBJ_DIFF    __HTML_TITLE_SUBJ_DIFF && !__MIME_ATTACHMENT
  295.  
  296. body HTML_TITLE_UNTITLED    eval:html_text_match('title', '(?i)(?:untitled|new page \d+)')
  297. describe HTML_TITLE_UNTITLED    HTML title contains "Untitled"
  298.  
  299. ###########################################################################
  300. # meta tests
  301.  
  302. body __HTML_CHARSET_FARAWAY    eval:html_charset_faraway()
  303. meta HTML_CHARSET_FARAWAY    (__HTML_CHARSET_FARAWAY && __HIGHBITS)
  304. describe HTML_CHARSET_FARAWAY    A foreign language charset used in HTML markup
  305. tflags HTML_CHARSET_FARAWAY    userconf
  306.  
  307. meta HTML_MIME_NO_HTML_TAG    MIME_HTML_ONLY && !__TAG_EXISTS_HTML
  308. describe HTML_MIME_NO_HTML_TAG    HTML-only message, but there is no HTML tag
  309.  
  310. meta HTML_MISSING_CTYPE        (!__MIME_HTML && HTML_MESSAGE)
  311. describe HTML_MISSING_CTYPE    Message is HTML without HTML Content-Type
  312.  
  313. ###########################################################################
  314. # rawbody HTML tests
  315.  
  316. rawbody HIDE_WIN_STATUS        /<[^>]+onMouseOver=[^>]+window\.status=/i
  317. describe HIDE_WIN_STATUS    Javascript to hide URLs in browser
  318.  
  319. rawbody __OBFUSCATING_COMMENT_A    /\w(?:<![^>]*>)+\w/
  320. rawbody __OBFUSCATING_COMMENT_B    /[^\s>](?:<![^>]*>)+[^\s<]/
  321. meta OBFUSCATING_COMMENT    ((__OBFUSCATING_COMMENT_A && HTML_MESSAGE) || (__OBFUSCATING_COMMENT_B && MIME_HTML_ONLY))
  322. describe OBFUSCATING_COMMENT    HTML comments which obfuscate text
  323.  
  324. # spams that are assembled from a Javascript array
  325. # look for the XOR op
  326. rawbody __JS_FROMCHARCODE       /String\.fromCharCode\s*\(\s*\S+\s*\[\s*\S+\s*\]\s*\^/
  327. rawbody __JS_DOCWRITE           /document\.write/
  328. meta JS_FROMCHARCODE            (__JS_FROMCHARCODE && __JS_DOCWRITE)
  329. describe JS_FROMCHARCODE        Document is built from a Javascript charcode array
  330.  
  331. # A-Z, a-z, 0-9
  332. rawbody ENTITY_DEC_ALPHANUM    /\&\#0*(?:4[89]|5[0-7]|6[5-9][78]\d|9[0789]|1[01]\d|12[012])\;/
  333. describe ENTITY_DEC_ALPHANUM    HTML contains needlessly encoded characters
  334.  
  335. # ! $ % ' ( ) , - . / : ; = ? @ _
  336. # a good possible rule that may resurface
  337. #rawbody ENTITY_DEC_OTHER    /\&\#0*(?:3[3679]|4[014567]|5[89]|6[134]|95)\;/
  338. #describe ENTITY_DEC_OTHER    HTML contains needlessly encoded punctuation
  339.  
  340. # thanks to Bob Menschel for this one; bug 4116
  341. rawbody   HTML_EHTML2         m'</html></html>'i
  342. describe  HTML_EHTML2         HTML has doubled end HTML tag
  343.  
  344. # bug 3070
  345. rawbody HTML_TINY_FONT    /\<.*font\-size\:[ \"]*[01][^0-9]+.*\>/i
  346. describe HTML_TINY_FONT    body contains 1 or 0-point font
  347.