From f40a84879cbbc1acbec1b55a75becff1abebe021 Mon Sep 17 00:00:00 2001 From: OPSXCQ Date: Fri, 2 Dec 2016 17:19:11 -0200 Subject: [PATCH] first commit --- Dockerfile | 38 +- dvwa/.htaccess | 20 + dvwa/CHANGELOG.md | 157 + dvwa/COPYING.txt | 623 + dvwa/README.md | 167 + dvwa/about.php | 60 + dvwa/config/config.inc.php | 44 + dvwa/docs/DVWA_v1.3.pdf | Bin 0 -> 422011 bytes dvwa/docs/pdf.html | 1 + dvwa/dvwa/css/help.css | 25 + dvwa/dvwa/css/login.css | 59 + dvwa/dvwa/css/main.css | 266 + dvwa/dvwa/css/source.css | 20 + dvwa/dvwa/images/RandomStorm.png | Bin 0 -> 4515 bytes dvwa/dvwa/images/dollar.png | Bin 0 -> 299 bytes dvwa/dvwa/images/lock.png | Bin 0 -> 761 bytes dvwa/dvwa/images/login_logo.png | Bin 0 -> 9088 bytes dvwa/dvwa/images/logo.png | Bin 0 -> 5044 bytes dvwa/dvwa/images/spanner.png | Bin 0 -> 464 bytes dvwa/dvwa/images/warning.png | Bin 0 -> 423 bytes dvwa/dvwa/includes/DBMS/MySQL.php | 87 + dvwa/dvwa/includes/DBMS/PGSQL.php | 105 + dvwa/dvwa/includes/dvwaPage.inc.php | 562 + dvwa/dvwa/includes/dvwaPhpIds.inc.php | 101 + dvwa/dvwa/js/dvwaPage.js | 35 + dvwa/external/phpids/0.6/LICENSE | 165 + dvwa/external/phpids/0.6/build.xml | 18 + .../phpids/0.6/docs/examples/cakephp/README | 20 + .../phpids/0.6/docs/examples/cakephp/ids.php | 269 + .../0.6/docs/examples/cakephp/intrusion.php | 21 + .../phpids/0.6/docs/examples/example.php | 124 + .../phpdocumentor/PHPIDS/IDS_Caching.html | 123 + .../PHPIDS/IDS_Caching_Database.html | 244 + .../PHPIDS/IDS_Caching_File.html | 242 + .../PHPIDS/IDS_Caching_Interface.html | 146 + .../PHPIDS/IDS_Caching_Memcached.html | 243 + .../PHPIDS/IDS_Caching_Session.html | 241 + .../phpdocumentor/PHPIDS/IDS_Converter.html | 720 + .../docs/phpdocumentor/PHPIDS/IDS_Event.html | 513 + .../docs/phpdocumentor/PHPIDS/IDS_Filter.html | 452 + .../PHPIDS/IDS_Filter_Storage.html | 419 + .../PHPIDS/IDS_Filter_Storage_Abstract.html | 326 + .../docs/phpdocumentor/PHPIDS/IDS_Init.html | 413 + .../PHPIDS/IDS_Log_Composite.html | 243 + .../PHPIDS/IDS_Log_Database.html | 200 + .../phpdocumentor/PHPIDS/IDS_Log_Email.html | 307 + .../phpdocumentor/PHPIDS/IDS_Log_File.html | 234 + .../PHPIDS/IDS_Log_Interface.html | 116 + .../phpdocumentor/PHPIDS/IDS_Monitor.html | 538 + .../docs/phpdocumentor/PHPIDS/IDS_Report.html | 651 + .../PHPIDS/_Caching---Database.php.html | 105 + .../PHPIDS/_Caching---Factory.php.html | 69 + .../PHPIDS/_Caching---File.php.html | 105 + .../PHPIDS/_Caching---Interface.php.html | 69 + .../PHPIDS/_Caching---Memcached.php.html | 105 + .../PHPIDS/_Caching---Session.php.html | 105 + .../phpdocumentor/PHPIDS/_Converter.php.html | 69 + .../docs/phpdocumentor/PHPIDS/_Event.php.html | 69 + .../PHPIDS/_Filter---Filter.php.html | 62 + .../_Filter---Storage---Abstract.php.html | 62 + .../PHPIDS/_Filter---Storage.php.html | 69 + .../phpdocumentor/PHPIDS/_Filter.php.html | 69 + .../docs/phpdocumentor/PHPIDS/_Init.php.html | 69 + .../PHPIDS/_Log---Composite.php.html | 105 + .../PHPIDS/_Log---Database.php.html | 105 + .../PHPIDS/_Log---Email.php.html | 105 + .../phpdocumentor/PHPIDS/_Log---File.php.html | 105 + .../PHPIDS/_Log---Interface.php.html | 69 + .../phpdocumentor/PHPIDS/_Monitor.php.html | 69 + .../phpdocumentor/PHPIDS/_Report.php.html | 69 + .../phpids/0.6/docs/phpdocumentor/blank.html | 13 + .../docs/phpdocumentor/classtrees_PHPIDS.html | 92 + .../0.6/docs/phpdocumentor/elementindex.html | 10897 ++++++++++++++++ .../phpdocumentor/elementindex_PHPIDS.html | 1325 ++ .../phpids/0.6/docs/phpdocumentor/errors.html | 1433 ++ .../phpids/0.6/docs/phpdocumentor/index.html | 24 + .../0.6/docs/phpdocumentor/li_PHPIDS.html | 69 + .../0.6/docs/phpdocumentor/media/banner.css | 32 + .../docs/phpdocumentor/media/stylesheet.css | 144 + .../0.6/docs/phpdocumentor/packages.html | 28 + .../phpids/0.6/lib/IDS/Caching/Database.php | 286 + .../phpids/0.6/lib/IDS/Caching/Factory.php | 94 + .../phpids/0.6/lib/IDS/Caching/File.php | 183 + .../phpids/0.6/lib/IDS/Caching/Interface.php | 73 + .../phpids/0.6/lib/IDS/Caching/Memcached.php | 228 + .../phpids/0.6/lib/IDS/Caching/Session.php | 146 + .../phpids/0.6/lib/IDS/Config/Config.ini | 89 + .../external/phpids/0.6/lib/IDS/Converter.php | 721 + dvwa/external/phpids/0.6/lib/IDS/Event.php | 235 + dvwa/external/phpids/0.6/lib/IDS/Filter.php | 186 + .../phpids/0.6/lib/IDS/Filter/Storage.php | 381 + dvwa/external/phpids/0.6/lib/IDS/Init.php | 232 + .../phpids/0.6/lib/IDS/Log/Composite.php | 136 + .../phpids/0.6/lib/IDS/Log/Database.php | 285 + .../external/phpids/0.6/lib/IDS/Log/Email.php | 401 + dvwa/external/phpids/0.6/lib/IDS/Log/File.php | 229 + .../phpids/0.6/lib/IDS/Log/Interface.php | 65 + dvwa/external/phpids/0.6/lib/IDS/Monitor.php | 681 + dvwa/external/phpids/0.6/lib/IDS/Report.php | 341 + .../phpids/0.6/lib/IDS/default_filter.json | 1 + .../phpids/0.6/lib/IDS/default_filter.xml | 732 ++ .../phpids/0.6/lib/IDS/tmp/phpids_log.txt | 1 + .../htmlpurifier/HTMLPurifier.auto.php | 9 + .../htmlpurifier/HTMLPurifier.autoload.php | 19 + .../htmlpurifier/HTMLPurifier.func.php | 22 + .../htmlpurifier/HTMLPurifier.includes.php | 204 + .../htmlpurifier/HTMLPurifier.kses.php | 28 + .../htmlpurifier/HTMLPurifier.path.php | 9 + .../IDS/vendors/htmlpurifier/HTMLPurifier.php | 234 + .../HTMLPurifier.safe-includes.php | 198 + .../HTMLPurifier/AttrCollections.php | 127 + .../htmlpurifier/HTMLPurifier/AttrDef.php | 86 + .../htmlpurifier/HTMLPurifier/AttrDef/CSS.php | 86 + .../HTMLPurifier/AttrDef/CSS/AlphaValue.php | 19 + .../HTMLPurifier/AttrDef/CSS/Background.php | 86 + .../AttrDef/CSS/BackgroundPosition.php | 125 + .../HTMLPurifier/AttrDef/CSS/Border.php | 42 + .../HTMLPurifier/AttrDef/CSS/Color.php | 77 + .../HTMLPurifier/AttrDef/CSS/Composite.php | 37 + .../AttrDef/CSS/DenyElementDecorator.php | 26 + .../HTMLPurifier/AttrDef/CSS/Filter.php | 52 + .../HTMLPurifier/AttrDef/CSS/Font.php | 148 + .../HTMLPurifier/AttrDef/CSS/FontFamily.php | 89 + .../AttrDef/CSS/ImportantDecorator.php | 38 + .../HTMLPurifier/AttrDef/CSS/Length.php | 46 + .../HTMLPurifier/AttrDef/CSS/ListStyle.php | 77 + .../HTMLPurifier/AttrDef/CSS/Multiple.php | 57 + .../HTMLPurifier/AttrDef/CSS/Number.php | 68 + .../HTMLPurifier/AttrDef/CSS/Percentage.php | 39 + .../AttrDef/CSS/TextDecoration.php | 37 + .../HTMLPurifier/AttrDef/CSS/URI.php | 55 + .../HTMLPurifier/AttrDef/Enum.php | 64 + .../HTMLPurifier/AttrDef/HTML/Bool.php | 27 + .../HTMLPurifier/AttrDef/HTML/Color.php | 31 + .../HTMLPurifier/AttrDef/HTML/FrameTarget.php | 20 + .../HTMLPurifier/AttrDef/HTML/ID.php | 69 + .../HTMLPurifier/AttrDef/HTML/Length.php | 40 + .../HTMLPurifier/AttrDef/HTML/LinkTypes.php | 52 + .../HTMLPurifier/AttrDef/HTML/MultiLength.php | 40 + .../HTMLPurifier/AttrDef/HTML/Nmtokens.php | 47 + .../HTMLPurifier/AttrDef/HTML/Pixels.php | 47 + .../HTMLPurifier/AttrDef/Integer.php | 72 + .../HTMLPurifier/AttrDef/Lang.php | 72 + .../HTMLPurifier/AttrDef/Switch.php | 32 + .../HTMLPurifier/AttrDef/Text.php | 14 + .../htmlpurifier/HTMLPurifier/AttrDef/URI.php | 77 + .../HTMLPurifier/AttrDef/URI/Email.php | 15 + .../AttrDef/URI/Email/SimpleCheck.php | 20 + .../HTMLPurifier/AttrDef/URI/Host.php | 61 + .../HTMLPurifier/AttrDef/URI/IPv4.php | 38 + .../HTMLPurifier/AttrDef/URI/IPv6.php | 98 + .../HTMLPurifier/AttrTransform.php | 55 + .../HTMLPurifier/AttrTransform/Background.php | 22 + .../HTMLPurifier/AttrTransform/BdoDir.php | 18 + .../HTMLPurifier/AttrTransform/BgColor.php | 22 + .../HTMLPurifier/AttrTransform/BoolToCSS.php | 35 + .../HTMLPurifier/AttrTransform/Border.php | 17 + .../HTMLPurifier/AttrTransform/EnumToCSS.php | 57 + .../AttrTransform/ImgRequired.php | 41 + .../HTMLPurifier/AttrTransform/ImgSpace.php | 43 + .../HTMLPurifier/AttrTransform/Input.php | 39 + .../HTMLPurifier/AttrTransform/Lang.php | 27 + .../HTMLPurifier/AttrTransform/Length.php | 26 + .../HTMLPurifier/AttrTransform/Name.php | 18 + .../HTMLPurifier/AttrTransform/SafeEmbed.php | 13 + .../HTMLPurifier/AttrTransform/SafeObject.php | 14 + .../HTMLPurifier/AttrTransform/SafeParam.php | 48 + .../AttrTransform/ScriptRequired.php | 14 + .../HTMLPurifier/AttrTransform/Textarea.php | 16 + .../htmlpurifier/HTMLPurifier/AttrTypes.php | 74 + .../HTMLPurifier/AttrValidator.php | 161 + .../htmlpurifier/HTMLPurifier/Bootstrap.php | 96 + .../HTMLPurifier/CSSDefinition.php | 290 + .../htmlpurifier/HTMLPurifier/ChildDef.php | 48 + .../HTMLPurifier/ChildDef/Chameleon.php | 47 + .../HTMLPurifier/ChildDef/Custom.php | 89 + .../HTMLPurifier/ChildDef/Empty.php | 19 + .../HTMLPurifier/ChildDef/Optional.php | 23 + .../HTMLPurifier/ChildDef/Required.php | 106 + .../ChildDef/StrictBlockquote.php | 87 + .../HTMLPurifier/ChildDef/Table.php | 141 + .../htmlpurifier/HTMLPurifier/Config.php | 492 + .../htmlpurifier/HTMLPurifier/ConfigDef.php | 9 + .../HTMLPurifier/ConfigDef/Directive.php | 55 + .../HTMLPurifier/ConfigDef/DirectiveAlias.php | 24 + .../HTMLPurifier/ConfigDef/Namespace.php | 10 + .../HTMLPurifier/ConfigSchema.php | 221 + .../ConfigSchema/Builder/ConfigSchema.php | 50 + .../HTMLPurifier/ConfigSchema/Builder/Xml.php | 106 + .../HTMLPurifier/ConfigSchema/Exception.php | 9 + .../HTMLPurifier/ConfigSchema/Interchange.php | 55 + .../ConfigSchema/Interchange/Directive.php | 75 + .../ConfigSchema/Interchange/Id.php | 29 + .../ConfigSchema/Interchange/Namespace.php | 19 + .../ConfigSchema/InterchangeBuilder.php | 175 + .../HTMLPurifier/ConfigSchema/Validator.php | 223 + .../ConfigSchema/ValidatorAtom.php | 66 + .../HTMLPurifier/ConfigSchema/schema.ser | 1 + .../schema/Attr.AllowedFrameTargets.txt | 11 + .../ConfigSchema/schema/Attr.AllowedRel.txt | 8 + .../ConfigSchema/schema/Attr.AllowedRev.txt | 8 + .../schema/Attr.DefaultImageAlt.txt | 9 + .../schema/Attr.DefaultInvalidImage.txt | 8 + .../schema/Attr.DefaultInvalidImageAlt.txt | 7 + .../schema/Attr.DefaultTextDir.txt | 9 + .../ConfigSchema/schema/Attr.EnableID.txt | 15 + .../ConfigSchema/schema/Attr.IDBlacklist.txt | 4 + .../schema/Attr.IDBlacklistRegexp.txt | 8 + .../ConfigSchema/schema/Attr.IDPrefix.txt | 11 + .../schema/Attr.IDPrefixLocal.txt | 13 + .../HTMLPurifier/ConfigSchema/schema/Attr.txt | 2 + .../schema/AutoFormat.AutoParagraph.txt | 30 + .../ConfigSchema/schema/AutoFormat.Custom.txt | 12 + .../schema/AutoFormat.DisplayLinkURI.txt | 10 + .../schema/AutoFormat.Linkify.txt | 12 + .../schema/AutoFormat.PurifierLinkify.txt | 12 + .../schema/AutoFormat.RemoveEmpty.txt | 44 + .../ConfigSchema/schema/AutoFormat.txt | 2 + .../AutoFormatParam.PurifierLinkifyDocURL.txt | 12 + .../ConfigSchema/schema/AutoFormatParam.txt | 2 + .../schema/CSS.AllowImportant.txt | 7 + .../ConfigSchema/schema/CSS.AllowTricky.txt | 10 + .../schema/CSS.AllowedProperties.txt | 17 + .../ConfigSchema/schema/CSS.DefinitionRev.txt | 11 + .../ConfigSchema/schema/CSS.MaxImgLength.txt | 15 + .../ConfigSchema/schema/CSS.Proprietary.txt | 10 + .../HTMLPurifier/ConfigSchema/schema/CSS.txt | 2 + .../schema/Cache.DefinitionImpl.txt | 13 + .../schema/Cache.SerializerPath.txt | 13 + .../ConfigSchema/schema/Cache.txt | 2 + .../schema/Core.AggressivelyFixLt.txt | 17 + .../schema/Core.CollectErrors.txt | 11 + .../schema/Core.ColorKeywords.txt | 29 + .../schema/Core.ConvertDocumentToFragment.txt | 13 + .../Core.DirectLexLineNumberSyncInterval.txt | 17 + .../ConfigSchema/schema/Core.Encoding.txt | 14 + .../schema/Core.EscapeInvalidChildren.txt | 9 + .../schema/Core.EscapeInvalidTags.txt | 6 + .../schema/Core.EscapeNonASCIICharacters.txt | 12 + .../schema/Core.HiddenElements.txt | 19 + .../ConfigSchema/schema/Core.Language.txt | 11 + .../ConfigSchema/schema/Core.LexerImpl.txt | 33 + .../schema/Core.MaintainLineNumbers.txt | 16 + .../schema/Core.RemoveInvalidImg.txt | 12 + .../schema/Core.RemoveScriptContents.txt | 11 + .../HTMLPurifier/ConfigSchema/schema/Core.txt | 2 + .../ConfigSchema/schema/Filter.Custom.txt | 10 + .../schema/Filter.ExtractStyleBlocks.txt | 73 + .../ConfigSchema/schema/Filter.YouTube.txt | 10 + .../ConfigSchema/schema/Filter.txt | 2 + ...FilterParam.ExtractStyleBlocksEscaping.txt | 14 + .../FilterParam.ExtractStyleBlocksScope.txt | 28 + ...FilterParam.ExtractStyleBlocksTidyImpl.txt | 14 + .../ConfigSchema/schema/FilterParam.txt | 2 + .../ConfigSchema/schema/HTML.Allowed.txt | 22 + .../schema/HTML.AllowedAttributes.txt | 19 + .../schema/HTML.AllowedElements.txt | 18 + .../schema/HTML.AllowedModules.txt | 20 + .../ConfigSchema/schema/HTML.BlockWrapper.txt | 18 + .../ConfigSchema/schema/HTML.CoreModules.txt | 23 + .../schema/HTML.CustomDoctype.txt | 10 + .../ConfigSchema/schema/HTML.DefinitionID.txt | 33 + .../schema/HTML.DefinitionRev.txt | 16 + .../ConfigSchema/schema/HTML.Doctype.txt | 10 + .../schema/HTML.ForbiddenAttributes.txt | 20 + .../schema/HTML.ForbiddenElements.txt | 19 + .../ConfigSchema/schema/HTML.MaxImgLength.txt | 13 + .../ConfigSchema/schema/HTML.Parent.txt | 12 + .../ConfigSchema/schema/HTML.Proprietary.txt | 11 + .../ConfigSchema/schema/HTML.SafeEmbed.txt | 13 + .../ConfigSchema/schema/HTML.SafeObject.txt | 13 + .../ConfigSchema/schema/HTML.Strict.txt | 8 + .../ConfigSchema/schema/HTML.TidyAdd.txt | 8 + .../ConfigSchema/schema/HTML.TidyLevel.txt | 23 + .../ConfigSchema/schema/HTML.TidyRemove.txt | 8 + .../ConfigSchema/schema/HTML.Trusted.txt | 7 + .../ConfigSchema/schema/HTML.XHTML.txt | 10 + .../HTMLPurifier/ConfigSchema/schema/HTML.txt | 2 + .../schema/Output.CommentScriptContents.txt | 9 + .../ConfigSchema/schema/Output.Newline.txt | 13 + .../ConfigSchema/schema/Output.SortAttr.txt | 13 + .../ConfigSchema/schema/Output.TidyFormat.txt | 24 + .../ConfigSchema/schema/Output.txt | 2 + .../ConfigSchema/schema/Test.ForceNoIconv.txt | 6 + .../HTMLPurifier/ConfigSchema/schema/Test.txt | 2 + .../schema/URI.AllowedSchemes.txt | 14 + .../ConfigSchema/schema/URI.Base.txt | 17 + .../ConfigSchema/schema/URI.DefaultScheme.txt | 10 + .../ConfigSchema/schema/URI.DefinitionID.txt | 11 + .../ConfigSchema/schema/URI.DefinitionRev.txt | 11 + .../ConfigSchema/schema/URI.Disable.txt | 13 + .../schema/URI.DisableExternal.txt | 10 + .../schema/URI.DisableExternalResources.txt | 12 + .../schema/URI.DisableResources.txt | 12 + .../ConfigSchema/schema/URI.Host.txt | 19 + .../ConfigSchema/schema/URI.HostBlacklist.txt | 8 + .../ConfigSchema/schema/URI.MakeAbsolute.txt | 12 + .../ConfigSchema/schema/URI.Munge.txt | 82 + .../schema/URI.MungeResources.txt | 16 + .../schema/URI.MungeSecretKey.txt | 29 + .../schema/URI.OverrideAllowedSchemes.txt | 8 + .../HTMLPurifier/ConfigSchema/schema/URI.txt | 2 + .../HTMLPurifier/ConfigSchema/schema/info.ini | 1 + .../htmlpurifier/HTMLPurifier/ContentSets.php | 154 + .../htmlpurifier/HTMLPurifier/Context.php | 81 + .../htmlpurifier/HTMLPurifier/Definition.php | 38 + .../HTMLPurifier/DefinitionCache.php | 107 + .../DefinitionCache/Decorator.php | 61 + .../DefinitionCache/Decorator/Cleanup.php | 42 + .../DefinitionCache/Decorator/Memory.php | 45 + .../DefinitionCache/Decorator/Template.php.in | 46 + .../HTMLPurifier/DefinitionCache/Null.php | 38 + .../DefinitionCache/Serializer.php | 171 + .../DefinitionCache/Serializer/README | 1 + .../HTMLPurifier/DefinitionCacheFactory.php | 90 + .../htmlpurifier/HTMLPurifier/Doctype.php | 59 + .../HTMLPurifier/DoctypeRegistry.php | 102 + .../htmlpurifier/HTMLPurifier/ElementDef.php | 161 + .../htmlpurifier/HTMLPurifier/Encoder.php | 419 + .../HTMLPurifier/EntityLookup.php | 43 + .../HTMLPurifier/EntityLookup/entities.ser | 1 + .../HTMLPurifier/EntityParser.php | 143 + .../HTMLPurifier/ErrorCollector.php | 208 + .../htmlpurifier/HTMLPurifier/ErrorStruct.php | 58 + .../htmlpurifier/HTMLPurifier/Exception.php | 11 + .../htmlpurifier/HTMLPurifier/Filter.php | 45 + .../Filter/ExtractStyleBlocks.php | 134 + .../HTMLPurifier/Filter/YouTube.php | 31 + .../htmlpurifier/HTMLPurifier/Generator.php | 182 + .../HTMLPurifier/HTMLDefinition.php | 420 + .../htmlpurifier/HTMLPurifier/HTMLModule.php | 243 + .../HTMLPurifier/HTMLModule/Bdo.php | 30 + .../HTMLModule/CommonAttributes.php | 24 + .../HTMLPurifier/HTMLModule/Edit.php | 37 + .../HTMLPurifier/HTMLModule/Forms.php | 117 + .../HTMLPurifier/HTMLModule/Hypertext.php | 29 + .../HTMLPurifier/HTMLModule/Image.php | 39 + .../HTMLPurifier/HTMLModule/Legacy.php | 136 + .../HTMLPurifier/HTMLModule/List.php | 34 + .../HTMLPurifier/HTMLModule/Name.php | 16 + .../HTMLModule/NonXMLCommonAttributes.php | 13 + .../HTMLPurifier/HTMLModule/Object.php | 46 + .../HTMLPurifier/HTMLModule/Presentation.php | 30 + .../HTMLPurifier/HTMLModule/Proprietary.php | 32 + .../HTMLPurifier/HTMLModule/Ruby.php | 26 + .../HTMLPurifier/HTMLModule/SafeEmbed.php | 31 + .../HTMLPurifier/HTMLModule/SafeObject.php | 48 + .../HTMLPurifier/HTMLModule/Scripting.php | 53 + .../HTMLModule/StyleAttribute.php | 23 + .../HTMLPurifier/HTMLModule/Tables.php | 65 + .../HTMLPurifier/HTMLModule/Target.php | 22 + .../HTMLPurifier/HTMLModule/Text.php | 62 + .../HTMLPurifier/HTMLModule/Tidy.php | 207 + .../HTMLPurifier/HTMLModule/Tidy/Name.php | 23 + .../HTMLModule/Tidy/Proprietary.php | 22 + .../HTMLPurifier/HTMLModule/Tidy/Strict.php | 19 + .../HTMLModule/Tidy/Transitional.php | 8 + .../HTMLPurifier/HTMLModule/Tidy/XHTML.php | 16 + .../HTMLModule/Tidy/XHTMLAndHTML4.php | 160 + .../HTMLModule/XMLCommonAttributes.php | 13 + .../HTMLPurifier/HTMLModuleManager.php | 403 + .../HTMLPurifier/IDAccumulator.php | 52 + .../htmlpurifier/HTMLPurifier/Injector.php | 232 + .../HTMLPurifier/Injector/AutoParagraph.php | 339 + .../HTMLPurifier/Injector/DisplayLinkURI.php | 24 + .../HTMLPurifier/Injector/Linkify.php | 45 + .../HTMLPurifier/Injector/PurifierLinkify.php | 44 + .../HTMLPurifier/Injector/RemoveEmpty.php | 40 + .../HTMLPurifier/Injector/SafeObject.php | 86 + .../htmlpurifier/HTMLPurifier/Language.php | 162 + .../Language/classes/en-x-test.php | 11 + .../Language/messages/en-x-test.php | 10 + .../Language/messages/en-x-testmini.php | 11 + .../HTMLPurifier/Language/messages/en.php | 60 + .../HTMLPurifier/LanguageFactory.php | 197 + .../htmlpurifier/HTMLPurifier/Length.php | 113 + .../htmlpurifier/HTMLPurifier/Lexer.php | 297 + .../HTMLPurifier/Lexer/DOMLex.php | 212 + .../HTMLPurifier/Lexer/DirectLex.php | 489 + .../HTMLPurifier/Lexer/PEARSax3.php | 105 + .../htmlpurifier/HTMLPurifier/Lexer/PH5P.php | 3906 ++++++ .../HTMLPurifier/PercentEncoder.php | 97 + .../htmlpurifier/HTMLPurifier/Printer.php | 167 + .../HTMLPurifier/Printer/CSSDefinition.php | 37 + .../HTMLPurifier/Printer/ConfigForm.css | 8 + .../HTMLPurifier/Printer/ConfigForm.js | 3 + .../HTMLPurifier/Printer/ConfigForm.php | 367 + .../HTMLPurifier/Printer/HTMLDefinition.php | 271 + .../htmlpurifier/HTMLPurifier/Strategy.php | 25 + .../HTMLPurifier/Strategy/Composite.php | 24 + .../HTMLPurifier/Strategy/Core.php | 17 + .../HTMLPurifier/Strategy/FixNesting.php | 328 + .../HTMLPurifier/Strategy/MakeWellFormed.php | 431 + .../Strategy/RemoveForeignElements.php | 170 + .../Strategy/ValidateAttributes.php | 38 + .../htmlpurifier/HTMLPurifier/StringHash.php | 37 + .../HTMLPurifier/StringHashParser.php | 104 + .../HTMLPurifier/TagTransform.php | 35 + .../HTMLPurifier/TagTransform/Font.php | 92 + .../HTMLPurifier/TagTransform/Simple.php | 34 + .../htmlpurifier/HTMLPurifier/Token.php | 54 + .../HTMLPurifier/Token/Comment.php | 20 + .../htmlpurifier/HTMLPurifier/Token/Empty.php | 9 + .../htmlpurifier/HTMLPurifier/Token/End.php | 17 + .../htmlpurifier/HTMLPurifier/Token/Start.php | 9 + .../htmlpurifier/HTMLPurifier/Token/Tag.php | 54 + .../htmlpurifier/HTMLPurifier/Token/Text.php | 31 + .../HTMLPurifier/TokenFactory.php | 93 + .../vendors/htmlpurifier/HTMLPurifier/URI.php | 172 + .../HTMLPurifier/URIDefinition.php | 91 + .../htmlpurifier/HTMLPurifier/URIFilter.php | 43 + .../URIFilter/DisableExternal.php | 22 + .../URIFilter/DisableExternalResources.php | 11 + .../HTMLPurifier/URIFilter/HostBlacklist.php | 19 + .../HTMLPurifier/URIFilter/MakeAbsolute.php | 113 + .../HTMLPurifier/URIFilter/Munge.php | 52 + .../htmlpurifier/HTMLPurifier/URIParser.php | 69 + .../htmlpurifier/HTMLPurifier/URIScheme.php | 41 + .../HTMLPurifier/URIScheme/ftp.php | 42 + .../HTMLPurifier/URIScheme/http.php | 19 + .../HTMLPurifier/URIScheme/https.php | 11 + .../HTMLPurifier/URIScheme/mailto.php | 26 + .../HTMLPurifier/URIScheme/news.php | 21 + .../HTMLPurifier/URIScheme/nntp.php | 19 + .../HTMLPurifier/URISchemeRegistry.php | 69 + .../HTMLPurifier/UnitConverter.php | 252 + .../htmlpurifier/HTMLPurifier/VarParser.php | 152 + .../HTMLPurifier/VarParser/Flexible.php | 94 + .../HTMLPurifier/VarParser/Native.php | 25 + .../HTMLPurifier/VarParserException.php | 9 + .../phpids/0.6/tests/IDS/CachingTest.php | 104 + .../phpids/0.6/tests/IDS/EventTest.php | 85 + .../phpids/0.6/tests/IDS/ExceptionTest.php | 112 + .../phpids/0.6/tests/IDS/FilterTest.php | 97 + .../phpids/0.6/tests/IDS/InitTest.php | 90 + .../phpids/0.6/tests/IDS/MonitorTest.php | 1389 ++ .../phpids/0.6/tests/IDS/ReportTest.php | 123 + dvwa/external/phpids/0.6/tests/allTests.php | 73 + .../phpids/0.6/tests/coverage/Caching.html | 229 + .../tests/coverage/Caching_Factory.php.html | 382 + .../0.6/tests/coverage/Caching_File.php.html | 647 + .../tests/coverage/Caching_Interface.php.html | 228 + .../tests/coverage/Caching_Session.php.html | 486 + .../0.6/tests/coverage/Converter.php.html | 2511 ++++ .../phpids/0.6/tests/coverage/Event.php.html | 773 ++ .../phpids/0.6/tests/coverage/Filter.html | 102 + .../phpids/0.6/tests/coverage/Filter.php.html | 612 + .../tests/coverage/Filter_Storage.php.html | 1284 ++ .../phpids/0.6/tests/coverage/Init.php.html | 822 ++ .../0.6/tests/coverage/Monitor.php.html | 2126 +++ .../phpids/0.6/tests/coverage/Report.php.html | 1150 ++ .../phpids/0.6/tests/coverage/butter.png | Bin 0 -> 150 bytes .../phpids/0.6/tests/coverage/chameleon.png | Bin 0 -> 150 bytes .../phpids/0.6/tests/coverage/close12_1.gif | Bin 0 -> 85 bytes .../0.6/tests/coverage/container-min.js | 17 + .../phpids/0.6/tests/coverage/container.css | 318 + .../phpids/0.6/tests/coverage/glass.png | Bin 0 -> 167 bytes .../phpids/0.6/tests/coverage/index.html | 353 + .../phpids/0.6/tests/coverage/scarlet_red.png | Bin 0 -> 150 bytes .../phpids/0.6/tests/coverage/snow.png | Bin 0 -> 141 bytes .../phpids/0.6/tests/coverage/style.css | 428 + .../0.6/tests/coverage/yahoo-dom-event.js | 12 + dvwa/external/recaptcha/recaptchalib.php | 279 + dvwa/favicon.ico | Bin 0 -> 1406 bytes dvwa/hackable/flags/fi.php | 24 + dvwa/hackable/uploads/dvwa_email.png | Bin 0 -> 667 bytes dvwa/hackable/users/1337.jpg | Bin 0 -> 3681 bytes dvwa/hackable/users/admin.jpg | Bin 0 -> 3543 bytes dvwa/hackable/users/gordonb.jpg | Bin 0 -> 3063 bytes dvwa/hackable/users/pablo.jpg | Bin 0 -> 2961 bytes dvwa/hackable/users/smithy.jpg | Bin 0 -> 4382 bytes dvwa/ids_log.php | 32 + dvwa/index.php | 50 + dvwa/instructions.php | 61 + dvwa/login.php | 133 + dvwa/logout.php | 17 + dvwa/php.ini | 5 + dvwa/phpinfo.php | 10 + dvwa/robots.txt | 2 + dvwa/security.php | 125 + dvwa/setup.php | 79 + dvwa/vulnerabilities/brute/help/help.php | 69 + dvwa/vulnerabilities/brute/index.php | 68 + dvwa/vulnerabilities/brute/source/high.php | 42 + .../brute/source/impossible.php | 96 + dvwa/vulnerabilities/brute/source/low.php | 31 + dvwa/vulnerabilities/brute/source/medium.php | 34 + dvwa/vulnerabilities/captcha/help/help.php | 62 + dvwa/vulnerabilities/captcha/index.php | 98 + dvwa/vulnerabilities/captcha/source/high.php | 50 + .../captcha/source/impossible.php | 68 + dvwa/vulnerabilities/captcha/source/low.php | 75 + .../vulnerabilities/captcha/source/medium.php | 83 + dvwa/vulnerabilities/csrf/help/help.php | 57 + dvwa/vulnerabilities/csrf/index.php | 76 + dvwa/vulnerabilities/csrf/source/high.php | 35 + .../csrf/source/impossible.php | 48 + dvwa/vulnerabilities/csrf/source/low.php | 29 + dvwa/vulnerabilities/csrf/source/medium.php | 36 + dvwa/vulnerabilities/exec/help/help.php | 62 + dvwa/vulnerabilities/exec/index.php | 67 + dvwa/vulnerabilities/exec/source/high.php | 37 + .../exec/source/impossible.php | 41 + dvwa/vulnerabilities/exec/source/low.php | 21 + dvwa/vulnerabilities/exec/source/medium.php | 30 + dvwa/vulnerabilities/fi/file1.php | 21 + dvwa/vulnerabilities/fi/file2.php | 19 + dvwa/vulnerabilities/fi/file3.php | 29 + dvwa/vulnerabilities/fi/file4.php | 14 + dvwa/vulnerabilities/fi/help/help.php | 63 + dvwa/vulnerabilities/fi/include.php | 30 + dvwa/vulnerabilities/fi/index.php | 44 + dvwa/vulnerabilities/fi/source/high.php | 13 + dvwa/vulnerabilities/fi/source/impossible.php | 13 + dvwa/vulnerabilities/fi/source/low.php | 6 + dvwa/vulnerabilities/fi/source/medium.php | 10 + dvwa/vulnerabilities/sqli/help/help.php | 60 + dvwa/vulnerabilities/sqli/index.php | 99 + dvwa/vulnerabilities/sqli/session-input.php | 32 + dvwa/vulnerabilities/sqli/source/high.php | 29 + .../sqli/source/impossible.php | 33 + dvwa/vulnerabilities/sqli/source/low.php | 29 + dvwa/vulnerabilities/sqli/source/medium.php | 30 + .../sqli_blind/cookie-input.php | 31 + dvwa/vulnerabilities/sqli_blind/help/help.php | 62 + dvwa/vulnerabilities/sqli_blind/index.php | 99 + .../sqli_blind/source/high.php | 33 + .../sqli_blind/source/impossible.php | 35 + .../vulnerabilities/sqli_blind/source/low.php | 28 + .../sqli_blind/source/medium.php | 26 + dvwa/vulnerabilities/upload/help/help.php | 54 + dvwa/vulnerabilities/upload/index.php | 76 + dvwa/vulnerabilities/upload/source/high.php | 35 + .../upload/source/impossible.php | 62 + dvwa/vulnerabilities/upload/source/low.php | 19 + dvwa/vulnerabilities/upload/source/medium.php | 33 + dvwa/vulnerabilities/view_help.php | 26 + dvwa/vulnerabilities/view_source.php | 69 + dvwa/vulnerabilities/view_source_all.php | 102 + dvwa/vulnerabilities/xss_r/help/help.php | 57 + dvwa/vulnerabilities/xss_r/index.php | 66 + dvwa/vulnerabilities/xss_r/source/high.php | 12 + .../xss_r/source/impossible.php | 18 + dvwa/vulnerabilities/xss_r/source/low.php | 9 + dvwa/vulnerabilities/xss_r/source/medium.php | 12 + dvwa/vulnerabilities/xss_s/help/help.php | 56 + dvwa/vulnerabilities/xss_s/index.php | 79 + dvwa/vulnerabilities/xss_s/source/high.php | 24 + .../xss_s/source/impossible.php | 31 + dvwa/vulnerabilities/xss_s/source/low.php | 22 + dvwa/vulnerabilities/xss_s/source/medium.php | 24 + 551 files changed, 72374 insertions(+), 24 deletions(-) create mode 100644 dvwa/.htaccess create mode 100644 dvwa/CHANGELOG.md create mode 100644 dvwa/COPYING.txt create mode 100644 dvwa/README.md create mode 100644 dvwa/about.php create mode 100644 dvwa/config/config.inc.php create mode 100644 dvwa/docs/DVWA_v1.3.pdf create mode 100644 dvwa/docs/pdf.html create mode 100644 dvwa/dvwa/css/help.css create mode 100644 dvwa/dvwa/css/login.css create mode 100644 dvwa/dvwa/css/main.css create mode 100644 dvwa/dvwa/css/source.css create mode 100644 dvwa/dvwa/images/RandomStorm.png create mode 100644 dvwa/dvwa/images/dollar.png create mode 100644 dvwa/dvwa/images/lock.png create mode 100644 dvwa/dvwa/images/login_logo.png create mode 100644 dvwa/dvwa/images/logo.png create mode 100644 dvwa/dvwa/images/spanner.png create mode 100644 dvwa/dvwa/images/warning.png create mode 100644 dvwa/dvwa/includes/DBMS/MySQL.php create mode 100644 dvwa/dvwa/includes/DBMS/PGSQL.php create mode 100644 dvwa/dvwa/includes/dvwaPage.inc.php create mode 100644 dvwa/dvwa/includes/dvwaPhpIds.inc.php create mode 100644 dvwa/dvwa/js/dvwaPage.js create mode 100644 dvwa/external/phpids/0.6/LICENSE create mode 100644 dvwa/external/phpids/0.6/build.xml create mode 100644 dvwa/external/phpids/0.6/docs/examples/cakephp/README create mode 100644 dvwa/external/phpids/0.6/docs/examples/cakephp/ids.php create mode 100644 dvwa/external/phpids/0.6/docs/examples/cakephp/intrusion.php create mode 100644 dvwa/external/phpids/0.6/docs/examples/example.php create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Database.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_File.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Interface.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Memcached.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Session.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Converter.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Event.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter_Storage.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter_Storage_Abstract.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Init.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Composite.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Database.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Email.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_File.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Interface.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Monitor.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Report.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Database.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Factory.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---File.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Interface.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Memcached.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Session.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Converter.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Event.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Filter.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Storage---Abstract.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Storage.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Init.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Composite.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Database.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Email.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---File.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Interface.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Monitor.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Report.php.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/blank.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/classtrees_PHPIDS.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/elementindex.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/elementindex_PHPIDS.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/errors.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/index.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/li_PHPIDS.html create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/media/banner.css create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/media/stylesheet.css create mode 100644 dvwa/external/phpids/0.6/docs/phpdocumentor/packages.html create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Caching/Database.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Caching/Factory.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Caching/File.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Caching/Interface.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Caching/Memcached.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Caching/Session.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Config/Config.ini create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Converter.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Event.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Filter.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Filter/Storage.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Init.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Log/Composite.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Log/Database.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Log/Email.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Log/File.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Log/Interface.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Monitor.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/Report.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/default_filter.json create mode 100644 dvwa/external/phpids/0.6/lib/IDS/default_filter.xml create mode 100644 dvwa/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.auto.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.autoload.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.func.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.includes.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.kses.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.path.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.safe-includes.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrCollections.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Background.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Border.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Color.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Composite.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Filter.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Font.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Length.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Multiple.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Number.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Percentage.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/URI.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Enum.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Bool.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Color.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/ID.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Length.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Nmtokens.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Pixels.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Integer.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Lang.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Switch.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Text.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Email.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Host.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/IPv4.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/IPv6.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Background.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BdoDir.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BgColor.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BoolToCSS.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Border.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/EnumToCSS.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ImgRequired.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ImgSpace.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Input.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Lang.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Length.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Name.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/SafeEmbed.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/SafeObject.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/SafeParam.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ScriptRequired.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Textarea.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTypes.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrValidator.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Bootstrap.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/CSSDefinition.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Chameleon.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Custom.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Empty.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Optional.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Required.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/StrictBlockquote.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Table.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Config.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/Directive.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/DirectiveAlias.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/Namespace.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Exception.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Namespace.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Validator.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema.ser create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.PurifierLinkifyDocURL.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksEscaping.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksScope.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksTidyImpl.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Test.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.txt create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/info.ini create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ContentSets.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Context.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Definition.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator/Memory.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Null.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/README create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCacheFactory.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Doctype.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DoctypeRegistry.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ElementDef.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Encoder.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityLookup.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityLookup/entities.ser create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityParser.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ErrorCollector.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ErrorStruct.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Exception.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter/YouTube.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Generator.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLDefinition.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Bdo.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/CommonAttributes.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Edit.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Forms.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Hypertext.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Image.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Legacy.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/List.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Name.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Object.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Presentation.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Proprietary.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Ruby.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/SafeEmbed.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/SafeObject.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Scripting.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/StyleAttribute.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tables.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Target.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Text.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Name.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Proprietary.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Strict.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/XHTML.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModuleManager.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/IDAccumulator.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/AutoParagraph.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/DisplayLinkURI.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/Linkify.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/PurifierLinkify.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/RemoveEmpty.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/SafeObject.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/classes/en-x-test.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en-x-test.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en-x-testmini.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/LanguageFactory.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Length.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/DOMLex.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/DirectLex.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/PEARSax3.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/PH5P.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/PercentEncoder.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/CSSDefinition.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.css create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.js create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/HTMLDefinition.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/Composite.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/Core.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/FixNesting.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/MakeWellFormed.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/RemoveForeignElements.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/ValidateAttributes.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/StringHash.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/StringHashParser.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform/Font.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform/Simple.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Comment.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Empty.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/End.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Start.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Tag.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Text.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TokenFactory.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URI.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIDefinition.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/DisableExternal.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/DisableExternalResources.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/HostBlacklist.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/MakeAbsolute.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/Munge.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIParser.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/ftp.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/http.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/https.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/mailto.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/news.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/nntp.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URISchemeRegistry.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/UnitConverter.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser/Flexible.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser/Native.php create mode 100644 dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParserException.php create mode 100644 dvwa/external/phpids/0.6/tests/IDS/CachingTest.php create mode 100644 dvwa/external/phpids/0.6/tests/IDS/EventTest.php create mode 100644 dvwa/external/phpids/0.6/tests/IDS/ExceptionTest.php create mode 100644 dvwa/external/phpids/0.6/tests/IDS/FilterTest.php create mode 100644 dvwa/external/phpids/0.6/tests/IDS/InitTest.php create mode 100644 dvwa/external/phpids/0.6/tests/IDS/MonitorTest.php create mode 100644 dvwa/external/phpids/0.6/tests/IDS/ReportTest.php create mode 100644 dvwa/external/phpids/0.6/tests/allTests.php create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Caching.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Caching_Factory.php.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Caching_File.php.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Caching_Interface.php.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Caching_Session.php.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Converter.php.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Event.php.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Filter.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Filter.php.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Filter_Storage.php.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Init.php.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Monitor.php.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/Report.php.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/butter.png create mode 100644 dvwa/external/phpids/0.6/tests/coverage/chameleon.png create mode 100644 dvwa/external/phpids/0.6/tests/coverage/close12_1.gif create mode 100644 dvwa/external/phpids/0.6/tests/coverage/container-min.js create mode 100644 dvwa/external/phpids/0.6/tests/coverage/container.css create mode 100644 dvwa/external/phpids/0.6/tests/coverage/glass.png create mode 100644 dvwa/external/phpids/0.6/tests/coverage/index.html create mode 100644 dvwa/external/phpids/0.6/tests/coverage/scarlet_red.png create mode 100644 dvwa/external/phpids/0.6/tests/coverage/snow.png create mode 100644 dvwa/external/phpids/0.6/tests/coverage/style.css create mode 100644 dvwa/external/phpids/0.6/tests/coverage/yahoo-dom-event.js create mode 100755 dvwa/external/recaptcha/recaptchalib.php create mode 100644 dvwa/favicon.ico create mode 100644 dvwa/hackable/flags/fi.php create mode 100644 dvwa/hackable/uploads/dvwa_email.png create mode 100644 dvwa/hackable/users/1337.jpg create mode 100644 dvwa/hackable/users/admin.jpg create mode 100644 dvwa/hackable/users/gordonb.jpg create mode 100644 dvwa/hackable/users/pablo.jpg create mode 100644 dvwa/hackable/users/smithy.jpg create mode 100644 dvwa/ids_log.php create mode 100644 dvwa/index.php create mode 100644 dvwa/instructions.php create mode 100644 dvwa/login.php create mode 100644 dvwa/logout.php create mode 100644 dvwa/php.ini create mode 100644 dvwa/phpinfo.php create mode 100644 dvwa/robots.txt create mode 100644 dvwa/security.php create mode 100644 dvwa/setup.php create mode 100644 dvwa/vulnerabilities/brute/help/help.php create mode 100644 dvwa/vulnerabilities/brute/index.php create mode 100644 dvwa/vulnerabilities/brute/source/high.php create mode 100644 dvwa/vulnerabilities/brute/source/impossible.php create mode 100644 dvwa/vulnerabilities/brute/source/low.php create mode 100644 dvwa/vulnerabilities/brute/source/medium.php create mode 100644 dvwa/vulnerabilities/captcha/help/help.php create mode 100644 dvwa/vulnerabilities/captcha/index.php create mode 100644 dvwa/vulnerabilities/captcha/source/high.php create mode 100644 dvwa/vulnerabilities/captcha/source/impossible.php create mode 100644 dvwa/vulnerabilities/captcha/source/low.php create mode 100644 dvwa/vulnerabilities/captcha/source/medium.php create mode 100644 dvwa/vulnerabilities/csrf/help/help.php create mode 100644 dvwa/vulnerabilities/csrf/index.php create mode 100644 dvwa/vulnerabilities/csrf/source/high.php create mode 100644 dvwa/vulnerabilities/csrf/source/impossible.php create mode 100644 dvwa/vulnerabilities/csrf/source/low.php create mode 100644 dvwa/vulnerabilities/csrf/source/medium.php create mode 100644 dvwa/vulnerabilities/exec/help/help.php create mode 100644 dvwa/vulnerabilities/exec/index.php create mode 100644 dvwa/vulnerabilities/exec/source/high.php create mode 100644 dvwa/vulnerabilities/exec/source/impossible.php create mode 100644 dvwa/vulnerabilities/exec/source/low.php create mode 100644 dvwa/vulnerabilities/exec/source/medium.php create mode 100644 dvwa/vulnerabilities/fi/file1.php create mode 100644 dvwa/vulnerabilities/fi/file2.php create mode 100644 dvwa/vulnerabilities/fi/file3.php create mode 100644 dvwa/vulnerabilities/fi/file4.php create mode 100644 dvwa/vulnerabilities/fi/help/help.php create mode 100644 dvwa/vulnerabilities/fi/include.php create mode 100644 dvwa/vulnerabilities/fi/index.php create mode 100644 dvwa/vulnerabilities/fi/source/high.php create mode 100644 dvwa/vulnerabilities/fi/source/impossible.php create mode 100644 dvwa/vulnerabilities/fi/source/low.php create mode 100644 dvwa/vulnerabilities/fi/source/medium.php create mode 100644 dvwa/vulnerabilities/sqli/help/help.php create mode 100644 dvwa/vulnerabilities/sqli/index.php create mode 100644 dvwa/vulnerabilities/sqli/session-input.php create mode 100644 dvwa/vulnerabilities/sqli/source/high.php create mode 100644 dvwa/vulnerabilities/sqli/source/impossible.php create mode 100644 dvwa/vulnerabilities/sqli/source/low.php create mode 100644 dvwa/vulnerabilities/sqli/source/medium.php create mode 100644 dvwa/vulnerabilities/sqli_blind/cookie-input.php create mode 100644 dvwa/vulnerabilities/sqli_blind/help/help.php create mode 100644 dvwa/vulnerabilities/sqli_blind/index.php create mode 100644 dvwa/vulnerabilities/sqli_blind/source/high.php create mode 100644 dvwa/vulnerabilities/sqli_blind/source/impossible.php create mode 100644 dvwa/vulnerabilities/sqli_blind/source/low.php create mode 100644 dvwa/vulnerabilities/sqli_blind/source/medium.php create mode 100644 dvwa/vulnerabilities/upload/help/help.php create mode 100644 dvwa/vulnerabilities/upload/index.php create mode 100644 dvwa/vulnerabilities/upload/source/high.php create mode 100644 dvwa/vulnerabilities/upload/source/impossible.php create mode 100644 dvwa/vulnerabilities/upload/source/low.php create mode 100644 dvwa/vulnerabilities/upload/source/medium.php create mode 100644 dvwa/vulnerabilities/view_help.php create mode 100644 dvwa/vulnerabilities/view_source.php create mode 100644 dvwa/vulnerabilities/view_source_all.php create mode 100644 dvwa/vulnerabilities/xss_r/help/help.php create mode 100644 dvwa/vulnerabilities/xss_r/index.php create mode 100644 dvwa/vulnerabilities/xss_r/source/high.php create mode 100644 dvwa/vulnerabilities/xss_r/source/impossible.php create mode 100644 dvwa/vulnerabilities/xss_r/source/low.php create mode 100644 dvwa/vulnerabilities/xss_r/source/medium.php create mode 100644 dvwa/vulnerabilities/xss_s/help/help.php create mode 100644 dvwa/vulnerabilities/xss_s/index.php create mode 100644 dvwa/vulnerabilities/xss_s/source/high.php create mode 100644 dvwa/vulnerabilities/xss_s/source/impossible.php create mode 100644 dvwa/vulnerabilities/xss_s/source/low.php create mode 100644 dvwa/vulnerabilities/xss_s/source/medium.php diff --git a/Dockerfile b/Dockerfile index 2859502..7fd9e0a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,30 +1,20 @@ -FROM tutum/lamp:latest +FROM debian:jessie -MAINTAINER Rafael ) +MAINTAINER opsxcq -# Install DVWA -RUN \ - rm -rf /app/* && \ - apt-get update && \ - apt-get install -y wget php5-gd unzip && \ - rm -rf /var/lib/apt/lists/* && \ - wget https://github.com/ethicalhack3r/DVWA/archive/v1.9.zip -O dvwa.zip && \ - unzip dvwa.zip && \ - cp -r DVWA-1.9/* /app/ && \ - rm -rf DVWA-1.9 dvwa.zip +RUN apt-get update && \ + apt-get upgrapde -y && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y \ + package1 \ + package2 && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* -# Fix some issues about default lamp installation -RUN \ - chmod -R 777 /app/hackable/uploads/ /app/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt && \ - sed -i 's/allow_url_include = Off/allow_url_include = On/g' /etc/php5/apache2/php.ini && \ - sed -i "s/$_DVWA[ 'recaptcha_private_key' ] = ''/$_DVWA[ 'recaptcha_private_key' ] = '6LdNNycTAAAAAGuxxzwzwVC6FPJmdNqNPqdfMoim'/g" /app/config/config.inc.php && \ - sed -i "s/$_DVWA[ 'recaptcha_public_key' ] = ''/$_DVWA[ 'recaptcha_public_key' ] = '6LdNNycTAAAAANH2R31pX_dcQ5V02Og2MyV1ylTX'/g" /app/config/config.inc.php +RUN useradd --system --uid 666 -M --shell /usr/sbin/nologin vulnerable -# Configure the db access -RUN \ - sed -i 's/root/admin/g' /app/config/config.inc.php && \ - echo "sed -i \"s/p@ssw0rd/\$PASS/g\" /app/config/config.inc.php" >> /create_mysql_admin_user.sh +USER vulnerable -EXPOSE 80 3306 -CMD ["/run.sh"] +EXPOSE 80 +VOLUME /data +WORKDIR /data diff --git a/dvwa/.htaccess b/dvwa/.htaccess new file mode 100644 index 0000000..adc25b6 --- /dev/null +++ b/dvwa/.htaccess @@ -0,0 +1,20 @@ +# Only set these if PHP 5 is loaded as an apache module + +php_flag magic_quotes_gpc Off +#php_flag allow_url_fopen on +#php_flag allow_url_include on + + +# Only set these if PHP 4 is loaded as an apache module + +php_flag magic_quotes_gpc Off +#php_flag allow_url_fopen on +#php_flag allow_url_include on + + +# Limit access to localhost +# +# order deny,allow +# deny from all +# allow from 127.0.0.1 +# diff --git a/dvwa/CHANGELOG.md b/dvwa/CHANGELOG.md new file mode 100644 index 0000000..a8f38d8 --- /dev/null +++ b/dvwa/CHANGELOG.md @@ -0,0 +1,157 @@ +DAMN VULNERABLE WEB APPLICATION +======================= + +v1.9 (2015-10-05) +====== + ++ Added a dedicated objective (or "flag") for file include. (@g0tmi1k) ++ Added a warning to any module that requires a certain configuration. (@g0tmi1k) ++ Added comments to all source code that would be visible via DVWA modules. (@g0tmi1k) ++ Added CSRF token to pre-auth forms (login/setup/security pages). (@g0tmi1k + @Shinkurt) ++ Added HttpOnly cookie flag on impossible levels. (@g0tmi1k) ++ Added more detail to the documentation. (@g0tmi1k) ++ Added PDO to all impossible levels requiring MySQL. (@g0tmi1k) ++ Added PHPIDS options into the config file. (@g0tmi1k) ++ Added system check to setup. (@g0tmi1k) ++ Added various information to all help pages for every module. (@g0tmi1k) ++ Changed brute force medium to be harder due to sleep. (@g0tmi1k) ++ Changed file include landing page + added 3x example pages. (@g0tmi1k) ++ Changed file include medium to be harder due to more filters. (@g0tmi1k) ++ Changed HTTP REFERER check for medium level CSRF. (@g0tmi1k) ++ Changed input box for medium level with SQLi + SQLi Blind. (@g0tmi1k) ++ Changed SQLi + SQLi Blind to be $_POST rather than $_GET. (@g0tmi1k) ++ Changed SQLi Blind to be a real example of the vulnerability. (@g0tmi1k) ++ Fixed brute force and file upload impossible levels, as they were vulnerable. (@g0tmi1k + @Shinkurt) ++ Fixed bug with file fnclude page not loading. (@g0tmi1k) ++ Fixed CAPTCHA bug to read URL parameters on impossible. (@g0tmi1k) ++ Fixed CAPTCHA bug where the form wouldn't be visible. (@g0tmi1k) ++ Fixed CAPTCHA bug where the URL parameters were not being used for low + medium. (@g0tmi1k) ++ Fixed CSRF medium level bug when not on localhost. (@g0tmi1k) ++ Fixed setup bug with custom URL path. (@g0tmi1k) ++ Removed PostgreSQL DB support. (@g0tmi1k) ++ Renamed 'Command Execution' to 'Command Injection'. (@g0tmi1k) ++ Renamed 'high' level to 'impossible' and created new vectors for 'high'. (@g0tmi1k) ++ Updated README and documentation. (@g0tmi1k) ++ Various code cleanups in the core PHP files+CSS. (@g0tmi1k) ++ Various setup improvements (e.g. redirection + limited menu links). (@g0tmi1k) + +v1.8 (2013-05-01) +====== + ++ Versioning change: Version numbers now follow Major.Minor (e.g. v1.8) removing the middle digit. ++ Moved default security level setting to the config file. ++ Fixed a bug which prevented setup when a database name other than 'dvwa' was used. ++ Added a logic challenge involving an insecure CAPTCHA (requires external internet access) + +v1.0.7 (2010-09-08) +====== + ++ Re-designed the login page + made some other slight cosmetic changes. 06/06/2010 (@ethicalhack3r) ++ Started PostgreSQL implementation. 15/03/2010 (@ethicalhack3r) ++ A few small cosmetic changes. 15/03/2010 (@ethicalhack3r) ++ Improved the help information and look. 15/03/2010 (@ethicalhack3r) ++ Fixed a few bugs thanks to @Digininja. 15/03/2010 (@ethicalhack3r) ++ Show logged in username. 05/02/2010 (Jason Jones) ++ Added new info on RandomStorm. 04/02/2010 (@ethicalhack3r) ++ Added 'SQL Injection (Blind)'. 04/02/2010 (@ethicalhack3r) ++ Added official documentation. 21/11/2009 (@ethicalhack3r) ++ Implemented view all source functionality. 16/10/2009 (tmacuk, craig, @ethicalhack3r) + +v1.0.6 (2009-10-05) +====== + ++ Fixed a bug where the logo would not show on first time use. 03/09/2009 (@ethicalhack3r) ++ Removed 'current password' input box for low+med CSRF security. 03/09/2009 (@ethicalhack3r) ++ Added an article which was written for OWASP Turkey. 03/10/2009 (@ethicalhack3r) ++ Added more toubleshooting information. 02/10/2009 (@ethicalhack3r) ++ Stored XSS high now sanitises output. 02/10/2009 (@ethicalhack3r) ++ Fixed a 'bug' in XSS stored low which made it not vulnerable. 02/10/2009 (@ethicalhack3r) ++ Rewritten command execution high to use a whitelist. 30/09/09 (@ethicalhack3r) ++ Fixed a command execution vulnerability in exec high. 17/09/09 (@ethicalhack3r) ++ Added some troubleshooting info for PHP 5.2.6 in readme.txt. 17/09/09 (@ethicalhack3r) ++ Added the upload directory to the upload help. 17/09/09 (@ethicalhack3r) + +v1.0.5 (2009-09-03) +====== + ++ Made IE friendly as much as possible. 30/08/2009 (@ethicalhack3r) ++ Removed the acunetix scan report. 30/08/2009 (@ethicalhack3r) ++ Added 'Clear Log' button to PHPIDS parser. 27/08/2009 (@ethicalhack3r) ++ Implemented PHPIDS log parser. 27/08/2009 (@ethicalhack3r) ++ Implemented Stored XSS vulnerability. 27/08/2009 (@ethicalhack3r) ++ Added htaccess rule for localhost access only. 22/08/2009 (@ethicalhack3r) ++ Added CSRF. 01/08/2009 (@ethicalhack3r) ++ Implemented sessions/login. 01/08/2009 (@ethicalhack3r) ++ Complete recode. (jamesr) ++ Complete redesign. (jamesr) ++ Delimited 'dvwa' in session- minimising the risk of clash with other projects running on localhost. 01/08/2009 (jamesr) ++ Integrated PHPIDS v0.6. 01/08/2009 (jamesr) ++ Streamlined login functionality. 01/08/2009 (jamesr) + +v1.0.4 (2009-06-29) +====== + ++ Added acunetix scan report. 24/06/2009 ++ All links use http://hiderefer.com to hide referrer header. 23/06/2009 ++ Updated/added 'more info' links. 23/06/2009 ++ Moved change log info to CHANGELOG.txt. 22/06/2009 ++ Fixed the exec.php UTF-8 output. 16/06/2009 ++ Moved Help/View source buttons to footer. 12/06/2009 ++ Fixed phpInfo bug. 12/06/2009 ++ Made dvwa IE friendly. 11/06/2009 ++ Fixed html bugs. 11/06/2009 ++ Added more info to about page. 03/06/2009 ++ Added pictures for the users. 03/06/2009 ++ Fixed typos on the welcome page. 03/06/2009 ++ Improved README.txt and fixed typos. 03/06/2009 ++ Made SQL injection possible in sqli_med.php. Thanks to Teodor Lupan. 03/06/2009 + +v1.0.3 (2009-05-25) +====== + ++ Changed XAMPP link in index.php. 25/05/2009 ++ Set default security to low. 25/05/2009 ++ Improved output in setup.php. 25/05/2009 + +v1.0.2 (2009-05-24) +====== + ++ Removed phpinfo on higher security levels. 24/05/2009 ++ Moved all vulnerable code to /source/. 24/05/2009 ++ Added viewsource. 24/05/2009 + +v1.0.1 (2009-05-24) +====== + ++ Implemented different security levels. 24/05/2009 ++ Changed XSS from POST to GET. 22/05/2009 ++ Some changes to CSS. 22/05/2009 ++ Version number now in variable in header.php. 21/05/2009 ++ Added about page. 21/05/2009 ++ Updated login script to use database. 21/05/2009 ++ Added admin user to database. 21/05/2009 ++ Combined RFI + LFI to make 'File Inclusion'. 21/05/2009 ++ More realism to Local File Inclusion. 21/05/2009 ++ Better error output on upload script. 21/05/2009 + +v1.0 (2009-05-20) +==== + ++ Made command execution more realistic. 20/05/2009 ++ Added help buttons. 20/05/2009 ++ Added .htaccess file to turn magic quotes off. 20/05/2009 ++ Improved database creation with setup.php. 19/05/2009 ++ Amended installation instructions in README file. 19/05/2009 ++ Added GNU GPL license. 19/05/2009 ++ Added a robots.txt file with disallow all. 26/01/2009 ++ Removed link to www.ethicalhacker.co.uk in footer. 26/01/2009 ++ Added better error output on magic quotes. 26/01/2009 + + +Links +===== + ++ Homepage: http://www.dvwa.co.uk ++ Project Home: https://github.com/RandomStorm/DVWA + +_Created by the DVWA team._ diff --git a/dvwa/COPYING.txt b/dvwa/COPYING.txt new file mode 100644 index 0000000..231e469 --- /dev/null +++ b/dvwa/COPYING.txt @@ -0,0 +1,623 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + \ No newline at end of file diff --git a/dvwa/README.md b/dvwa/README.md new file mode 100644 index 0000000..1736317 --- /dev/null +++ b/dvwa/README.md @@ -0,0 +1,167 @@ +![DVWA](https://www.randomstorm.com/images/tools/dvwa.png "DVWA") + +# DAMN VULNERABLE WEB APPLICATION + +Damn Vulnerable Web Application (DVWA) is a PHP/MySQL web application that is damn vulnerable. Its main goal is to be an aid for security professionals to test their skills and tools in a legal environment, help web developers better understand the processes of securing web applications and to aid both students & teachers to learn about web application security in a controlled class room environment. + +The aim of DVWA is to **practice some of the most common web vulnerability**, with **various difficultly levels**, with a simple straightforward interface. +Please note, there are **both documented and undocumented vulnerability** with this software. This is intentional. You are encouraged to try and discover as many issues as possible. + +- - - + +## WARNING! + +Damn Vulnerable Web Application is damn vulnerable! **Do not upload it to your hosting provider's public html folder or any Internet facing servers**, as they will be compromised. It is recommend using a virtual machine (such as [VirtualBox](https://www.virtualbox.org/) or [VMware](https://www.vmware.com/)), which is set to NAT networking mode. Inside a guest machine, you can downloading and install [XAMPP](https://www.apachefriends.org/en/xampp.html) for the web server and database. + +### Disclaimer + +We do not take responsibility for the way in which any one uses this application (DVWA). We have made the purposes of the application clear and it should not be used maliciously. We have given warnings and taken measures to prevent users from installing DVWA on to live web servers. If your web server is compromised via an installation of DVWA it is not our responsibility it is the responsibility of the person/s who uploaded and installed it. + +- - - + +## License + +This file is part of Damn Vulnerable Web Application (DVWA). + +Damn Vulnerable Web Application (DVWA) is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Damn Vulnerable Web Application (DVWA) is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Damn Vulnerable Web Application (DVWA). If not, see http://www.gnu.org/licenses/. + +- - - + +## Download + +DVWA is available either as a package that will run on your own web server or as a Live CD: + + + DVWA Development Source (Latest) [Download ZIP](https://github.com/RandomStorm/DVWA/archive/master.zip) // `git clone https://github.com/RandomStorm/DVWA` + + DVWA v1.9 Source (Stable) - \[1.3 MB\] [Download ZIP](https://github.com/RandomStorm/DVWA/archive/v1.9.zip) - Released 2015-10-05 + + DVWA v1.0.7 LiveCD - \[480 MB\] [Download ISO](http://www.dvwa.co.uk/DVWA-1.0.7.iso) - Released 2010-09-08 + +- - - + +## Installation + +### Windows + XAMPP + +Installation video: +https://www.youtube.com/watch?v=GzIj07jt8rM + +The easiest way to install DVWA is to download and install [XAMPP](https://www.apachefriends.org/en/xampp.html) if you do not already have a web server setup. + +XAMPP is a very easy to install Apache Distribution for Linux, Solaris, Windows and Mac OS X. The package includes the Apache web server, MySQL, PHP, Perl, a FTP server and phpMyAdmin. + +XAMPP can be downloaded from: +https://www.apachefriends.org/en/xampp.html + +Simply unzip dvwa.zip, place the unzipped files in your public html folder, then point your browser to: http://127.0.0.1/dvwa/setup.php + +### Linux Packages + +If you are using a Debian based Linux distribution, you will need to install the following packages _(or their equivalent)_: + +`apt-get -y install apache2 mysql-server php5 php5-mysql php-pear php5-gd` + + +### Database Setup + +To set up the database, simply click on the `Setup DVWA` button in the main menu, then click on the `Create / Reset Database` button. This will create / reset the database for you with some data in. + +If you receive an error while trying to create your database, make sure your database credentials are correct within `./config/config.inc.php`. + +The variables are set to the following by default: + +``` +$_DVWA[ 'db_user' ] = 'root'; +$_DVWA[ 'db_password' ] = 'p@ssw0rd'; +$_DVWA[ 'db_database' ] = 'dvwa'; +``` + +### Other Configuration + +Depening on your Operating System as well as version of PHP, you may wish to alter the default configuration. The location of the files will be different on a per-machine basis. +Note, You are unable to use PHP v7.0 or later with DVWA. + +**Folder Permissions**: + +* `./hackable/uploads/` - Needs to be writable by the web service (for File Upload). +* `./external/phpids/0.6/lib/IDS/tmp/phpids_log.txt` - Needs to be writable by the web service (if you wish to use PHPIDS). + +**PHP configuration**: + +* `allow_url_include = on` - Allows for Remote File Inclusions (RFI) [[allow_url_include](https://secure.php.net/manual/en/filesystem.configuration.php#ini.allow-url-include)] +* `allow_url_fopen = on` - Allows for Remote File Inclusions (RFI) [[allow_url_fopen](https://secure.php.net/manual/en/filesystem.configuration.php#ini.allow-url-fopen)] +* `safe_mode = off` - (If PHP <= v5.4) Allows for SQL Injection (SQLi) [[safe_mode](https://secure.php.net/manual/en/features.safe-mode.php)] +* `magic_quotes_gpc = off` - (If PHP <= v5.4) Allows for SQL Injection (SQLi) [[magic_quotes_gpc](https://secure.php.net/manual/en/security.magicquotes.php)] +* `display_errors = off` - (Optional) Hides PHP warning messages to make it less verbose [[display_errors](https://secure.php.net/manual/en/errorfunc.configuration.php#ini.display-errors)] + +**File: `config/config.inc.php`**: + +* `$_DVWA[ 'recaptcha_public_key' ]` & `$_DVWA[ 'recaptcha_private_key' ]` - These values need to be generated from: https://www.google.com/recaptcha/admin/create + +### Default Credentials + +**Default username = `admin`** + +**Default password = `password`** + +_...can easily be brute forced ;)_ + +Login URL: http://127.0.0.1/dvwa/login.php + +### Troubleshooting + +For the latest troubleshooting information please visit: +https://github.com/RandomStorm/DVWA/issues + ++Q. SQL Injection wont work on PHP v5.2.6. + +-A.If you are using PHP v5.2.6 you will need to do the following in order for SQL injection and other vulnerabilities to work. + +In `.htaccess`: + +Replace: + +``` + + php_flag magic_quotes_gpc off + #php_flag allow_url_fopen on + #php_flag allow_url_include on + +``` + +With: + +``` + + magic_quotes_gpc = Off + allow_url_fopen = On + allow_url_include = On + +``` + ++Q. Command Injection won't work. + +-A. Apache may not have high enough priviledges to run commands on the web server. If you are running DVWA under Linux make sure you are logged in as root. Under Windows log in as Administrator. + ++Q. My XSS payload won't run in IE. + +-A. If you're running IE8 or above, IE actively filters any XSS. To disable the filter you can do so by setting the HTTP header `X-XSS-Protection: 0` or disable it from internet options. There may also be ways to bypass the filter. + +- - - + +## Links + +Homepage: http://www.dvwa.co.uk + +Project Home: https://github.com/RandomStorm/DVWA + +*Created by the DVWA team* diff --git a/dvwa/about.php b/dvwa/about.php new file mode 100644 index 0000000..4beb3a6 --- /dev/null +++ b/dvwa/about.php @@ -0,0 +1,60 @@ + +

About

+

Version " . dvwaVersionGet() . " (Release date: " . dvwaReleaseDateGet() . ")

+

Damn Vulnerable Web Application (DVWA) is a PHP/MySQL web application that is damn vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, help web developers better understand the processes of securing web applications and aid teachers/students to teach/learn web application security in a class room environment

+

The official documentation for DVWA can be found here.

+

DVWA is a RandomStorm OpenSource project. All material is copyright 2008-2015 RandomStorm & Ryan Dewhurst.

+ +

Links

+
    +
  • Homepage: " . dvwaExternalLinkUrlGet( 'http://www.dvwa.co.uk/' ) . "
  • +
  • Project Home: " . dvwaExternalLinkUrlGet( 'https://github.com/RandomStorm/DVWA' ) . "
  • +
  • Bug Tracker: " . dvwaExternalLinkUrlGet( 'https://github.com/RandomStorm/DVWA/issues' ) . "
  • +
  • Souce Control: " . dvwaExternalLinkUrlGet( 'https://github.com/RandomStorm/DVWA/commits/master' ) . "
  • +
  • Wiki: " . dvwaExternalLinkUrlGet( 'https://github.com/RandomStorm/DVWA/wiki' ) . "
  • +
+ +

Credits

+
    +
  • Craig
  • +
  • Jamesr: " . dvwaExternalLinkUrlGet( 'https://www.creativenucleus.com/','www.creativenucleus.com' ) . " / " . dvwaExternalLinkUrlGet( 'http://www.designnewcastle.co.uk/','www.designnewcastle.co.uk' ) . "
  • +
  • Ryan Dewhurst: " . dvwaExternalLinkUrlGet( 'https://www.dewhurstsecurity.com/','www.dewhurstsecurity.com' ) . "
  • +
  • Tedi Heriyanto: " . dvwaExternalLinkUrlGet( 'http://tedi.heriyanto.net/','http://tedi.heriyanto.net' ) . "
  • +
  • Tom Mackenzie: " . dvwaExternalLinkUrlGet( 'https://www.tmacuk.co.uk/','www.tmacuk.co.uk' ) . "
  • +
  • RandomStorm: " . dvwaExternalLinkUrlGet( 'https://www.randomstorm.com/','www.randomstorm.com' ) . "
  • +
  • Jason Jones: " . dvwaExternalLinkUrlGet( 'http://www.linux-ninja.com/','www.linux-ninja.com' ) . "
  • +
  • Brooks Garrett: " . dvwaExternalLinkUrlGet( 'http://brooksgarrett.com/','www.brooksgarrett.com' ) . "
  • +
  • g0tmi1k: " . dvwaExternalLinkUrlGet( 'https://blog.g0tmi1k.com/','g0tmi1k.com' ) . "
  • +
  • Shinkurt: " . dvwaExternalLinkUrlGet( 'http://www.paulosyibelo.com/','www.paulosyibelo.com' ) . "
  • +
+
    +
  • PHPIDS - Copyright (c) 2007 " . dvwaExternalLinkUrlGet( 'http://github.com/PHPIDS/PHPIDS', 'PHPIDS group' ) . "
  • +
+ +

License

+

Damn Vulnerable Web Application (DVWA) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version.

+

The PHPIDS library is included, in good faith, with this DVWA distribution. The operation of PHPIDS is provided without support from the DVWA team. It is licensed under separate terms to the DVWA code.

+ +

Development

+

Everyone is welcome to contribute and help make DVWA as successful as it can be. All contributors can have their name and link (if they wish) placed in the credits section. To contribute pick an Issue from the Project Home to work on or submit a patch to the Issues list.

+\n"; + +dvwaHtmlEcho( $page ); +exit; + +?> diff --git a/dvwa/config/config.inc.php b/dvwa/config/config.inc.php new file mode 100644 index 0000000..37c190c --- /dev/null +++ b/dvwa/config/config.inc.php @@ -0,0 +1,44 @@ + diff --git a/dvwa/docs/DVWA_v1.3.pdf b/dvwa/docs/DVWA_v1.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fb3e95298c7a451f29c2a0a68a2946523b6f0a4b GIT binary patch literal 422011 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¥Z^Ste#CZ7b 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 z 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
{$message}
"; + } + + return $messagesHtml; +} + +// --END (message functions) + +function dvwaHtmlEcho( $pPage ) { + $menuBlocks = array(); + + $menuBlocks[ 'home' ] = array(); + if( dvwaIsLoggedIn() ) { + $menuBlocks[ 'home' ][] = array( 'id' => 'home', 'name' => 'Home', 'url' => '.' ); + $menuBlocks[ 'home' ][] = array( 'id' => 'instructions', 'name' => 'Instructions', 'url' => 'instructions.php' ); + $menuBlocks[ 'home' ][] = array( 'id' => 'setup', 'name' => 'Setup / Reset DB', 'url' => 'setup.php' ); + } + else { + $menuBlocks[ 'home' ][] = array( 'id' => 'setup', 'name' => 'Setup DVWA', 'url' => 'setup.php' ); + $menuBlocks[ 'home' ][] = array( 'id' => 'instructions', 'name' => 'Instructions', 'url' => 'instructions.php' ); + } + + if( dvwaIsLoggedIn() ) { + $menuBlocks[ 'vulnerabilities' ] = array(); + $menuBlocks[ 'vulnerabilities' ][] = array( 'id' => 'brute', 'name' => 'Brute Force', 'url' => 'vulnerabilities/brute/' ); + $menuBlocks[ 'vulnerabilities' ][] = array( 'id' => 'exec', 'name' => 'Command Injection', 'url' => 'vulnerabilities/exec/' ); + $menuBlocks[ 'vulnerabilities' ][] = array( 'id' => 'csrf', 'name' => 'CSRF', 'url' => 'vulnerabilities/csrf/' ); + $menuBlocks[ 'vulnerabilities' ][] = array( 'id' => 'fi', 'name' => 'File Inclusion', 'url' => 'vulnerabilities/fi/.?page=include.php' ); + $menuBlocks[ 'vulnerabilities' ][] = array( 'id' => 'upload', 'name' => 'File Upload', 'url' => 'vulnerabilities/upload/' ); + $menuBlocks[ 'vulnerabilities' ][] = array( 'id' => 'captcha', 'name' => 'Insecure CAPTCHA', 'url' => 'vulnerabilities/captcha/' ); + $menuBlocks[ 'vulnerabilities' ][] = array( 'id' => 'sqli', 'name' => 'SQL Injection', 'url' => 'vulnerabilities/sqli/' ); + $menuBlocks[ 'vulnerabilities' ][] = array( 'id' => 'sqli_blind', 'name' => 'SQL Injection (Blind)', 'url' => 'vulnerabilities/sqli_blind/' ); + $menuBlocks[ 'vulnerabilities' ][] = array( 'id' => 'xss_r', 'name' => 'XSS (Reflected)', 'url' => 'vulnerabilities/xss_r/' ); + $menuBlocks[ 'vulnerabilities' ][] = array( 'id' => 'xss_s', 'name' => 'XSS (Stored)', 'url' => 'vulnerabilities/xss_s/' ); + } + + $menuBlocks[ 'meta' ] = array(); + if( dvwaIsLoggedIn() ) { + $menuBlocks[ 'meta' ][] = array( 'id' => 'security', 'name' => 'DVWA Security', 'url' => 'security.php' ); + $menuBlocks[ 'meta' ][] = array( 'id' => 'phpinfo', 'name' => 'PHP Info', 'url' => 'phpinfo.php' ); + } + $menuBlocks[ 'meta' ][] = array( 'id' => 'about', 'name' => 'About', 'url' => 'about.php' ); + + if( dvwaIsLoggedIn() ) { + $menuBlocks[ 'logout' ] = array(); + $menuBlocks[ 'logout' ][] = array( 'id' => 'logout', 'name' => 'Logout', 'url' => 'logout.php' ); + } + + $menuHtml = ''; + + foreach( $menuBlocks as $menuBlock ) { + $menuBlockHtml = ''; + foreach( $menuBlock as $menuItem ) { + $selectedClass = ( $menuItem[ 'id' ] == $pPage[ 'page_id' ] ) ? 'selected' : ''; + $fixedUrl = DVWA_WEB_PAGE_TO_ROOT.$menuItem[ 'url' ]; + $menuBlockHtml .= "
  • {$menuItem[ 'name' ]}
  • \n"; + } + $menuHtml .= "
      {$menuBlockHtml}
    "; + } + + // Get security cookie -- + $securityLevelHtml = ''; + switch( dvwaSecurityLevelGet() ) { + case 'low': + $securityLevelHtml = 'low'; + break; + case 'medium': + $securityLevelHtml = 'medium'; + break; + case 'high': + $securityLevelHtml = 'high'; + break; + default: + $securityLevelHtml = 'impossible'; + break; + } + // -- END (security cookie) + + $phpIdsHtml = 'PHPIDS: ' . ( dvwaPhpIdsIsEnabled() ? 'enabled' : 'disabled' ); + $userInfoHtml = 'Username: ' . ( dvwaCurrentUser() ); + + $messagesHtml = messagesPopAllToHtml(); + if( $messagesHtml ) { + $messagesHtml = "
    {$messagesHtml}
    "; + } + + $systemInfoHtml = ""; + if( dvwaIsLoggedIn() ) + $systemInfoHtml = "
    {$userInfoHtml}
    Security Level: {$securityLevelHtml}
    {$phpIdsHtml}
    "; + if( $pPage[ 'source_button' ] ) { + $systemInfoHtml = dvwaButtonSourceHtmlGet( $pPage[ 'source_button' ] ) . " $systemInfoHtml"; + } + if( $pPage[ 'help_button' ] ) { + $systemInfoHtml = dvwaButtonHelpHtmlGet( $pPage[ 'help_button' ] ) . " $systemInfoHtml"; + } + + // Send Headers + main HTML code + Header( 'Cache-Control: no-cache, must-revalidate'); // HTTP/1.1 + Header( 'Content-Type: text/html;charset=utf-8' ); // TODO- proper XHTML headers... + Header( 'Expires: Tue, 23 Jun 2009 12:00:00 GMT' ); // Date in the past + + echo " + + + + + + + + {$pPage[ 'title' ]} + + + + + + + + + + +
    + +
    + + \"Damn + +
    + +
    + +
    + {$menuHtml} +
    + +
    + +
    + + {$pPage[ 'body' ]} +

    + {$messagesHtml} + +
    + +
    +
    + +
    + {$systemInfoHtml} +
    + +
    + +

    Damn Vulnerable Web Application (DVWA) v" . dvwaVersionGet() . "

    + +
    + +
    + + + +"; +} + + +function dvwaHelpHtmlEcho( $pPage ) { + // Send Headers + Header( 'Cache-Control: no-cache, must-revalidate'); // HTTP/1.1 + Header( 'Content-Type: text/html;charset=utf-8' ); // TODO- proper XHTML headers... + Header( 'Expires: Tue, 23 Jun 2009 12:00:00 GMT' ); // Date in the past + + echo " + + + + + + + + + {$pPage[ 'title' ]} + + + + + + + + + +
    + + {$pPage[ 'body' ]} + +
    + + + +"; +} + + +function dvwaSourceHtmlEcho( $pPage ) { + // Send Headers + Header( 'Cache-Control: no-cache, must-revalidate'); // HTTP/1.1 + Header( 'Content-Type: text/html;charset=utf-8' ); // TODO- proper XHTML headers... + Header( 'Expires: Tue, 23 Jun 2009 12:00:00 GMT' ); // Date in the past + + echo " + + + + + + + + + {$pPage[ 'title' ]} + + + + + + + + + +
    + + {$pPage[ 'body' ]} + +
    + + + +"; +} + +// To be used on all external links -- +function dvwaExternalLinkUrlGet( $pLink,$text=null ) { + if(is_null( $text )) { + return '' . $pLink . ''; + } + else { + return '' . $text . ''; + } +} +// -- END ( external links) + +function dvwaButtonHelpHtmlGet( $pId ) { + $security = dvwaSecurityLevelGet(); + return ""; +} + + +function dvwaButtonSourceHtmlGet( $pId ) { + $security = dvwaSecurityLevelGet(); + return ""; +} + + +// Database Management -- + +if( $DBMS == 'MySQL' ) { + $DBMS = htmlspecialchars(strip_tags( $DBMS )); + $DBMS_errorFunc = 'mysql_error()'; +} +elseif( $DBMS == 'PGSQL' ) { + $DBMS = htmlspecialchars(strip_tags( $DBMS )); + $DBMS_errorFunc = 'pg_last_error()'; +} +else { + $DBMS = "No DBMS selected."; + $DBMS_errorFunc = ''; +} + +//$DBMS_connError = ' +//
    +// +//
    Unable to connect to the database.
    ' . $DBMS_errorFunc . '

    +// Click here to setup the database. +//
    '; + +function dvwaDatabaseConnect() { + global $_DVWA; + global $DBMS; + //global $DBMS_connError; + global $db; + + if( $DBMS == 'MySQL' ) { + if( !@mysql_connect( $_DVWA[ 'db_server' ], $_DVWA[ 'db_user' ], $_DVWA[ 'db_password' ] ) + || !@mysql_select_db( $_DVWA[ 'db_database' ] ) ) { + //die( $DBMS_connError ); + dvwaLogout(); + dvwaMessagePush( 'Unable to connect to the database.
    ' . $DBMS_errorFunc ); + dvwaRedirect( DVWA_WEB_PAGE_TO_ROOT . 'setup.php' ); + } + // MySQL PDO Prepared Statements (for impossible levels) + $db = new PDO('mysql:host=' . $_DVWA[ 'db_server' ].';dbname=' . $_DVWA[ 'db_database' ].';charset=utf8', $_DVWA[ 'db_user' ], $_DVWA[ 'db_password' ]); + $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); + } + elseif( $DBMS == 'PGSQL' ) { + //$dbconn = pg_connect("host={$_DVWA[ 'db_server' ]} dbname={$_DVWA[ 'db_database' ]} user={$_DVWA[ 'db_user' ]} password={$_DVWA[ 'db_password' ])}" + //or die( $DBMS_connError ); + dvwaMessagePush( 'PostgreSQL is not yet fully supported.' ); + dvwaPageReload(); + } + else { + die ( "Unknown {$DBMS} selected." ); + } +} + +// -- END (Database Management) + + +function dvwaRedirect( $pLocation ) { + session_commit(); + header( "Location: {$pLocation}" ); + exit; +} + +// XSS Stored guestbook function -- +function dvwaGuestbook() { + $query = "SELECT name, comment FROM guestbook"; + $result = mysql_query( $query ); + + $guestbook = ''; + + while( $row = mysql_fetch_row( $result ) ) { + if( dvwaSecurityLevelGet() == 'impossible' ) { + $name = htmlspecialchars( $row[0] ); + $comment = htmlspecialchars( $row[1] ); + } + else { + $name = $row[0]; + $comment = $row[1]; + } + + $guestbook .= "
    Name: {$name}
    " . "Message: {$comment}
    \n"; + } + return $guestbook; +} +// -- END (XSS Stored guestbook) + + +// Token functions -- +function checkToken( $user_token, $session_token, $returnURL ) { # Validate the given (CSRF) token + if( $user_token !== $session_token || !isset( $session_token ) ) { + dvwaMessagePush( 'CSRF token is incorrect' ); + dvwaRedirect( $returnURL ); + } +} + +function generateSessionToken() { # Generate a brand new (CSRF) token + if( isset( $_SESSION[ 'session_token' ] ) ) { + destroySessionToken(); + } + $_SESSION[ 'session_token' ] = md5( uniqid() ); +} + +function destroySessionToken() { # Destroy any session with the name 'session_token' + unset( $_SESSION[ 'session_token' ] ); +} + +function tokenField() { # Return a field for the (CSRF) token + return ""; +} +// -- END (Token functions) + + +// Setup Functions -- +$PHPUploadPath = realpath( getcwd() ) . "/hackable/uploads/"; +$PHPIDSPath = realpath( getcwd() ) . "/external/phpids/" . dvwaPhpIdsVersionGet() . "/lib/IDS/tmp/phpids_log.txt"; + +$phpDisplayErrors = 'PHP function display_errors: ' . ( ini_get( 'display_errors' ) ? 'Enabled (Easy Mode!)' : 'Disabled' ); // Verbose error messages (e.g. full path disclosure) +$phpSafeMode = 'PHP function safe_mode: Enabled' : 'success">Disabled' ) . ''; // DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0 +$phpMagicQuotes = 'PHP function magic_quotes_gpc: Enabled' : 'success">Disabled' ) . ''; // DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0 +$phpURLInclude = 'PHP function allow_url_include: Enabled' : 'failure">Disabled' ) . ''; // RFI +$phpURLFopen = 'PHP function allow_url_fopen: Enabled' : 'failure">Disabled' ) . ''; // RFI +$phpGD = 'PHP module php-gd: Installed' : 'failure">Missing' ) . ''; // File Upload + +$DVWARecaptcha = 'reCAPTCHA key: ' . $_DVWA[ 'recaptcha_public_key' ] : 'failure">Missing' ) . ''; + +$DVWAUploadsWrite = 'Writable folder ' . $PHPUploadPath . ': Yes)' : 'failure">No' ) . ''; // File Upload +$DVWAPHPWrite = 'Writable file ' . $PHPIDSPath . ': Yes' : 'failure">No' ) . ''; // PHPIDS + +$DVWAOS = 'Operating system: ' . ( strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? 'Windows' : '*nix' ) . ''; +$SERVER_NAME = 'Web Server SERVER_NAME: ' . $_SERVER[ 'SERVER_NAME' ] . ''; // CSRF +// -- END (Setup Functions) + +?> diff --git a/dvwa/dvwa/includes/dvwaPhpIds.inc.php b/dvwa/dvwa/includes/dvwaPhpIds.inc.php new file mode 100644 index 0000000..1d78804 --- /dev/null +++ b/dvwa/dvwa/includes/dvwaPhpIds.inc.php @@ -0,0 +1,101 @@ + $line ) { + $line = explode( ",", $line ); + $line = str_replace( "\"", " ", $line ); + + $datetime = $line[1]; + $vulnerability = $line[3]; + $variable = urldecode($line[4]); + $request = urldecode($line[5]); + $ip = $line[6]; + $data .= "
    \nDate/Time: {$datetime}
    \nVulnerability: {$vulnerability}
    \nRequest: " . htmlspecialchars($request) . "
    \nVariable: " . htmlspecialchars($variable) . "
    \nIP: {$ip}
    "; + } + +return $data; +} + +// Clear PHPIDS log +function dvwaClearIdsLog() { + if( isset( $_GET[ 'clear_log' ] ) ) { + $fp = fopen( DVWA_WEB_PAGE_TO_PHPIDS_LOG, w ); + fclose( $fp ); + dvwaMessagePush( "PHPIDS log cleared" ); + dvwaPageReload(); + } +} + +// Main PHPIDS function +function dvwaPhpIdsTrap() { + global $_DVWA; + try { + + /* + * 1. Define what to scan + * Please keep in mind what array_merge does and how this might interfer + * with your variables_order settings + */ + $request = array( + 'REQUEST' => $_REQUEST, + 'GET' => $_GET, + 'POST' => $_POST, + 'COOKIE' => $_COOKIE + ); + + $init = IDS_Init::init( DVWA_WEB_PAGE_TO_PHPIDS . 'lib/IDS/Config/Config.ini' ); + + $init->config[ 'General' ][ 'base_path' ] = DVWA_WEB_PAGE_TO_PHPIDS . 'lib/IDS/'; + $init->config[ 'General' ][ 'use_base_path' ] = true; + $init->config[ 'Caching' ][ 'caching' ] = 'none'; + + // 2. Initiate the PHPIDS and fetch the results + $ids = new IDS_Monitor( $request, $init ); + $result = $ids->run(); + + if( !$result->isEmpty() ) { + require_once 'IDS/Log/File.php'; + require_once 'IDS/Log/Composite.php'; + + $compositeLog = new IDS_Log_Composite(); + $compositeLog->addLogger(IDS_Log_File::getInstance($init)); + + $compositeLog->execute($result); + + echo 'Hacking attempt detected and logged.
    Have a nice day.'; + + if( $_DVWA[ 'default_phpids_verbose' ] == 'true' ) + echo $result; + + exit; + } + } + catch (Exception $e) { + // Something went terribly wrong - maybe the filter rules weren't found? + printf( 'An error occured: %s', $e->getMessage() ); + } +} + +?> diff --git a/dvwa/dvwa/js/dvwaPage.js b/dvwa/dvwa/js/dvwaPage.js new file mode 100644 index 0000000..d5ea37b --- /dev/null +++ b/dvwa/dvwa/js/dvwaPage.js @@ -0,0 +1,35 @@ +/* Help popup */ + +function popUp(URL) { + day = new Date(); + id = day.getTime(); + eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width=500,height=300,left = 540,top = 250');"); +} + +/* Form validation */ + +function validate_required(field,alerttxt) +{ +with (field) { + if (value==null||value=="") { + alert(alerttxt);return false; + } + else { + return true; + } + } +} + +function validate_form(thisform) { +with (thisform) { + + // Guestbook form + if (validate_required(txtName,"Name can not be empty.")==false) + {txtName.focus();return false;} + + if (validate_required(mtxMessage,"Message can not be empty.")==false) + {mtxMessage.focus();return false;} + + } +} + diff --git a/dvwa/external/phpids/0.6/LICENSE b/dvwa/external/phpids/0.6/LICENSE new file mode 100644 index 0000000..fc8a5de --- /dev/null +++ b/dvwa/external/phpids/0.6/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/dvwa/external/phpids/0.6/build.xml b/dvwa/external/phpids/0.6/build.xml new file mode 100644 index 0000000..b1bff10 --- /dev/null +++ b/dvwa/external/phpids/0.6/build.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/dvwa/external/phpids/0.6/docs/examples/cakephp/README b/dvwa/external/phpids/0.6/docs/examples/cakephp/README new file mode 100644 index 0000000..6d9a135 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/examples/cakephp/README @@ -0,0 +1,20 @@ +PHPIDS + +Requirements: PHP5, SimpleXML + +Copyright (c) 2007 PHPIDS (http://php-ids.org) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; version 2 of the license. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + + +== IMPORTANT == +Please read header comments in ids.php for further information on how to +install this software +== IMPORTANT == \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/examples/cakephp/ids.php b/dvwa/external/phpids/0.6/docs/examples/cakephp/ids.php new file mode 100644 index 0000000..df0bcbc --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/examples/cakephp/ids.php @@ -0,0 +1,269 @@ +params['bare'])?$this->params['bare']:0; + * if(($bare === 0 || $this->RequestHandler->isAjax()) && DEBUG == 0 && ADMIN == 0) { + * $this->Ids->detect($this); + * } + * //EOF + * + * 6. Make sure DEBUG and ADMIN are 0 if you want to test + * 7. Customize some stuff in the Config/Config.ini if you like + * 8. Inject some XSS via URL or an arbitrary form of your webapp + * 9. Please make sure you tested the use of the PHPIDS before you go live + * + * If you have problems getting the PHPIDS to work just drop us a line via our forum + * + * http://forum.php-ids.org/ + * + */ + +/** + * The CakePHP IDS component + * + * @package PHPIDS + */ +class IdsComponent extends Object { + + /** + * define the threshold for the ids reactions + */ + private $threshold = array( + 'log' => 3, + 'mail' => 9, + 'warn' => 27, + 'kick' => 81 + ); + + /** + * define the email addresses for idsmail + */ + private $email = array( + 'address1@what.ever', + 'address2@what.ever' + ); + + /** + * the init object + */ + private $init = NULL; + + /** + * This function includes the IDS vendor parts and runs the + * detection routines on the request array. + * + * @param object cake controller object + * @return boolean + */ + public function detect(&$controller) { + + $this->controller = &$controller; + $this->name = Inflector::singularize($this->controller->name); + + #set include path for IDS and store old one + $path = get_include_path(); + set_include_path( VENDORS . 'phpids/'); + + #require the needed files + vendor('phpids/IDS/Init'); + + #add request url and user agent + $_REQUEST['IDS_request_uri'] = $_SERVER['REQUEST_URI']; + if (isset($_SERVER['HTTP_USER_AGENT'])) { + $_REQUEST['IDS_user_agent'] = $_SERVER['HTTP_USER_AGENT']; + } + + #init the PHPIDS and pass the REQUEST array + $this->init = IDS_Init::init(); + $ids = new IDS_Monitor($this->init, $_REQUEST); + $result = $ids->run(); + + // Re-set include path + set_include_path($path); + + if (!$result->isEmpty()) { + $this->react($result); + } + + return true; + } + + /** + * This function rects on the values in + * the incoming results array. + * + * Depending on the impact value certain actions are + * performed. + * + * @param IDS_Report $result + * @return boolean + */ + private function react(IDS_Report $result) { + + $new = $this->controller + ->Session + ->read('IDS.Impact') + $result->getImpact(); + + + $this->controller->Session->write('IDS.Impact', $new); + $impact = $this->controller->Session->read('IDS.Impact'); + + if ($impact >= $this->threshold['kick']) { + $this->idslog($result, 3, $impact); + $this->idsmail($result); + $this->idskick($result); + return true; + } else if ($impact >= $this->threshold['warn']) { + $this->idslog($result, 2, $impact); + $this->idsmail($result); + $this->idswarn($result); + return true; + } else if ($impact >= $this->threshold['mail']) { + $this->idslog($result, 1, $impact); + $this->idsmail($result); + return true; + } else if ($impact >= $this->threshold['log']) { + $this->idslog($result, 0, $impact); + return true; + } else { + return true; + } + } + + /** + * This function writes an entry about the intrusion + * to the intrusion database + * + * @param array $results + * @return boolean + */ + private function idslog($result, $reaction = 0) { + + $user = $this->controller + ->Session->read('User.id') ? + $this->controller->Session->read('User.id') : + 0; + + $ip = ($_SERVER['SERVER_ADDR'] != '127.0.0.1') ? + $_SERVER['SERVER_ADDR'] : + (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? + $_SERVER['HTTP_X_FORWARDED_FOR'] : + '127.0.0.1'); + + foreach ($result as $event) { + $data = array( + 'Intrusion' => array( + 'name' => $event->getName(), + 'value' => stripslashes($event->getValue()), + 'page' => $_SERVER['REQUEST_URI'], + 'userid' => $user, + 'session' => session_id() ? session_id() : '0', + 'ip' => $ip, + 'reaction' => $reaction, + 'impact' => $result->getImpact() + ) + ); + } + + loadModel('Intrusion'); + $intrusion = new Intrusion; + $saveable = array('name', 'value', 'page', 'userid', 'session', 'ip', 'reaction', 'impact'); + $intrusion->save($data, false, $saveable); + + return true; + } + + /** + * This function sends out a mail + * about the intrusion including the intrusion details + * + * @param array $results + * @return boolean + */ + private function idsmail($result) { + + vendor('phpids/IDS/Log/Email.php'); + vendor('phpids/IDS/Log/Composite.php'); + + $compositeLog = new IDS_Log_Composite(); + $compositeLog->addLogger( + IDS_Log_Email::getInstance($this->init->config['IDS_Logging']['recipient'], + $this->config['IDS_Logging']['subject'], + NULL, //optional headers + $this->init->config['IDS_Logging']['safemode'], + $this->init->config['IDS_Logging']['allowed_rate'], + $this->init->config['IDS_Basic']['tmp_path']) + ); + + if (!$result->isEmpty()) { + $compositeLog->execute($result); + } + + return true; + } + + /** + * //todo + * + * + */ + private function idswarn($result) { + return $result; + } + + /** + * //todo + * + * + */ + private function idskick($result) { + return $result; + } +} diff --git a/dvwa/external/phpids/0.6/docs/examples/cakephp/intrusion.php b/dvwa/external/phpids/0.6/docs/examples/cakephp/intrusion.php new file mode 100644 index 0000000..8f2f403 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/examples/cakephp/intrusion.php @@ -0,0 +1,21 @@ + $_REQUEST, + 'GET' => $_GET, + 'POST' => $_POST, + 'COOKIE' => $_COOKIE + ); + + $init = IDS_Init::init(dirname(__FILE__) . '/../../lib/IDS/Config/Config.ini'); + + /** + * You can also reset the whole configuration + * array or merge in own data + * + * This usage doesn't overwrite already existing values + * $config->setConfig(array('General' => array('filter_type' => 'xml'))); + * + * This does (see 2nd parameter) + * $config->setConfig(array('General' => array('filter_type' => 'xml')), true); + * + * or you can access the config directly like here: + */ + + $init->config['General']['base_path'] = dirname(__FILE__) . '/../../lib/IDS/'; + $init->config['General']['use_base_path'] = true; + $init->config['Caching']['caching'] = 'none'; + + // 2. Initiate the PHPIDS and fetch the results + $ids = new IDS_Monitor($request, $init); + $result = $ids->run(); + + /* + * That's it - now you can analyze the results: + * + * In the result object you will find any suspicious + * fields of the passed array enriched with additional info + * + * Note: it is moreover possible to dump this information by + * simply echoing the result object, since IDS_Report implemented + * a __toString method. + */ + if (!$result->isEmpty()) { + echo $result; + + /* + * The following steps are optional to log the results + */ + require_once 'IDS/Log/File.php'; + require_once 'IDS/Log/Composite.php'; + + $compositeLog = new IDS_Log_Composite(); + $compositeLog->addLogger(IDS_Log_File::getInstance($init)); + + /* + * Note that you might also use different logging facilities + * such as IDS_Log_Email or IDS_Log_Database + * + * Just uncomment the following lines to test the wrappers + */ + /* + * + require_once 'IDS/Log/Email.php'; + require_once 'IDS/Log/Database.php'; + + $compositeLog->addLogger( + IDS_Log_Email::getInstance($init), + IDS_Log_Database::getInstance($init) + ); + */ + $compositeLog->execute($result); + + + } else { + echo 'No attack detected - click for an example attack'; + } +} catch (Exception $e) { + /* + * sth went terribly wrong - maybe the + * filter rules weren't found? + */ + printf( + 'An error occured: %s', + $e->getMessage() + ); +} diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching.html new file mode 100644 index 0000000..d89cd32 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching.html @@ -0,0 +1,123 @@ + + + + + + Docs For Class IDS_Caching + + + + +
    +

    Class IDS_Caching

    + + +
    +
    Description
    + +
    + +

    Caching factory

    +

    This class is used as a factory to load the correct concrete caching implementation.

    + +

    + Located in /Caching/Factory.php (line 51) +

    + + +
    
    +	
    +			
    +
    + + + + + +
    +
    Method Summary
    + +
    +
    +
    + static object the + factory + (array $init, string $type) +
    + +
    +
    +
    + + + +
    +
    Methods
    + +
    + + +
    + +
    + static method factory (line 62) +
    + + +

    Factory method

    +
      +
    • return: caching facility
    • +
    • access: public
    • +
    + +
    + static + object the + + factory + + (array $init, string $type) +
    + +
      +
    • + array + $init: the IDS_Init object
    • +
    • + string + $type: the caching type
    • +
    + + +
    + + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:44 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Database.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Database.html new file mode 100644 index 0000000..2ed51c9 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Database.html @@ -0,0 +1,244 @@ + + + + + + Docs For Class IDS_Caching_Database + + + + +
    +

    Class IDS_Caching_Database

    + + +
    +
    Description
    + +
    +

    + Implements interfaces: +

    +

    + +

    Database caching wrapper

    +

    This class inhabits functionality to get and set cache via a database.

    + +

    + Located in /Caching/Database.php (line 72) +

    + + +
    
    +	
    +			
    +
    + + + + + +
    +
    Method Summary
    + +
    +
    +
    + static object + getInstance + (string $type, array $init) +
    + +
    + void + __construct + (string $type, array $init) +
    +
    + mixed + getCache + () +
    +
    + object + setCache + ( $data) +
    +
    +
    +
    + + + +
    +
    Methods
    + +
    + + +
    + +
    + static method getInstance (line 129) +
    + + +

    Returns an instance of this class

    +
      +
    • access: public
    • +
    + +
    + static + object + + getInstance + + (string $type, array $init) +
    + +
      +
    • + string + $type: caching type
    • +
    • + array + $init: the IDS_Init object
    • +
    + + +
    + + +
    + +
    + Constructor __construct (line 113) +
    + + +

    Constructor

    +

    Connects to database.

    +
      +
    • access: public
    • +
    + +
    + void + + __construct + + (string $type, array $init) +
    + +
      +
    • + string + $type: caching type
    • +
    • + array + $init: the IDS_Init object
    • +
    + + +
    + +
    + +
    + getCache (line 181) +
    + + +

    Returns the cached data

    +

    Note that this method returns false if either type or file cache is not set

    +
      +
    • return: cache data or false
    • +
    • throws: PDOException if a db error occurred
    • +
    • access: public
    • +
    + +
    + mixed + + getCache + + () +
    + + +
    +
    Implementation of:
    +
    +
    IDS_Caching_Interface::getCache()
    +
    Interface method
    +
    + +
    + +
    + +
    + setCache (line 146) +
    + + +

    Writes cache data into the database

    +
      +
    • throws: PDOException if a db error occurred
    • +
    • access: public
    • +
    + +
    + object + + setCache + + ( $data) +
    + +
      +
    • + array + $data: the caching data
    • +
    + +
    +
    Implementation of:
    +
    +
    IDS_Caching_Interface::setCache()
    +
    Interface method
    +
    + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:42 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_File.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_File.html new file mode 100644 index 0000000..d1fcce5 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_File.html @@ -0,0 +1,242 @@ + + + + + + Docs For Class IDS_Caching_File + + + + +
    +

    Class IDS_Caching_File

    + + +
    +
    Description
    + +
    +

    + Implements interfaces: +

    +

    + +

    File caching wrapper

    +

    This class inhabits functionality to get and set cache via a static flatfile.

    + +

    + Located in /Caching/File.php (line 52) +

    + + +
    
    +	
    +			
    +
    + + + + + +
    +
    Method Summary
    + +
    +
    +
    + static object + getInstance + (string $type, array $init) +
    + +
    + void + __construct + (string $type, array $init) +
    +
    + mixed + getCache + () +
    +
    + object + setCache + ( $data) +
    +
    +
    +
    + + + +
    +
    Methods
    + +
    + + +
    + +
    + static method getInstance (line 113) +
    + + +

    Returns an instance of this class

    +
      +
    • access: public
    • +
    + +
    + static + object + + getInstance + + (string $type, array $init) +
    + +
      +
    • + string + $type: caching type
    • +
    • + array + $init: the IDS_Init object
    • +
    + + +
    + + +
    + +
    + Constructor __construct (line 91) +
    + + +

    Constructor

    +
      +
    • access: public
    • +
    + +
    + void + + __construct + + (string $type, array $init) +
    + +
      +
    • + string + $type: caching type
    • +
    • + array + $init: the IDS_Init object
    • +
    + + +
    + +
    + +
    + getCache (line 163) +
    + + +

    Returns the cached data

    +

    Note that this method returns false if either type or file cache is not set

    +
      +
    • return: cache data or false
    • +
    • access: public
    • +
    + +
    + mixed + + getCache + + () +
    + + +
    +
    Implementation of:
    +
    +
    IDS_Caching_Interface::getCache()
    +
    Interface method
    +
    + +
    + +
    + +
    + setCache (line 130) +
    + + +

    Writes cache data into the file

    +
      +
    • throws: Exception if cache file couldn't be created
    • +
    • access: public
    • +
    + +
    + object + + setCache + + ( $data) +
    + +
      +
    • + array + $data: the cache data
    • +
    + +
    +
    Implementation of:
    +
    +
    IDS_Caching_Interface::setCache()
    +
    Interface method
    +
    + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:44 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Interface.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Interface.html new file mode 100644 index 0000000..118d5de --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Interface.html @@ -0,0 +1,146 @@ + + + + + + Docs For Class IDS_Caching_Interface + + + + +
    +

    Interface IDS_Caching_Interface

    + + +
    +
    Description
    + +
    + +

    Caching wrapper interface

    + +

    + Located in /Caching/Interface.php (line 48) +

    + + +
    
    +	
    +			
    +
    + + + + + +
    +
    Method Summary
    + +
    +
    + +
    + void + getCache + () +
    +
    + void + setCache + ( $data) +
    +
    +
    +
    + + + +
    +
    Methods
    + +
    + + + +
    + +
    + getCache (line 64) +
    + + +

    Interface method

    +
      +
    • access: public
    • +
    + +
    + void + + getCache + + () +
    + + + +
    + +
    + +
    + setCache (line 57) +
    + + +

    Interface method

    +
      +
    • access: public
    • +
    + +
    + void + + setCache + + ( $data) +
    + +
      +
    • + array + $data: the cache data
    • +
    + + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:48 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Memcached.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Memcached.html new file mode 100644 index 0000000..f9d06fd --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Memcached.html @@ -0,0 +1,243 @@ + + + + + + Docs For Class IDS_Caching_Memcached + + + + +
    +

    Class IDS_Caching_Memcached

    + + +
    +
    Description
    + +
    +

    + Implements interfaces: +

    +

    + +

    File caching wrapper

    +

    This class inhabits functionality to get and set cache via memcached.

    + +

    + Located in /Caching/Memcached.php (line 52) +

    + + +
    
    +	
    +			
    +
    + + + + + +
    +
    Method Summary
    + +
    +
    +
    + static object + getInstance + (string $type, array $init) +
    + +
    + void + __construct + (string $type, array $init) +
    +
    + mixed + getCache + () +
    +
    + object + setCache + ( $data) +
    +
    +
    +
    + + + +
    +
    Methods
    + +
    + + +
    + +
    + static method getInstance (line 124) +
    + + +

    Returns an instance of this class

    +
      +
    • access: public
    • +
    + +
    + static + object + + getInstance + + (string $type, array $init) +
    + +
      +
    • + string + $type: caching type
    • +
    • + array + $init: the IDS_Init object
    • +
    + + +
    + + +
    + +
    + Constructor __construct (line 100) +
    + + +

    Constructor

    +
      +
    • throws: Exception if necessary files aren't writeable
    • +
    • access: public
    • +
    + +
    + void + + __construct + + (string $type, array $init) +
    + +
      +
    • + string + $type: caching type
    • +
    • + array + $init: the IDS_Init object
    • +
    + + +
    + +
    + +
    + getCache (line 172) +
    + + +

    Returns the cached data

    +

    Note that this method returns false if either type or file cache is not set

    +
      +
    • return: cache data or false
    • +
    • access: public
    • +
    + +
    + mixed + + getCache + + () +
    + + +
    +
    Implementation of:
    +
    +
    IDS_Caching_Interface::getCache()
    +
    Interface method
    +
    + +
    + +
    + +
    + setCache (line 142) +
    + + +

    Writes cache data

    +
      +
    • throws: Exception if necessary files aren't writeable
    • +
    • access: public
    • +
    + +
    + object + + setCache + + ( $data) +
    + +
      +
    • + array + $data: the caching data
    • +
    + +
    +
    Implementation of:
    +
    +
    IDS_Caching_Interface::setCache()
    +
    Interface method
    +
    + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:50 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Session.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Session.html new file mode 100644 index 0000000..155aceb --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Caching_Session.html @@ -0,0 +1,241 @@ + + + + + + Docs For Class IDS_Caching_Session + + + + +
    +

    Class IDS_Caching_Session

    + + +
    +
    Description
    + +
    +

    + Implements interfaces: +

    +

    + +

    File caching wrapper

    +

    This class inhabits functionality to get and set cache via session.

    + +

    + Located in /Caching/Session.php (line 52) +

    + + +
    
    +	
    +			
    +
    + + + + + +
    +
    Method Summary
    + +
    +
    +
    + static object + getInstance + (string $type, array $init) +
    + +
    + void + __construct + (string $type, array $init) +
    +
    + mixed + getCache + () +
    +
    + object + setCache + ( $data) +
    +
    +
    +
    + + + +
    +
    Methods
    + +
    + + +
    + +
    + static method getInstance (line 98) +
    + + +

    Returns an instance of this class

    +
      +
    • access: public
    • +
    + +
    + static + object + + getInstance + + (string $type, array $init) +
    + +
      +
    • + string + $type: caching type
    • +
    • + array + $init: the IDS_Init object
    • +
    + + +
    + + +
    + +
    + Constructor __construct (line 84) +
    + + +

    Constructor

    +
      +
    • access: public
    • +
    + +
    + void + + __construct + + (string $type, array $init) +
    + +
      +
    • + string + $type: caching type
    • +
    • + array + $init: the IDS_Init object
    • +
    + + +
    + +
    + +
    + getCache (line 129) +
    + + +

    Returns the cached data

    +

    Note that this method returns false if either type or file cache is not set

    +
      +
    • return: cache data or false
    • +
    • access: public
    • +
    + +
    + mixed + + getCache + + () +
    + + +
    +
    Implementation of:
    +
    +
    IDS_Caching_Interface::getCache()
    +
    Interface method
    +
    + +
    + +
    + +
    + setCache (line 115) +
    + + +

    Writes cache data into the session

    +
      +
    • access: public
    • +
    + +
    + object + + setCache + + ( $data) +
    + +
      +
    • + array + $data: the caching data
    • +
    + +
    +
    Implementation of:
    +
    +
    IDS_Caching_Interface::setCache()
    +
    Interface method
    +
    + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:53 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Converter.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Converter.html new file mode 100644 index 0000000..8581195 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Converter.html @@ -0,0 +1,720 @@ + + + + + + Docs For Class IDS_Converter + + + + +
    +

    Class IDS_Converter

    + + +
    +
    Description
    + +
    + +

    PHPIDS specific utility class to convert charsets manually

    +

    Note that if you make use of IDS_Converter::runAll(), existing class methods will be executed in the same order as they are implemented in the class tree!

    + +

    + Located in /Converter.php (line 51) +

    + + +
    
    +	
    +			
    +
    + + + + + +
    +
    Method Summary
    + +
    +
    +
    + static string + convertConcatenations + (string $value) +
    +
    + static string + convertEntities + (string $value) +
    +
    + static string + convertFromCommented + (string $value) +
    +
    + static string + convertFromControlChars + (string $value) +
    +
    + static string + convertFromJSCharcode + (string $value) +
    +
    + static string + convertFromJSUnicode + (string $value) +
    +
    + static string + convertFromNestedBase64 + (string $value) +
    +
    + static string + convertFromNewLines + (string $value) +
    +
    + static string + convertFromOutOfRangeChars + (string $value) +
    +
    + static string + convertFromProprietaryEncodings + (string $value, IDS_Monitor $monitor) +
    +
    + static string + convertFromSQLHex + (string $value) +
    +
    + static string + convertFromSQLKeywords + (string $value) +
    +
    + static string + convertFromUTF7 + (string $value) +
    +
    + static string + convertFromXML + (string $value) +
    +
    + static string + convertJSRegexModifiers + (string $value) +
    +
    + static string + convertQuotes + (string $value) +
    +
    + static string + runAll + (string $value) +
    +
    + static string + runCentrifuge + (string $value, [IDS_Monitor $monitor = null]) +
    + +
    +
    +
    + + + +
    +
    Methods
    + +
    + + +
    + +
    + static method convertConcatenations (line 506) +
    + + +

    Converts basic concatenations

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertConcatenations + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertEntities (line 229) +
    + + +

    Converts from hex/dec entities

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertEntities + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertFromCommented (line 86) +
    + + +

    Check for comments and erases them if available

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromCommented + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertFromControlChars (line 321) +
    + + +

    Detects nullbytes and controls chars via ord()

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromControlChars + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertFromJSCharcode (line 134) +
    + + +

    Checks for common charcode pattern and decodes them

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromJSCharcode + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertFromJSUnicode (line 422) +
    + + +

    This method converts JS unicode code points to regular characters

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromJSUnicode + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertFromNestedBase64 (line 359) +
    + + +

    This method matches and translates base64 strings and fragments used in data URIs

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromNestedBase64 + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertFromNewLines (line 116) +
    + + +

    Strip newlines

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromNewLines + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertFromOutOfRangeChars (line 383) +
    + + +

    Detects nullbytes and controls chars via ord()

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromOutOfRangeChars + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertFromProprietaryEncodings (line 558) +
    + + +

    This method collects and decodes proprietary encoding types

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromProprietaryEncodings + + (string $value, IDS_Monitor $monitor) +
    + +
      +
    • + string + $value: the value to convert
    • +
    • + IDS_Monitor + $monitor: the monitor object
    • +
    + + +
    + +
    + +
    + static method convertFromSQLHex (line 266) +
    + + +

    Converts SQLHEX to plain text

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromSQLHex + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertFromSQLKeywords (line 291) +
    + + +

    Converts basic SQL keywords and obfuscations

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromSQLKeywords + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertFromUTF7 (line 449) +
    + + +

    Converts relevant UTF-7 tags to UTF-8

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromUTF7 + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertFromXML (line 403) +
    + + +

    Strip XML patterns

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertFromXML + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertJSRegexModifiers (line 214) +
    + + +

    Eliminate JS regex modifiers

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertJSRegexModifiers + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method convertQuotes (line 249) +
    + + +

    Normalize quotes

    +
      +
    • access: public
    • +
    + +
    + static + string + + convertQuotes + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method runAll (line 65) +
    + + +

    Runs all converter functions

    +

    Note that if you make use of IDS_Converter::runAll(), existing class methods will be executed in the same order as they are implemented in the class tree!

    +
      +
    • access: public
    • +
    + +
    + static + string + + runAll + + (string $value) +
    + +
      +
    • + string + $value: the value to convert
    • +
    + + +
    + +
    + +
    + static method runCentrifuge (line 603) +
    + + +

    This method is the centrifuge prototype

    +
      +
    • access: public
    • +
    + +
    + static + string + + runCentrifuge + + (string $value, [IDS_Monitor $monitor = null]) +
    + +
      +
    • + string + $value: the value to convert
    • +
    • + IDS_Monitor + $monitor: the monitor object
    • +
    + + +
    + + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:41 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Event.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Event.html new file mode 100644 index 0000000..fbc4fdf --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Event.html @@ -0,0 +1,513 @@ + + + + + + Docs For Class IDS_Event + + + + +
    +

    Class IDS_Event

    + + +
    +
    Description
    + +
    +

    + Implements interfaces: +

      +
    • Countable (internal interface)
    • IteratorAggregate (internal interface)
    +

    + +

    PHPIDS event object

    +

    This class represents a certain event that occured while applying the filters to the supplied data. It aggregates a bunch of IDS_Filter implementations and is a assembled in IDS_Report.

    Note that this class implements both Countable and IteratorAggregate

    + +

    + Located in /Event.php (line 53) +

    + + +
    
    +	
    +			
    +
    + + + + +
    +
    Variable Summary
    + +
    +
    +
    + array + $filters +
    +
    + integer + $impact +
    +
    + scalar + $name +
    +
    + array + $tags +
    +
    + scalar + $value +
    +
    +
    +
    + + +
    +
    Method Summary
    + +
    +
    + +
    + void + __construct + (scalar $name, scalar $value,  $filters) +
    +
    + integer + count + () +
    +
    + array + getFilters + () +
    +
    + integer + getImpact + () +
    +
    + Iterator|IteratorAggregate + getIterator + () +
    +
    + scalar + getName + () +
    +
    + array + getTags + () +
    +
    + scalar + getValue + () +
    +
    +
    +
    + + +
    +
    Variables
    + +
    + +
    + +
    + + array + $filters + = array() (line 77) + +
    + + +

    List of filter objects

    +

    Filter objects in this array are those that matched the events value

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + integer + $impact + = 0 (line 86) + +
    + + +

    Calculated impact

    +

    Total impact of the event

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + scalar + $name + = null (line 61) + +
    + + +

    Event name

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + array + $tags + = array() (line 93) + +
    + + +

    Affecte tags

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + scalar + $value + = null (line 68) + +
    + + +

    Value of the event

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    +
    + + +
    +
    Methods
    + +
    + + + +
    + +
    + Constructor __construct (line 106) +
    + + +

    Constructor

    +

    Fills event properties

    +
      +
    • access: public
    • +
    + +
    + void + + __construct + + (scalar $name, scalar $value,  $filters) +
    + +
      +
    • + scalar + $name: the event name
    • +
    • + scalar + $value: the event value
    • +
    • + array + $filters: the corresponding filters
    • +
    + + +
    + +
    + +
    + count (line 211) +
    + + +

    Returns number of filters

    +

    To implement interface Countable this returns the number of filters appended.

    +
      +
    • access: public
    • +
    + +
    + integer + + count + + () +
    + + +
    +
    Implementation of:
    +
    +
    Countable::count
    +
    + +
    + +
    + +
    + getFilters (line 198) +
    + + +

    Returns list of filter objects

    +
      +
    • access: public
    • +
    + +
    + array + + getFilters + + () +
    + + + +
    + +
    + +
    + getImpact (line 162) +
    + + +

    Returns calculated impact

    +
      +
    • access: public
    • +
    + +
    + integer + + getImpact + + () +
    + + + +
    + +
    + +
    + getIterator (line 223) +
    + + +

    IteratorAggregate iterator getter

    +

    Returns an iterator to iterate over the appended filters.

    +
      +
    • access: public
    • +
    + +
    + Iterator|IteratorAggregate + + getIterator + + () +
    + + +
    +
    Implementation of:
    +
    +
    IteratorAggregate::getIterator
    +
    + +
    + +
    + +
    + getName (line 142) +
    + + +

    Returns event name

    +

    The name of the event usually is the key of the variable that was considered to be malicious

    +
      +
    • access: public
    • +
    + +
    + scalar + + getName + + () +
    + + + +
    + +
    + +
    + getTags (line 179) +
    + + +

    Returns affected tags

    +
      +
    • access: public
    • +
    + +
    + array + + getTags + + () +
    + + + +
    + +
    + +
    + getValue (line 152) +
    + + +

    Returns event value

    +
      +
    • access: public
    • +
    + +
    + scalar + + getValue + + () +
    + + + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:44 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter.html new file mode 100644 index 0000000..19fcb39 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter.html @@ -0,0 +1,452 @@ + + + + + + Docs For Class IDS_Filter + + + + +
    +

    Class IDS_Filter

    + + +
    +
    Description
    + +
    + +

    PHPIDS Filter object

    +

    Each object of this class serves as a container for a specific filter. The object provides methods to get information about this particular filter and also to match an arbitrary string against it.

    + +

    + Located in /Filter.php (line 52) +

    + + +
    
    +	
    +			
    +
    + + + + +
    +
    Variable Summary
    + +
    +
    +
    + string + $description +
    +
    + integer + $impact +
    +
    + string + $rule +
    +
    + array + $tags +
    +
    +
    +
    + + +
    +
    Method Summary
    + +
    +
    + +
    + void + __construct + ( $id, mixed $rule, string $description,  $tags, integer $impact) +
    +
    + string + getDescription + () +
    +
    + integer + getId + () +
    +
    + integer + getImpact + () +
    +
    + string + getRule + () +
    +
    + array + getTags + () +
    +
    + boolean + match + (string $string) +
    +
    +
    +
    + + +
    +
    Variables
    + +
    + +
    + +
    + + string + $description + = null (line 81) + +
    + + +

    Filter description

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + integer + $impact + = 0 (line 74) + +
    + + +

    Filter impact level

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + string + $rule + (line 60) + +
    + + +

    Filter rule

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + array + $tags + = array() (line 67) + +
    + + +

    List of tags of the filter

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    +
    + + +
    +
    Methods
    + +
    + + + +
    + +
    + Constructor __construct (line 93) +
    + + +

    Constructor

    +
      +
    • access: public
    • +
    + +
    + void + + __construct + + ( $id, mixed $rule, string $description,  $tags, integer $impact) +
    + +
      +
    • + mixed + $rule: filter rule
    • +
    • + string + $description: filter description
    • +
    • + array + $tags: list of tags
    • +
    • + integer + $impact: filter impact level
    • +
    • + + $id
    • +
    + + +
    + +
    + +
    + getDescription (line 131) +
    + + +

    Returns filter description

    +
      +
    • access: public
    • +
    + +
    + string + + getDescription + + () +
    + + + +
    + +
    + +
    + getId (line 174) +
    + + +

    Get filter ID

    +
      +
    • access: public
    • +
    + +
    + integer + + getId + + () +
    + + + +
    + +
    + +
    + getImpact (line 164) +
    + + +

    Get filter impact level

    +
      +
    • access: public
    • +
    + +
    + integer + + getImpact + + () +
    + + + +
    + +
    + +
    + getRule (line 154) +
    + + +

    Returns filter rule

    +
      +
    • access: public
    • +
    + +
    + string + + getRule + + () +
    + + + +
    + +
    + +
    + getTags (line 144) +
    + + +

    Return list of affected tags

    +

    Each filter rule is concerned with a certain kind of attack vectors. This method returns those affected kinds.

    +
      +
    • access: public
    • +
    + +
    + array + + getTags + + () +
    + + + +
    + +
    + +
    + match (line 113) +
    + + +

    Matches a string against current filter

    +

    Matches given string against the filter rule the specific object of this class represents

    +
      +
    • throws: InvalidArgumentException if argument is no string
    • +
    • access: public
    • +
    + +
    + boolean + + match + + (string $string) +
    + +
      +
    • + string + $string: the string to match
    • +
    + + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:45 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter_Storage.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter_Storage.html new file mode 100644 index 0000000..b3b56b8 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter_Storage.html @@ -0,0 +1,419 @@ + + + + + + Docs For Class IDS_Filter_Storage + + + + +
    +

    Class IDS_Filter_Storage

    + + +
    +
    Description
    + +
    + +

    Filter Storage

    +

    This class provides various default functions for gathering filter patterns to be used later on by the detection mechanism. You might extend this class to your requirements.

    + +

    + Located in /Filter/Storage.php (line 51) +

    + + +
    
    +	
    +			
    +
    + + + + +
    +
    Variable Summary
    + +
    +
    + +
    + array + $cacheSettings +
    +
    + array + $filterSet +
    +
    + string + $source +
    +
    +
    +
    + + +
    +
    Method Summary
    + +
    +
    + +
    + void + __construct + (IDS_Init $init) +
    +
    + object + addFilter + (IDS_Filter $filter) +
    +
    + object + getFilterFromJson + () +
    +
    + object + getFilterFromXML + () +
    +
    + array + getFilterSet + () +
    +
    + object + setFilterSet + (array $filterSet) +
    +
    +
    +
    + + +
    +
    Variables
    + +
    + +
    + +
    + + object IDS_Caching + $cache + = null (line 73) + +
    + + +

    Cache container

    +
      +
    • var: wrapper
    • +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + array + $cacheSettings + = null (line 66) + +
    + + +

    Holds caching settings

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + array + $filterSet + = array() (line 80) + +
    + + +

    Filter container

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + string + $source + = null (line 59) + +
    + + +

    Filter source file

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    +
    + + +
    +
    Methods
    + +
    + + + +
    + +
    + Constructor __construct (line 92) +
    + + +

    Constructor

    +

    Loads filters based on provided IDS_Init settings.

    +
      +
    • throws: Exception if unsupported filter type is given
    • +
    • access: public
    • +
    + +
    + void + + __construct + + (IDS_Init $init) +
    + +
      +
    • + object + $init: IDS_Init instance
    • +
    + + +
    + +
    + +
    + addFilter (line 155) +
    + + +

    Adds a filter

    +
      +
    • access: public
    • +
    + +
    + object + + addFilter + + (IDS_Filter $filter) +
    + +
      +
    • + object + $filter: IDS_Filter instance
    • +
    + + +
    + +
    + +
    + getFilterFromJson (line 290) +
    + + +

    Loads filters from Json file using ext/Json

    +

    This function parses the provided source file and stores the result. If caching mode is enabled the result will be cached to increase the performance.

    +
      +
    • throws: Exception if problems with fetching the JSON data occur
    • +
    • access: public
    • +
    + +
    + object + + getFilterFromJson + + () +
    + + + +
    + +
    + +
    + getFilterFromXML (line 190) +
    + + +

    Loads filters from XML using SimpleXML

    +

    This function parses the provided source file and stores the result. If caching mode is enabled the result will be cached to increase the performance.

    +
      +
    • throws: Exception if problems with fetching the XML data occur
    • +
    • access: public
    • +
    + +
    + object + + getFilterFromXML + + () +
    + + + +
    + +
    + +
    + getFilterSet (line 143) +
    + + +

    Returns registered filters

    +
      +
    • access: public
    • +
    + +
    + array + + getFilterSet + + () +
    + + + +
    + +
    + +
    + setFilterSet (line 129) +
    + + +

    Sets the filter array

    +
      +
    • access: public
    • +
    + +
    + object + + setFilterSet + + (array $filterSet) +
    + +
      +
    • + array + $filterSet: array containing multiple IDS_Filter instances
    • +
    + + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:53 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter_Storage_Abstract.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter_Storage_Abstract.html new file mode 100644 index 0000000..8887056 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Filter_Storage_Abstract.html @@ -0,0 +1,326 @@ + + + + + + Docs For Class IDS_Filter_Storage_Abstract + + + + +
    +

    Class IDS_Filter_Storage_Abstract

    + + +
    +
    Description
    + +
    + +

    Abstract Filter Storage

    +

    Class to assure the systems API

    +
      +
    • author: christ1an <ch0012@gmail.com>
    • +
    • version: $Id: Storage.php 494 2007-09-11 20:59:11Z mario $
    • +
    • abstract:
    • +
    +

    + Located in /Filter/Storage/Abstract.php (line 31) +

    + + +
    
    +	
    +			
    +
    + + +
    +
    Direct descendents
    + +
    + + + + + + + + + +
    ClassDescription
    IDS_Filter_Storage + Filter Storage Class +
    +
    +
    + + + +
    +
    Variable Summary
    + +
    +
    +
    + mixed + $caching +
    +
    + mixed + $filterPath +
    +
    +
    +
    + + +
    +
    Method Summary
    + +
    +
    + +
    + void + __construct + (IDS_Init $init) +
    +
    + object + addFilter + (IDS_Filter $filter) +
    +
    + void + getFilterSet + () +
    +
    + object + setFilterSet + (array $filterSet) +
    +
    +
    +
    + + +
    +
    Variables
    + +
    + +
    + +
    + + mixed + $caching + = NULL (line 35) + +
    + + +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + mixed + $filterPath + = NULL (line 33) + +
    + + +
      +
    • access: protected
    • +
    + + + + + +
    + +
    +
    + + +
    +
    Methods
    + +
    + + + +
    + +
    + Constructor __construct (line 44) +
    + + +

    Constructor

    +
      +
    • access: public
    • +
    + +
    + void + + __construct + + (IDS_Init $init) +
    + +
      +
    • + object + $init
    • +
    + + +
    + +
    + +
    + addFilter (line 96) +
    + + +

    Adds one particular filter

    +
      +
    • access: public
    • +
    + +
    + object + + addFilter + + (IDS_Filter $filter) +
    + +
      +
    • + object + $filter
    • +
    + + +
    + +
    + +
    + getFilterSet (line 85) +
    + + +

    Returns array containing all filters

    +
      +
    • access: public
    • +
    + +
    + void + + getFilterSet + + () +
    + + + +
    + +
    + +
    + setFilterSet (line 71) +
    + + +

    Sets filter array manually

    +
      +
    • access: public
    • +
    + +
    + object + + setFilterSet + + (array $filterSet) +
    + +
      +
    • + array + $filterSet
    • +
    + + +
    + +
    +
    + + +

    + Documentation generated on Thu, 13 Sep 2007 22:36:58 +0200 by phpDocumentor 1.4.0 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Init.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Init.html new file mode 100644 index 0000000..f141db9 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Init.html @@ -0,0 +1,413 @@ + + + + + + Docs For Class IDS_Init + + + + +
    +

    Class IDS_Init

    + + +
    +
    Description
    + +
    + +

    Framework initiation

    +

    This class is used for the purpose to initiate the framework and inhabits functionality to parse the needed configuration file.

    + +

    + Located in /Init.php (line 51) +

    + + +
    
    +	
    +			
    +
    + + + + +
    +
    Variable Summary
    + +
    +
    +
    + array + $config +
    +
    +
    +
    + + +
    +
    Method Summary
    + +
    +
    +
    + static object + init + ([string $configPath = null]) +
    + +
    + string + getBasePath + () +
    +
    + array + getConfig + () +
    +
    + string + getConfigPath + () +
    +
    + void + setConfig + ( $config, [boolean $overwrite = false]) +
    +
    + void + setConfigPath + (string $path) +
    +
    + array + _mergeConfig + (array $current, array $successor) +
    +
    + void + __clone + () +
    +
    +
    +
    + + +
    +
    Variables
    + +
    + +
    + +
    + + array + $config + = array() (line 59) + +
    + + +

    Holds config settings

    +
      +
    • access: public
    • +
    + + + + + +
    + +
    +
    + + +
    +
    Methods
    + +
    + + +
    + +
    + static method init (line 115) +
    + + +

    Returns an instance of this class. Also a PHP version check is being performed to avoid compatibility problems with PHP < 5.1.6

    +
      +
    • access: public
    • +
    + +
    + static + object + + init + + ([string $configPath = null]) +
    + +
      +
    • + string + $configPath: the path to the config file
    • +
    + + +
    + + +
    + +
    + getBasePath (line 161) +
    + + +

    This method checks if a base path is given and usage is set to true.

    +

    If all that tests succeed the base path will be returned as a string - else null will be returned.

    +
      +
    • return: the base path or null
    • +
    • access: public
    • +
    + +
    + string + + getBasePath + + () +
    + + + +
    + +
    + +
    + getConfig (line 220) +
    + + +

    Returns the config array

    +
      +
    • return: the config array
    • +
    • access: public
    • +
    + +
    + array + + getConfig + + () +
    + + + +
    + +
    + +
    + getConfigPath (line 149) +
    + + +

    Returns path to configuration file

    +
      +
    • return: the config path
    • +
    • access: public
    • +
    + +
    + string + + getConfigPath + + () +
    + + + +
    + +
    + +
    + setConfig (line 178) +
    + + +

    Merges new settings into the exsiting ones or overwrites them

    +
      +
    • access: public
    • +
    + +
    + void + + setConfig + + ( $config, [boolean $overwrite = false]) +
    + +
      +
    • + array + $config: the config array
    • +
    • + boolean + $overwrite: config overwrite flag
    • +
    + + +
    + +
    + +
    + setConfigPath (line 132) +
    + + +

    Sets the path to the configuration file

    +
      +
    • throws: Exception if file not found
    • +
    • access: public
    • +
    + +
    + void + + setConfigPath + + (string $path) +
    + +
      +
    • + string + $path: the path to the config
    • +
    + + +
    + +
    + +
    + _mergeConfig (line 198) +
    + + +

    Merge config hashes recursivly

    +

    The algorithm merges configuration arrays recursively. If an element is an array in both, the values will be appended. If it is a scalar in both, the value will be replaced.

    +
      +
    • return: Merged hash
    • +
    • access: protected
    • +
    + +
    + array + + _mergeConfig + + (array $current, array $successor) +
    + +
      +
    • + array + $current: The legacy hash
    • +
    • + array + $successor: The hash which values count more when in doubt
    • +
    + + +
    + +
    + +
    + __clone (line 103) +
    + + +

    Permitting to clone this object

    +

    For the sake of correctness of a singleton pattern, this is necessary

    +
      +
    • access: public
    • +
    + +
    + void + + __clone + + () +
    + + + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:48 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Composite.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Composite.html new file mode 100644 index 0000000..e365074 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Composite.html @@ -0,0 +1,243 @@ + + + + + + Docs For Class IDS_Log_Composite + + + + +
    +

    Class IDS_Log_Composite

    + + +
    +
    Description
    + +
    + +

    Log Composite

    +

    This class implements the composite pattern to allow to work with multiple logging wrappers at once.

    + +

    + Located in /Log/Composite.php (line 52) +

    + + +
    
    +	
    +			
    +
    + + + + +
    +
    Variable Summary
    + +
    +
    +
    + array + $loggers +
    +
    +
    +
    + + +
    +
    Method Summary
    + +
    +
    + +
    + void + addLogger + () +
    +
    + void + execute + (IDS_Report $data) +
    +
    + boolean + removeLogger + (IDS_Log_Interface $logger) +
    +
    +
    +
    + + +
    +
    Variables
    + +
    + +
    + +
    + + array + $loggers + = array() (line 60) + +
    + + +

    Holds registered logging wrapper

    +
      +
    • access: public
    • +
    + + + + + +
    + +
    +
    + + +
    +
    Methods
    + +
    + + + +
    + +
    + addLogger (line 84) +
    + + +

    Registers a new logging wrapper

    +

    Only valid IDS_Log_Interface instances passed to this function will be registered

    +
      +
    • access: public
    • +
    + +
    + void + + addLogger + + () +
    + + + +
    + +
    + +
    + execute (line 69) +
    + + +

    Iterates through registered loggers and executes them

    +
      +
    • access: public
    • +
    + +
    + void + + execute + + (IDS_Report $data) +
    + +
      +
    • + object + $data: IDS_Report object
    • +
    + + +
    + +
    + +
    + removeLogger (line 104) +
    + + +

    Removes a logger

    +
      +
    • access: public
    • +
    + +
    + boolean + + removeLogger + + (IDS_Log_Interface $logger) +
    + +
      +
    • + object + $logger: IDS_Log_Interface object
    • +
    + + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:40 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Database.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Database.html new file mode 100644 index 0000000..06066f1 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Database.html @@ -0,0 +1,200 @@ + + + + + + Docs For Class IDS_Log_Database + + + + +
    +

    Class IDS_Log_Database

    + + +
    +
    Description
    + +
    +

    + Implements interfaces: +

    +

    + +

    Database logging wrapper

    +

    The database wrapper is designed to store reports into an sql database. It implements the singleton pattern and is based in PDO, supporting different database types.

    + +

    + Located in /Log/Database.php (line 75) +

    + + +
    
    +	
    +			
    +
    + + + + + +
    +
    Method Summary
    + +
    +
    +
    + static object + getInstance + (mixed $config) +
    + +
    + void + __construct + (mixed $config) +
    +
    + boolean + execute + (IDS_Report $data) +
    +
    +
    +
    + + + +
    +
    Methods
    + +
    + + +
    + +
    + static method getInstance (line 212) +
    + + +

    Returns an instance of this class

    +

    This method allows the passed argument to be either an instance of IDS_Init or an array.

    +
      +
    • access: public
    • +
    + +
    + static + object + + getInstance + + (mixed $config) +
    + +
      +
    • + mixed + $config: IDS_Init | array
    • +
    + + +
    + + +
    + +
    + Constructor __construct (line 146) +
    + + +

    Constructor

    +

    Prepares the SQL statement

    +
      +
    • access: protected
    • +
    + +
    + void + + __construct + + (mixed $config) +
    + +
      +
    • + mixed + $config: IDS_Init instance | array
    • +
    + + +
    + +
    + +
    + execute (line 246) +
    + + +

    Stores given data into the database

    +
      +
    • throws: Exception if db error occurred
    • +
    • access: public
    • +
    + +
    + boolean + + execute + + (IDS_Report $data) +
    + +
      +
    • + object + $data: IDS_Report instance
    • +
    + +
    +
    Implementation of:
    +
    +
    IDS_Log_Interface::execute()
    +
    Interface method
    +
    + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:42 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Email.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Email.html new file mode 100644 index 0000000..2a0d974 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Email.html @@ -0,0 +1,307 @@ + + + + + + Docs For Class IDS_Log_Email + + + + +
    +

    Class IDS_Log_Email

    + + +
    +
    Description
    + +
    +

    + Implements interfaces: +

    +

    + +

    Email logging wrapper

    +

    The Email wrapper is designed to send reports via email. It implements the singleton pattern.

    + +

    + Located in /Log/Email.php (line 52) +

    + + +
    
    +	
    +			
    +
    + + + + + +
    +
    Method Summary
    + +
    +
    +
    + static object + getInstance + (mixed $config) +
    + +
    + void + __construct + (mixed $config) +
    +
    + boolean + execute + (IDS_Report $data) +
    +
    + boolean + isSpamAttempt + () +
    +
    + string + prepareData + (mixed $data) +
    +
    + boolean + send + (string $address, string $data, string $headers, [string $envelope = null]) +
    +
    +
    +
    + + + +
    +
    Methods
    + +
    + + +
    + +
    + static method getInstance (line 182) +
    + + +

    Returns an instance of this class

    +

    This method allows the passed argument to be either an instance of IDS_Init or an array.

    +
      +
    • access: public
    • +
    + +
    + static + object + + getInstance + + (mixed $config) +
    + +
      +
    • + mixed + $config: IDS_Init | array
    • +
    + + +
    + + +
    + +
    + Constructor __construct (line 146) +
    + + +

    Constructor

    +
      +
    • access: protected
    • +
    + +
    + void + + __construct + + (mixed $config) +
    + +
      +
    • + mixed + $config: IDS_Init instance | array
    • +
    + + +
    + +
    + +
    + execute (line 316) +
    + + +

    Sends the report to registered recipients

    +
      +
    • throws: Exception if data is no string
    • +
    • access: public
    • +
    + +
    + boolean + + execute + + (IDS_Report $data) +
    + +
      +
    • + object + $data: IDS_Report instance
    • +
    + +
    +
    Implementation of:
    +
    +
    IDS_Log_Interface::execute()
    +
    Interface method
    +
    + +
    + +
    + +
    + isSpamAttempt (line 210) +
    + + +

    Detects spam attempts

    +

    To avoid mail spam through this logging class this function is used to detect such attempts based on the alert frequency.

    +
      +
    • access: protected
    • +
    + +
    + boolean + + isSpamAttempt + + () +
    + + + +
    + +
    + +
    + prepareData (line 270) +
    + + +

    Prepares data

    +

    Converts given data into a format that can be read in an email. You might edit this method to your requirements.

    +
      +
    • access: protected
    • +
    + +
    + string + + prepareData + + (mixed $data) +
    + +
      +
    • + mixed + $data: the report data
    • +
    + + +
    + +
    + +
    + send (line 385) +
    + + +

    Sends an email

    +
      +
    • access: protected
    • +
    + +
    + boolean + + send + + (string $address, string $data, string $headers, [string $envelope = null]) +
    + +
      +
    • + string + $address: email address
    • +
    • + string + $data: the report data
    • +
    • + string + $headers: the mail headers
    • +
    • + string + $envelope: the optional envelope string
    • +
    + + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:43 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_File.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_File.html new file mode 100644 index 0000000..6dadc79 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_File.html @@ -0,0 +1,234 @@ + + + + + + Docs For Class IDS_Log_File + + + + +
    +

    Class IDS_Log_File

    + + +
    +
    Description
    + +
    +

    + Implements interfaces: +

    +

    + +

    File logging wrapper

    +

    The file wrapper is designed to store data into a flatfile. It implements the singleton pattern.

    + +

    + Located in /Log/File.php (line 52) +

    + + +
    
    +	
    +			
    +
    + + + + + +
    +
    Method Summary
    + +
    +
    +
    + static object + getInstance + (mixed $config) +
    + +
    + void + __construct + (string $logfile) +
    +
    + mixed + execute + (IDS_Report $data) +
    +
    + string + prepareData + (mixed $data) +
    +
    +
    +
    + + + +
    +
    Methods
    + +
    + + +
    + +
    + static method getInstance (line 110) +
    + + +

    Returns an instance of this class

    +

    This method allows the passed argument to be either an instance of IDS_Init or a path to a log file. Due to the singleton pattern only one instance for each file can be initiated.

    +
      +
    • access: public
    • +
    + +
    + static + object + + getInstance + + (mixed $config) +
    + +
      +
    • + mixed + $config: IDS_Init or path to a file
    • +
    + + +
    + + +
    + +
    + Constructor __construct (line 86) +
    + + +

    Constructor

    +
      +
    • access: protected
    • +
    + +
    + void + + __construct + + (string $logfile) +
    + +
      +
    • + string + $logfile: path to the log file
    • +
    + + +
    + +
    + +
    + execute (line 184) +
    + + +

    Stores given data into a file

    +
      +
    • throws: Exception if the logfile isn't writeable
    • +
    • access: public
    • +
    + +
    + mixed + + execute + + (IDS_Report $data) +
    + +
      +
    • + object + $data: IDS_Report
    • +
    + +
    +
    Implementation of:
    +
    +
    IDS_Log_Interface::execute()
    +
    Interface method
    +
    + +
    + +
    + +
    + prepareData (line 146) +
    + + +

    Prepares data

    +

    Converts given data into a format that can be stored into a file. You might edit this method to your requirements.

    +
      +
    • access: protected
    • +
    + +
    + string + + prepareData + + (mixed $data) +
    + +
      +
    • + mixed + $data: incoming report data
    • +
    + + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:44 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Interface.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Interface.html new file mode 100644 index 0000000..e59fae4 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Log_Interface.html @@ -0,0 +1,116 @@ + + + + + + Docs For Class IDS_Log_Interface + + + + +
    +

    Interface IDS_Log_Interface

    + + +
    +
    Description
    + +
    + +

    Interface for logging wrappers

    + +

    + Located in /Log/Interface.php (line 47) +

    + + +
    
    +	
    +			
    +
    + + + + + +
    +
    Method Summary
    + +
    +
    + +
    + void + execute + (IDS_Report $data) +
    +
    +
    +
    + + + +
    +
    Methods
    + +
    + + + +
    + +
    + execute (line 56) +
    + + +

    Interface method

    +
      +
    • access: public
    • +
    + +
    + void + + execute + + (IDS_Report $data) +
    + + + + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:48 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Monitor.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Monitor.html new file mode 100644 index 0000000..bde87e0 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Monitor.html @@ -0,0 +1,538 @@ + + + + + + Docs For Class IDS_Monitor + + + + +
    +

    Class IDS_Monitor

    + + +
    +
    Description
    + +
    + +

    Monitoring engine

    +

    This class represents the core of the frameworks attack detection mechanism and provides functions to scan incoming data for malicious appearing script fragments.

    + +

    + Located in /Monitor.php (line 51) +

    + + +
    
    +	
    +			
    +
    + + + + +
    +
    Variable Summary
    + +
    +
    +
    + boolean + $scanKeys +
    +
    +
    +
    + + +
    +
    Method Summary
    + +
    +
    + +
    + void + __construct + ( $request, IDS_Init $init, [ $tags = null]) +
    +
    + void + addHtml + ( $value) +
    +
    + void + addJson + ( $value) +
    +
    + array + getExceptions + () +
    +
    + array + getHtml + () +
    +
    + array + getJson + () +
    + +
    + array + getStorage + () +
    +
    + object IDS_Report + run + () +
    +
    + void + setExceptions + (mixed $exceptions) +
    +
    + void + setHtml + (mixed $html) +
    +
    + void + setJson + (mixed $json) +
    +
    +
    +
    + + +
    +
    Variables
    + +
    + +
    + +
    + + boolean + $scanKeys + = false (line 99) + +
    + + +

    Scan keys switch

    +

    Enabling this property will cause the monitor to scan both the key and the value of variables

    +
      +
    • access: public
    • +
    + + + + + +
    + +
    +
    + + +
    +
    Methods
    + +
    + + + +
    + +
    + Constructor __construct (line 175) +
    + + +

    Constructor

    +
      +
    • access: public
    • +
    + +
    + void + + __construct + + ( $request, IDS_Init $init, [ $tags = null]) +
    + +
      +
    • + array + $request: array to scan
    • +
    • + object + $init: instance of IDS_Init
    • +
    • + array + $tags: list of tags to which filters should be applied
    • +
    + + +
    + +
    + +
    + addHtml (line 589) +
    + + +

    Adds a value to the html array

    +
      +
    • since: 0.5
    • +
    • access: public
    • +
    + +
    + void + + addHtml + + ( $value) +
    + +
      +
    • + + $value
    • +
    + + +
    + +
    + +
    + addJson (line 630) +
    + + +

    Adds a value to the json array

    +
      +
    • since: 0.5.3
    • +
    • access: public
    • +
    + +
    + void + + addJson + + ( $value) +
    + +
      +
    • + + $value
    • +
    + + +
    + +
    + +
    + getExceptions (line 560) +
    + + +

    Returns exception array

    +
      +
    • access: public
    • +
    + +
    + array + + getExceptions + + () +
    + + + +
    + +
    + +
    + getHtml (line 601) +
    + + +

    Returns html array

    +
      +
    • return: the fields that contain allowed html
    • +
    • since: 0.5
    • +
    • access: public
    • +
    + +
    + array + + getHtml + + () +
    + + + +
    + +
    + +
    + getJson (line 642) +
    + + +

    Returns json array

    +
      +
    • return: the fields that contain json
    • +
    • since: 0.5.3
    • +
    • access: public
    • +
    + +
    + array + + getJson + + () +
    + + + +
    + +
    + +
    + getReport (line 664) +
    + + +

    Returns report object providing various functions to work with detected results. Also the centrifuge data is being set as property of the report object.

    +
      +
    • access: public
    • +
    + +
    + object IDS_Report + + getReport + + () +
    + + + +
    + +
    + +
    + getStorage (line 652) +
    + + +

    Returns storage container

    +
      +
    • access: public
    • +
    + +
    + array + + getStorage + + () +
    + + + +
    + +
    + +
    + run (line 233) +
    + + +

    Starts the scan mechanism

    +
      +
    • access: public
    • +
    + +
    + object IDS_Report + + run + + () +
    + + + +
    + +
    + +
    + setExceptions (line 546) +
    + + +

    Sets exception array

    +
      +
    • access: public
    • +
    + +
    + void + + setExceptions + + (mixed $exceptions) +
    + +
      +
    • + mixed + $exceptions: the thrown exceptions
    • +
    + + +
    + +
    + +
    + setHtml (line 573) +
    + + +

    Sets html array

    +
      +
    • since: 0.5
    • +
    • access: public
    • +
    + +
    + void + + setHtml + + (mixed $html) +
    + +
      +
    • + mixed + $html: the fields containing html
    • +
    + + +
    + +
    + +
    + setJson (line 614) +
    + + +

    Sets json array

    +
      +
    • since: 0.5.3
    • +
    • access: public
    • +
    + +
    + void + + setJson + + (mixed $json) +
    + +
      +
    • + mixed + $json: the fields containing json
    • +
    + + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:50 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Report.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Report.html new file mode 100644 index 0000000..4377109 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/IDS_Report.html @@ -0,0 +1,651 @@ + + + + + + Docs For Class IDS_Report + + + + +
    +

    Class IDS_Report

    + + +
    +
    Description
    + +
    +

    + Implements interfaces: +

      +
    • Countable (internal interface)
    • IteratorAggregate (internal interface)
    +

    + +

    PHPIDS report object

    +

    The report objects collects a number of events and thereby presents the detected results. It provides a convenient API to work with the results.

    Note that this class implements Countable, IteratorAggregate and a __toString() method

    + +

    + Located in /Report.php (line 53) +

    + + +
    
    +	
    +			
    +
    + + + + +
    +
    Variable Summary
    + +
    +
    +
    + array + $centrifuge +
    +
    + array + $events +
    +
    + integer + $impact +
    +
    + array + $tags +
    +
    +
    +
    + + +
    +
    Method Summary
    + +
    +
    + +
    + void + __construct + ([ $events = null]) +
    +
    + object + addEvent + (IDS_Event $event) +
    +
    + void + clear + () +
    +
    + integer + count + () +
    +
    + array/null + getCentrifuge + () +
    +
    + mixed + getEvent + (scalar $name) +
    +
    + integer + getImpact + () +
    +
    + Iterator + getIterator + () +
    +
    + array + getTags + () +
    +
    + boolean + hasEvent + (scalar $name) +
    +
    + boolean + isEmpty + () +
    +
    + boolean + setCentrifuge + ([array $centrifuge = array()]) +
    +
    + string + __toString + () +
    +
    +
    +
    + + +
    +
    Variables
    + +
    + +
    + +
    + + array + $centrifuge + = array() (line 91) + +
    + + +

    Centrifuge data

    +

    This variable - initiated as an empty array - carries all information about the centrifuge data if available

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + array + $events + = array() (line 61) + +
    + + +

    Event container

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + integer + $impact + = 0 (line 81) + +
    + + +

    Impact level

    +

    The impact level is calculated on demand by adding the results of the event objects on IDS_Report->getImpact()

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    + +
    + + array + $tags + = array() (line 71) + +
    + + +

    List of affected tags

    +

    This list of tags is collected from the collected event objects on demand when IDS_Report->getTags() is called

    +
      +
    • access: protected
    • +
    + + + + + +
    + +
    +
    + + +
    +
    Methods
    + +
    + + + +
    + +
    + Constructor __construct (line 100) +
    + + +

    Constructor

    +
      +
    • access: public
    • +
    + +
    + void + + __construct + + ([ $events = null]) +
    + +
      +
    • + array + $events: the events the report should include
    • +
    + + +
    + +
    + +
    + addEvent (line 116) +
    + + +

    Adds an IDS_Event object to the report

    +
      +
    • access: public
    • +
    + +
    + object + + addEvent + + (IDS_Event $event) +
    + +
      +
    • + object + $event: IDS_Event
    • +
    + + +
    + +
    + +
    + clear (line 248) +
    + + +

    Clears calculated/collected values

    +
      +
    • access: protected
    • +
    + +
    + void + + clear + + () +
    + + + +
    + +
    + +
    + count (line 214) +
    + + +

    Returns total amount of events

    +
      +
    • access: public
    • +
    + +
    + integer + + count + + () +
    + + +
    +
    Implementation of:
    +
    +
    Countable::count
    +
    + +
    + +
    + +
    + getCentrifuge (line 260) +
    + + +

    This method returns the centrifuge property or null if not filled with data

    +
      +
    • access: public
    • +
    + +
    + array/null + + getCentrifuge + + () +
    + + + +
    + +
    + +
    + getEvent (line 135) +
    + + +

    Get event by name

    +

    In most cases an event is identified by the key of the variable that contained maliciously appearing content

    +
      +
    • return: IDS_Event object or false if the event does not exist
    • +
    • throws: InvalidArgumentException if argument is invalid
    • +
    • access: public
    • +
    + +
    + mixed + + getEvent + + (scalar $name) +
    + +
      +
    • + scalar + $name: the event name
    • +
    + + +
    + +
    + +
    + getImpact (line 179) +
    + + +

    Returns total impact

    +

    Each stored IDS_Event object and its IDS_Filter sub-object are called to calculate the overall impact level of this request

    +
      +
    • access: public
    • +
    + +
    + integer + + getImpact + + () +
    + + + +
    + +
    + +
    + getIterator (line 228) +
    + + +

    Return iterator object

    +

    In order to provide the possibility to directly iterate over the IDS_Event object the IteratorAggregate is implemented. One can easily use foreach() to iterate through all stored IDS_Event objects.

    +
      +
    • access: public
    • +
    + +
    + Iterator + + getIterator + + () +
    + + +
    +
    Implementation of:
    +
    +
    IteratorAggregate::getIterator
    +
    + +
    + +
    + +
    + getTags (line 155) +
    + + +

    Returns list of affected tags

    +
      +
    • access: public
    • +
    + +
    + array + + getTags + + () +
    + + + +
    + +
    + +
    + hasEvent (line 200) +
    + + +

    Checks if a specific event with given name exists

    +
      +
    • throws: InvalidArgumentException if argument is illegal
    • +
    • access: public
    • +
    + +
    + boolean + + hasEvent + + (scalar $name) +
    + +
      +
    • + scalar + $name: the event name
    • +
    + + +
    + +
    + +
    + isEmpty (line 238) +
    + + +

    Checks if any events are registered

    +
      +
    • access: public
    • +
    + +
    + boolean + + isEmpty + + () +
    + + + +
    + +
    + +
    + setCentrifuge (line 275) +
    + + +

    This method sets the centrifuge property

    +
      +
    • return: true is arguments were valid
    • +
    • throws: InvalidArgumentException if argument is illegal
    • +
    • access: public
    • +
    + +
    + boolean + + setCentrifuge + + ([array $centrifuge = array()]) +
    + +
      +
    • + array + $centrifuge: the centrifuge data
    • +
    + + +
    + +
    + +
    + __toString (line 289) +
    + + +

    Directly outputs all available information

    +
      +
    • access: public
    • +
    + +
    + string + + __toString + + () +
    + + + +
    + +
    +
    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:52 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Database.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Database.php.html new file mode 100644 index 0000000..797acbf --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Database.php.html @@ -0,0 +1,105 @@ + + + + + + Docs for page Database.php + + + + +
    +

    /Caching/Database.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Caching_Database + + Database caching wrapper +
    +
    +
    + + +
    +
    Includes
    + +
    + +
    + +
    + + require_once + ('IDS/Caching/Interface.php') + (line 34) + +
    + + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    +
    + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:42 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Factory.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Factory.php.html new file mode 100644 index 0000000..4ce0494 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Factory.php.html @@ -0,0 +1,69 @@ + + + + + + Docs for page Factory.php + + + + +
    +

    /Caching/Factory.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Caching + + Caching factory +
    +
    +
    + + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:44 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---File.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---File.php.html new file mode 100644 index 0000000..985e683 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---File.php.html @@ -0,0 +1,105 @@ + + + + + + Docs for page File.php + + + + +
    +

    /Caching/File.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Caching_File + + File caching wrapper +
    +
    +
    + + +
    +
    Includes
    + +
    + +
    + +
    + + require_once + ('IDS/Caching/Interface.php') + (line 34) + +
    + + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    +
    + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:44 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Interface.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Interface.php.html new file mode 100644 index 0000000..45c0a0c --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Interface.php.html @@ -0,0 +1,69 @@ + + + + + + Docs for page Interface.php + + + + +
    +

    /Caching/Interface.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Caching_Interface + + Caching wrapper interface +
    +
    +
    + + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:48 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Memcached.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Memcached.php.html new file mode 100644 index 0000000..975a8b1 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Memcached.php.html @@ -0,0 +1,105 @@ + + + + + + Docs for page Memcached.php + + + + +
    +

    /Caching/Memcached.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Caching_Memcached + + File caching wrapper +
    +
    +
    + + +
    +
    Includes
    + +
    + +
    + +
    + + require_once + ('IDS/Caching/Interface.php') + (line 34) + +
    + + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    +
    + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:50 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Session.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Session.php.html new file mode 100644 index 0000000..0dbb168 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Caching---Session.php.html @@ -0,0 +1,105 @@ + + + + + + Docs for page Session.php + + + + +
    +

    /Caching/Session.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Caching_Session + + File caching wrapper +
    +
    +
    + + +
    +
    Includes
    + +
    + +
    + +
    + + require_once + ('IDS/Caching/Interface.php') + (line 34) + +
    + + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    +
    + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:53 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Converter.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Converter.php.html new file mode 100644 index 0000000..bb9109f --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Converter.php.html @@ -0,0 +1,69 @@ + + + + + + Docs for page Converter.php + + + + +
    +

    /Converter.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Converter + + PHPIDS specific utility class to convert charsets manually +
    +
    +
    + + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:41 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Event.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Event.php.html new file mode 100644 index 0000000..a5ce4f2 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Event.php.html @@ -0,0 +1,69 @@ + + + + + + Docs for page Event.php + + + + +
    +

    /Event.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Event + + PHPIDS event object +
    +
    +
    + + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:44 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Filter.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Filter.php.html new file mode 100644 index 0000000..cefa176 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Filter.php.html @@ -0,0 +1,62 @@ + + + + + + Docs for page Filter.php + + + + +
    +

    /Filter/Filter.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS Requirements: PHP5, SimpleXML

    +

    Copyright (c) 2007 PHPIDS group (http://php-ids.org)

    This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the license.

    This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

    + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Filter + + PHPIDS Filter object +
    +
    +
    + + + + + +

    + Documentation generated on Mon, 24 Sep 2007 20:06:51 +0200 by phpDocumentor 1.4.0 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Storage---Abstract.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Storage---Abstract.php.html new file mode 100644 index 0000000..a5a0298 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Storage---Abstract.php.html @@ -0,0 +1,62 @@ + + + + + + Docs for page Abstract.php + + + + +
    +

    /Filter/Storage/Abstract.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2007 PHPIDS (http://php-ids.org)

    This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the license.

    This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

    + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Filter_Storage_Abstract + + Abstract Filter Storage +
    +
    +
    + + + + + +

    + Documentation generated on Thu, 13 Sep 2007 22:36:58 +0200 by phpDocumentor 1.4.0 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Storage.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Storage.php.html new file mode 100644 index 0000000..0e69ab5 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter---Storage.php.html @@ -0,0 +1,69 @@ + + + + + + Docs for page Storage.php + + + + +
    +

    /Filter/Storage.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Filter_Storage + + Filter Storage +
    +
    +
    + + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:53 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter.php.html new file mode 100644 index 0000000..b330a3c --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Filter.php.html @@ -0,0 +1,69 @@ + + + + + + Docs for page Filter.php + + + + +
    +

    /Filter.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Filter + + PHPIDS Filter object +
    +
    +
    + + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:45 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Init.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Init.php.html new file mode 100644 index 0000000..cc04ef9 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Init.php.html @@ -0,0 +1,69 @@ + + + + + + Docs for page Init.php + + + + +
    +

    /Init.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Init + + Framework initiation +
    +
    +
    + + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:48 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Composite.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Composite.php.html new file mode 100644 index 0000000..7a13cbc --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Composite.php.html @@ -0,0 +1,105 @@ + + + + + + Docs for page Composite.php + + + + +
    +

    /Log/Composite.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Log_Composite + + Log Composite +
    +
    +
    + + +
    +
    Includes
    + +
    + +
    + +
    + + require_once + ('IDS/Log/Interface.php') + (line 34) + +
    + + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    +
    + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:40 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Database.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Database.php.html new file mode 100644 index 0000000..b182956 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Database.php.html @@ -0,0 +1,105 @@ + + + + + + Docs for page Database.php + + + + +
    +

    /Log/Database.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Log_Database + + Database logging wrapper +
    +
    +
    + + +
    +
    Includes
    + +
    + +
    + +
    + + require_once + ('IDS/Log/Interface.php') + (line 34) + +
    + + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    +
    + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:42 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Email.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Email.php.html new file mode 100644 index 0000000..b0d7696 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Email.php.html @@ -0,0 +1,105 @@ + + + + + + Docs for page Email.php + + + + +
    +

    /Log/Email.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Log_Email + + Email logging wrapper +
    +
    +
    + + +
    +
    Includes
    + +
    + +
    + +
    + + require_once + ('IDS/Log/Interface.php') + (line 34) + +
    + + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    +
    + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:43 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---File.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---File.php.html new file mode 100644 index 0000000..b0ff7c3 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---File.php.html @@ -0,0 +1,105 @@ + + + + + + Docs for page File.php + + + + +
    +

    /Log/File.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Log_File + + File logging wrapper +
    +
    +
    + + +
    +
    Includes
    + +
    + +
    + +
    + + require_once + ('IDS/Log/Interface.php') + (line 34) + +
    + + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    +
    + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:44 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Interface.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Interface.php.html new file mode 100644 index 0000000..e54d676 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Log---Interface.php.html @@ -0,0 +1,69 @@ + + + + + + Docs for page Interface.php + + + + +
    +

    /Log/Interface.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Log_Interface + + Interface for logging wrappers +
    +
    +
    + + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:48 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Monitor.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Monitor.php.html new file mode 100644 index 0000000..d8f7d50 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Monitor.php.html @@ -0,0 +1,69 @@ + + + + + + Docs for page Monitor.php + + + + +
    +

    /Monitor.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Monitor + + Monitoring engine +
    +
    +
    + + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:50 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Report.php.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Report.php.html new file mode 100644 index 0000000..6ec5d8f --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/PHPIDS/_Report.php.html @@ -0,0 +1,69 @@ + + + + + + Docs for page Report.php + + + + +
    +

    /Report.php

    + + +
    +
    Description
    + +
    + +

    PHPIDS

    +

    Requirements: PHP5, SimpleXML

    Copyright (c) 2008 PHPIDS group (http://php-ids.org)

    PHPIDS is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License, or (at your option) any later version.

    PHPIDS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.

    PHP version 5.1.6+

    + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + IDS_Report + + PHPIDS report object +
    +
    +
    + + + + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:52 +0100 by phpDocumentor 1.4.2 +

    +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/blank.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/blank.html new file mode 100644 index 0000000..fafcaa6 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/blank.html @@ -0,0 +1,13 @@ + + + Generated Documentation + + + + +

    Generated Documentation

    +Welcome to default!
    +
    +This documentation was generated by phpDocumentor v1.4.2
    + + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/classtrees_PHPIDS.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/classtrees_PHPIDS.html new file mode 100644 index 0000000..f884c5e --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/classtrees_PHPIDS.html @@ -0,0 +1,92 @@ + + + + + + + + + + + + +

    + +

    +

    Root interface IDS_Caching_Interface

    + + +

    Root interface IDS_Log_Interface

    + + +

    Root class IDS_Caching

    + + +

    Root class IDS_Caching_Database

    + + +

    Root class IDS_Caching_File

    + + +

    Root class IDS_Caching_Memcached

    + + +

    Root class IDS_Caching_Session

    + + +

    Root class IDS_Converter

    + + +

    Root class IDS_Event

    + + +

    Root class IDS_Filter

    + + +

    Root class IDS_Filter_Storage

    + + +

    Root class IDS_Init

    + + +

    Root class IDS_Log_Composite

    + + +

    Root class IDS_Log_Database

    + + +

    Root class IDS_Log_Email

    + + +

    Root class IDS_Log_File

    + + +

    Root class IDS_Monitor

    + + +

    Root class IDS_Report

    + + +

    + Documentation generated on Mon, 22 Dec 2008 13:36:38 +0100 by phpDocumentor 1.4.2 +

    + + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/elementindex.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/elementindex.html new file mode 100644 index 0000000..7c0c521 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/elementindex.html @@ -0,0 +1,10897 @@ + + + + + + + + + + + +

    Full index

    +

    Package indexes

    + +
    +
    + a + b + c + d + e + f + g + h + i + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + _ +
    + + +
    +
    a
    + +
    +
    +
    +
    + $accessed +
    +
    + +
    +
    + $addParam +
    +
    + +
    +
    + $aliases +
    +
    + +
    List of aliases for the directive, e.g. array(new HTMLPurifier_ConfigSchema_Interchange_Id('Ns', 'Dir'))).
    +
    +
    + $aliases +
    +
    + +
    List of aliases for this doctype
    +
    +
    + $aliases +
    +
    + +
    Lookup table of aliases to real doctype names
    +
    +
    + $aliases +
    +
    + +
    Hash of value aliases, i.e. values that are equivalent.
    +
    +
    + $aliases +
    +
    + +
    +
    + $allow +
    +
    + +
    +
    + $allowed +
    +
    + +
    Lookup table of allowed scalar values, e.g. array('allowed' => true).
    +
    +
    + $allowed +
    +
    + +
    Lookup table of allowed values of the element, bool true if all allowed.
    +
    +
    + $allowedParam +
    +
    + +
    +
    + $allowedUnits +
    +
    + +
    Lookup array of units recognized by CSS 2.1
    +
    +
    + $allow_empty +
    +
    + +
    +
    + $allow_empty +
    +
    + +
    +
    + $allow_empty +
    +
    + +
    +
    + $allow_empty +
    +
    + +
    Bool that indicates whether or not an empty array of children is okay
    +
    +
    + $allow_empty +
    +
    + +
    +
    + $allow_empty +
    +
    + +
    +
    + $allow_empty +
    +
    + +
    +
    + $allow_null +
    +
    + +
    Is null allowed? Has no effect for mixed type.
    +
    +
    + $armor +
    +
    + +
    Lookup array of processing that this token is exempt from.
    +
    +
    + $attr +
    +
    + +
    Associative array of attribute name to HTMLPurifier_AttrDef
    +
    +
    + $attr +
    +
    + +
    Associative array of the tag's attributes.
    +
    +
    + $attr +
    +
    + +
    Name of boolean attribute that is trigger
    +
    +
    + $attr +
    +
    + +
    +
    + $attr +
    +
    + +
    Name of attribute to transform from
    +
    +
    + $attrCollections +
    +
    + +
    < Instance of HTMLPurifier_ContentSets
    +
    +
    + $attrTypes +
    +
    + +
    Instance of HTMLPurifier_AttrTypes
    +
    +
    + $attr_collections +
    +
    + +
    +
    + $attr_collections +
    +
    + +
    +
    + $attr_collections +
    +
    + +
    +
    + $attr_collections +
    +
    + +
    Associative array of attribute collection names to attribute
    +
    +
    + $attr_collections +
    +
    + +
    +
    + $attr_collections +
    +
    + +
    +
    + $attr_transform_post +
    +
    + +
    Indexed list of tag's HTMLPurifier_AttrTransform to be done after validation
    +
    +
    + $attr_transform_pre +
    +
    + +
    Indexed list of tag's HTMLPurifier_AttrTransform to be done before validation
    +
    +
    + $autoFinalize +
    +
    + +
    Bool indicator whether or not to automatically finalize
    +
    +
    + add +
    +
    + +
    Add an ID to the lookup table.
    +
    +
    + add +
    +
    + +
    +
    + add +
    +
    + +
    +
    + add +
    +
    + +
    +
    + add +
    +
    + +
    +
    + add +
    +
    + +
    Defines a directive for configuration
    +
    +
    + add +
    +
    + +
    +
    + add +
    +
    + +
    Adds a definition object to the cache
    +
    +
    + addAlias +
    +
    + +
    Defines a directive alias for backwards compatibility
    +
    +
    + addAllowedValues +
    +
    + +
    Defines a set of allowed values for a directive.
    +
    +
    + addAttribute +
    +
    + +
    Adds a custom attribute to a pre-existing element
    +
    +
    + addBlankElement +
    +
    + +
    Adds a blank element to your HTML definition, for overriding
    +
    +
    + addBlankElement +
    +
    + +
    Convenience function that creates a totally blank, non-standalone element.
    +
    +
    + addDecorator +
    +
    + +
    Registers a decorator to add to all new cache objects
    +
    +
    + addDirective +
    +
    + +
    Adds a directive array to $directives
    +
    +
    + addElement +
    +
    + +
    Convenience function that sets up a new element
    +
    +
    + addElement +
    +
    + +
    Adds a custom element to your HTML definition
    +
    +
    + addElementToContentSet +
    +
    + +
    Convenience function that registers an element to a content set
    +
    +
    + addError +
    +
    + +
    +
    + addEvent +
    +
    + +
    Adds an IDS_Event object to the report
    +
    +
    + addFilter +
    +
    + +
    Adds a filter
    +
    +
    + addFilter +
    +
    +
    HTMLPurifier::addFilter() in HTMLPurifier.php
    +
    Adds a filter to process the output. First come first serve
    +
    +
    + addFilter +
    +
    + +
    +
    + addHtml +
    +
    +
    IDS_Monitor::addHtml() in Monitor.php
    +
    Adds a value to the html array
    +
    +
    + addJson +
    +
    +
    IDS_Monitor::addJson() in Monitor.php
    +
    Adds a value to the json array
    +
    +
    + addLogger +
    +
    + +
    Registers a new logging wrapper
    +
    +
    + addModule +
    +
    + +
    Adds a module to the current doctype by first registering it,
    +
    +
    + addNamespace +
    +
    + +
    Adds a namespace array to $namespaces
    +
    +
    + addNamespace +
    +
    + +
    Defines a namespace for directives to be put into.
    +
    +
    + addPrefix +
    +
    + +
    Adds a class prefix that registerModule() will use to resolve a
    +
    +
    + addValueAliases +
    +
    + +
    Defines a directive value alias.
    +
    +
    + AFTER_BODY +
    +
    + +
    +
    + AFTER_HEAD +
    +
    + +
    +
    + AFTR_FRAME +
    +
    + +
    +
    + ALIST +
    +
    + +
    +
    + allowsElement +
    +
    + +
    Tests if the context node allows a certain element
    +
    +
    + assertAlnum +
    +
    + +
    +
    + assertIsArray +
    +
    + +
    +
    + assertIsBool +
    +
    + +
    +
    + assertIsLookup +
    +
    + +
    +
    + assertIsString +
    +
    + +
    +
    + assertNotEmpty +
    +
    + +
    +
    + assertNotNull +
    +
    + +
    +
    + ATTR +
    +
    + +
    +
    + autoFinalize +
    +
    + +
    Finalizes configuration only if auto finalize is on and not
    +
    +
    + autoload +
    +
    + +
    Autoload function for HTML Purifier
    +
    +
    + AttrCollections.php +
    +
    +
    AttrCollections.php in AttrCollections.php
    +
    +
    + AlphaValue.php +
    +
    +
    AlphaValue.php in AlphaValue.php
    +
    +
    + AttrDef.php +
    +
    +
    AttrDef.php in AttrDef.php
    +
    +
    + AttrTransform.php +
    +
    +
    AttrTransform.php in AttrTransform.php
    +
    +
    + AttrTypes.php +
    +
    +
    AttrTypes.php in AttrTypes.php
    +
    +
    + AttrValidator.php +
    +
    +
    AttrValidator.php in AttrValidator.php
    +
    +
    + AutoParagraph.php +
    +
    +
    AutoParagraph.php in AutoParagraph.php
    +
    +
    + +
    +
    b
    + +
    +
    +
    +
    + $base +
    +
    + +
    HTMLPurifier_URI object of the base specified at %URI.Base
    +
    +
    + $base +
    +
    + +
    +
    + $basePathStack +
    +
    + +
    +
    + $blacklist +
    +
    + +
    +
    + $block +
    +
    + +
    Instance of the definition object to use when block.
    +
    +
    + $browsable +
    +
    + +
    +
    + $browsable +
    +
    + +
    +
    + $browsable +
    +
    + +
    +
    + $browsable +
    +
    + +
    +
    + $browsable +
    +
    + +
    Whether or not URIs of this schem are locatable by a browser http and ftp are accessible, while mailto and news are not.
    +
    +
    + $browsable +
    +
    + +
    +
    + backward +
    +
    + +
    Iterator function, starts with the previous token and continues until you reach the beginning of input tokens.
    +
    +
    + BEFOR_HEAD +
    +
    + +
    +
    + BOOL +
    +
    + +
    +
    + build +
    +
    + +
    +
    + build +
    +
    + +
    Builds an interchange object based on a hash.
    +
    +
    + build +
    +
    + +
    Builds an IDAccumulator, also initializing the default blacklist
    +
    +
    + build +
    +
    + +
    +
    + buildDirective +
    +
    + +
    +
    + buildDirective +
    +
    + +
    +
    + buildFromDirectory +
    +
    + +
    +
    + buildNamespace +
    +
    + +
    +
    + buildNamespace +
    +
    + +
    +
    + Background.php +
    +
    +
    Background.php in Background.php
    +
    +
    + BackgroundPosition.php +
    +
    +
    BackgroundPosition.php in BackgroundPosition.php
    +
    +
    + Border.php +
    +
    +
    Border.php in Border.php
    +
    +
    + Bool.php +
    +
    +
    Bool.php in Bool.php
    +
    +
    + Background.php +
    +
    +
    Background.php in Background.php
    +
    +
    + BdoDir.php +
    +
    +
    BdoDir.php in BdoDir.php
    +
    +
    + BgColor.php +
    +
    +
    BgColor.php in BgColor.php
    +
    +
    + BoolToCSS.php +
    +
    +
    BoolToCSS.php in BoolToCSS.php
    +
    +
    + Border.php +
    +
    +
    Border.php in Border.php
    +
    +
    + Bootstrap.php +
    +
    +
    Bootstrap.php in Bootstrap.php
    +
    +
    + Bdo.php +
    +
    +
    Bdo.php in Bdo.php
    +
    +
    + +
    +
    c
    + +
    +
    +
    +
    + $cache +
    +
    + +
    Cache object we are decorating
    +
    +
    + $cache +
    +
    + +
    Cache container
    +
    +
    + $cache +
    +
    + +
    Cache of language code information used to load HTMLPurifier_Language objects
    +
    +
    + $caches +
    +
    +
    HTMLPurifier_DefinitionCacheFactory::$caches in DefinitionCacheFactory.php
    +
    +
    + $cacheSettings +
    +
    + +
    Holds caching settings
    +
    +
    + $caseSensitive +
    +
    + +
    Case sensitivity of the matching
    +
    +
    + $case_sensitive +
    +
    + +
    +
    + $case_sensitive +
    +
    + +
    Bool indicating whether or not enumeration is case sensitive.
    +
    +
    + $centrifuge +
    +
    + +
    Centrifuge data
    +
    +
    + $child +
    +
    + +
    HTMLPurifier_ChildDef of this tag.
    +
    +
    + $children +
    +
    + +
    Child ErrorStructs that are from this structure. For example, a TOKEN
    +
    +
    + $class +
    +
    + +
    +
    + $class +
    +
    + +
    +
    + $class +
    +
    + +
    +
    + $class +
    +
    + +
    +
    + $code +
    +
    + +
    ISO 639 language code of language. Prefers shortest possible version
    +
    +
    + $col +
    +
    + +
    < Line number node was on in source document. Null if unknown.
    +
    +
    + $cols +
    +
    + +
    +
    + $compress +
    +
    + +
    Whether or not to compress directive names, clipping them off after a certain amount of letters. False to disable or integer letters before clipping.
    +
    +
    + $conf +
    +
    + +
    Two-level associative array of configuration directives
    +
    +
    + $config +
    +
    + +
    Instances of HTMLPurifier_Config and HTMLPurifier_Context
    +
    +
    + $config +
    +
    + +
    Current instance of HTMLPurifier_Config.
    +
    +
    + $config +
    +
    + +
    Instance of HTMLPurifier_Config, for easy access
    +
    +
    + $config +
    +
    + +
    Configuration for the generator
    +
    +
    + $config +
    +
    +
    IDS_Init::$config in Init.php
    +
    Holds config settings
    +
    +
    + $config +
    +
    +
    HTMLPurifier::$config in HTMLPurifier.php
    +
    Global configuration object
    +
    +
    + $contents +
    +
    + +
    +
    + $contentSets +
    +
    + +
    +
    + $content_model +
    +
    + +
    Abstract string representation of internal ChildDef rules. See HTMLPurifier_ContentSets for how this is parsed and then transformed into an HTMLPurifier_ChildDef.
    +
    +
    + $content_model_type +
    +
    + +
    Value of $child->type, used to determine which ChildDef to use, used in combination with $content_model.
    +
    +
    + $content_sets +
    +
    + +
    Associative array of content set names to content set additions.
    +
    +
    + $content_sets +
    +
    + +
    +
    + $content_sets +
    +
    + +
    +
    + $content_sets +
    +
    + +
    +
    + $content_sets +
    +
    + +
    +
    + $context +
    +
    + +
    +
    + $context +
    +
    + +
    Context-stack to provide easy to read error messages.
    +
    +
    + $context +
    +
    + +
    +
    + $context +
    +
    +
    HTMLPurifier::$context in HTMLPurifier.php
    +
    Resultant HTMLPurifier_Context of last run purification. Is an array of contexts if the last called method was purifyArray().
    +
    +
    + $context +
    +
    + +
    +
    + $context +
    +
    + +
    Current instance of HTMLPurifier_Context.
    +
    +
    + $css +
    +
    + +
    +
    + $css +
    +
    + +
    CSS declarations to add to style, needs trailing semicolon
    +
    +
    + $cssName +
    +
    + +
    +
    + $currentNesting +
    +
    + +
    Reference to CurrentNesting variable in Context. This is an array
    +
    +
    + callbackArmorCommentEntities +
    +
    + +
    Callback function that entity-izes ampersands in comments so that
    +
    +
    + callbackUndoCommentSubst +
    +
    + +
    Callback function for undoing escaping of stray angled brackets
    +
    +
    + CDATA +
    +
    +
    HTML5::CDATA in PH5P.php
    +
    +
    + CDATACallback +
    +
    + +
    Callback function for escapeCDATA() that does the work.
    +
    +
    + CHARACTR +
    +
    +
    HTML5::CHARACTR in PH5P.php
    +
    +
    + checkDefType +
    +
    + +
    Checks if a definition's type jives with the cache's type
    +
    +
    + checkNeeded +
    +
    + +
    This function checks if the HTML environment will work with the Injector: if p tags are not allowed, the Auto-Paragraphing injector should not be enabled.
    +
    +
    + CHILDREN +
    +
    + +
    +
    + cleanCSS +
    +
    + +
    Takes CSS (the stuff found in <style>) and cleans it.
    +
    +
    + cleanup +
    +
    + +
    +
    + cleanup +
    +
    + +
    Clears all expired (older version or revision) objects from cache
    +
    +
    + cleanup +
    +
    + +
    +
    + cleanup +
    +
    + +
    +
    + cleanUTF8 +
    +
    + +
    Cleans a UTF-8 string for well-formedness and SGML validity
    +
    +
    + clear +
    +
    +
    IDS_Report::clear() in Report.php
    +
    Clears calculated/collected values
    +
    +
    + closeHandler +
    +
    + +
    Close tag event handler, interface is defined by PEAR package.
    +
    +
    + COMMENT +
    +
    +
    HTML5::COMMENT in PH5P.php
    +
    +
    + compareTo +
    +
    + +
    Compares two lengths, and returns 1 if greater, -1 if less and 0 if equal.
    +
    +
    + confiscateAttr +
    +
    + +
    Retrieves and removes an attribute
    +
    +
    + convert +
    +
    + +
    Converts a length object of one unit into another unit.
    +
    +
    + convertConcatenations +
    +
    + +
    Converts basic concatenations
    +
    +
    + convertEntities +
    +
    + +
    Converts from hex/dec entities
    +
    +
    + Converter.php +
    +
    +
    Converter.php in Converter.php
    +
    +
    + convertFromCommented +
    +
    + +
    Check for comments and erases them if available
    +
    +
    + convertFromControlChars +
    +
    + +
    Detects nullbytes and controls chars via ord()
    +
    +
    + convertFromJSCharcode +
    +
    + +
    Checks for common charcode pattern and decodes them
    +
    +
    + convertFromJSUnicode +
    +
    + +
    This method converts JS unicode code points to regular characters
    +
    +
    + convertFromNestedBase64 +
    +
    + +
    This method matches and translates base64 strings and fragments used in data URIs
    +
    +
    + convertFromNewLines +
    +
    + +
    Strip newlines
    +
    +
    + convertFromOutOfRangeChars +
    +
    + +
    Detects nullbytes and controls chars via ord()
    +
    +
    + convertFromProprietaryEncodings +
    +
    + +
    This method collects and decodes proprietary encoding types
    +
    +
    + convertFromSQLHex +
    +
    + +
    Converts SQLHEX to plain text
    +
    +
    + convertFromSQLKeywords +
    +
    + +
    Converts basic SQL keywords and obfuscations
    +
    +
    + convertFromUTF7 +
    +
    + +
    Converts relevant UTF-7 tags to UTF-8
    +
    +
    + convertFromUTF8 +
    +
    + +
    Converts a string from UTF-8 based on configuration.
    +
    +
    + convertFromXML +
    +
    + +
    Strip XML patterns
    +
    +
    + convertJSRegexModifiers +
    +
    + +
    Eliminate JS regex modifiers
    +
    +
    + convertQuotes +
    +
    + +
    Normalize quotes
    +
    +
    + convertToASCIIDumbLossless +
    +
    + +
    Lossless (character-wise) conversion of HTML to ASCII
    +
    +
    + convertToLookup +
    +
    + +
    Converts a string list of elements separated by pipes into a lookup array.
    +
    +
    + convertToUTF8 +
    +
    + +
    Converts a string to UTF-8 based on configuration.
    +
    +
    + copy +
    +
    + +
    +
    + copy +
    +
    + +
    +
    + copy +
    +
    + +
    Cross-compatible clone substitute
    +
    +
    + count +
    +
    +
    IDS_Report::count() in Report.php
    +
    Returns total amount of events
    +
    +
    + count +
    +
    +
    IDS_Event::count() in Event.php
    +
    Returns number of filters
    +
    +
    + create +
    +
    + +
    Retrieves or sets the default Lexer as a Prototype Factory.
    +
    +
    + create +
    +
    + +
    Low-level factory constructor for creating new standalone element defs
    +
    +
    + create +
    +
    + +
    Creates a language object, handles class fallbacks
    +
    +
    + create +
    +
    +
    HTMLPurifier_DefinitionCacheFactory::create() in DefinitionCacheFactory.php
    +
    Factory method that creates a cache object based on configuration
    +
    +
    + create +
    +
    + +
    Convenience constructor that creates a config object based on a mixed var
    +
    +
    + createComment +
    +
    + +
    Creates a HTMLPurifier_Token_Comment.
    +
    +
    + createDefault +
    +
    + +
    Convenience constructor that creates a default configuration object.
    +
    +
    + createEmpty +
    +
    + +
    Creates a HTMLPurifier_Token_Empty.
    +
    +
    + createEnd +
    +
    + +
    Creates a HTMLPurifier_Token_End.
    +
    +
    + createStart +
    +
    + +
    Creates a HTMLPurifier_Token_Start.
    +
    +
    + createText +
    +
    + +
    Creates a HTMLPurifier_Token_Text.
    +
    +
    + CSSPROP +
    +
    + +
    +
    + current +
    +
    + +
    Initializes the iterator at the current position. Use in a do {} while; loop to force the _forward and _backward functions to start at the current location.
    +
    +
    + Composite.php +
    +
    +
    Composite.php in Composite.php
    +
    +
    + Color.php +
    +
    +
    Color.php in Color.php
    +
    +
    + Composite.php +
    +
    +
    Composite.php in Composite.php
    +
    +
    + CSS.php +
    +
    +
    CSS.php in CSS.php
    +
    +
    + Color.php +
    +
    +
    Color.php in Color.php
    +
    +
    + Chameleon.php +
    +
    +
    Chameleon.php in Chameleon.php
    +
    +
    + Custom.php +
    +
    +
    Custom.php in Custom.php
    +
    +
    + ChildDef.php +
    +
    +
    ChildDef.php in ChildDef.php
    +
    +
    + Config.php +
    +
    +
    Config.php in Config.php
    +
    +
    + ConfigDef.php +
    +
    +
    ConfigDef.php in ConfigDef.php
    +
    +
    + ConfigSchema.php +
    +
    +
    ConfigSchema.php in ConfigSchema.php
    +
    +
    + ConfigSchema.php +
    +
    +
    ConfigSchema.php in ConfigSchema.php
    +
    +
    + ContentSets.php +
    +
    +
    ContentSets.php in ContentSets.php
    +
    +
    + Context.php +
    +
    +
    Context.php in Context.php
    +
    +
    + CSSDefinition.php +
    +
    +
    CSSDefinition.php in CSSDefinition.php
    +
    +
    + Cleanup.php +
    +
    +
    Cleanup.php in Cleanup.php
    +
    +
    + CommonAttributes.php +
    +
    +
    CommonAttributes.php in CommonAttributes.php
    +
    +
    + ConfigForm.php +
    +
    +
    ConfigForm.php in ConfigForm.php
    +
    +
    + CSSDefinition.php +
    +
    +
    CSSDefinition.php in CSSDefinition.php
    +
    +
    + Composite.php +
    +
    +
    Composite.php in Composite.php
    +
    +
    + Core.php +
    +
    +
    Core.php in Core.php
    +
    +
    + Comment.php +
    +
    +
    Comment.php in Comment.php
    +
    +
    + +
    +
    d
    + +
    +
    +
    +
    + $data +
    +
    + +
    < PCDATA tag name compatible with DTD.
    +
    +
    + $data +
    +
    + +
    +
    + $decorators +
    +
    + +
    +
    + $def +
    +
    + +
    +
    + $def +
    +
    + +
    +
    + $def +
    +
    + +
    +
    + $def +
    +
    + +
    Reference HTMLPurifier_ConfigSchema for value checking
    +
    +
    + $def +
    +
    + +
    Instance of HTMLPurifier_HTMLDefinition, for easy access
    +
    +
    + $default +
    +
    + +
    +
    + $default +
    +
    + +
    Default value, e.g. 3 or 'DefaultVal'.
    +
    +
    + $defaultLevel +
    +
    + +
    +
    + $defaultLevel +
    +
    + +
    +
    + $defaultLevel +
    +
    + +
    +
    + $defaultLevel +
    +
    + +
    Default level to place all fixes in. Disabled by default
    +
    +
    + $defaultLevel +
    +
    + +
    +
    + $defaultLevel +
    +
    + +
    +
    + $defaults +
    +
    + +
    Defaults of the directives and namespaces.
    +
    +
    + $defaultScheme +
    +
    + +
    Name of default scheme based on %URI.DefaultScheme and %URI.Base
    +
    +
    + $default_port +
    +
    + +
    +
    + $default_port +
    +
    + +
    +
    + $default_port +
    +
    + +
    +
    + $default_port +
    +
    + +
    +
    + $default_port +
    +
    + +
    Scheme's default port (integer)
    +
    +
    + $defines_child_def +
    +
    + +
    Boolean flag that indicates whether or not getChildDef is implemented.
    +
    +
    + $defines_child_def +
    +
    + +
    +
    + $defines_child_def +
    +
    + +
    +
    + $definitions +
    +
    + +
    Indexed array of definitions
    +
    +
    + $definitions +
    +
    + +
    +
    + $defs +
    +
    + +
    List of HTMLPurifier_AttrDef objects that may process strings
    +
    +
    + $deprecatedUse +
    +
    + +
    ID of directive that supercedes this old directive, is an instance of HTMLPurifier_ConfigSchema_Interchange_Id. Null if not deprecated.
    +
    +
    + $deprecatedVersion +
    +
    + +
    Version of HTML Purifier this directive was deprecated. Null if not deprecated.
    +
    +
    + $descendants_are_inline +
    +
    + +
    Does the element have a content model (#PCDATA | Inline)*? This is important for chameleon ins and del processing in HTMLPurifier_ChildDef_Chameleon. Dynamically set: modules don't have to worry about this one.
    +
    +
    + $description +
    +
    + +
    HTML description.
    +
    +
    + $description +
    +
    + +
    Filter description
    +
    +
    + $description +
    +
    + +
    HTML description.
    +
    +
    + $dir +
    +
    +
    HTMLPurifier_LanguageFactory::$dir in LanguageFactory.php
    +
    Cached copy of dirname(__FILE__), directory of current file without
    +
    +
    + $directive +
    +
    + +
    +
    + $directives +
    +
    + +
    Array of Directive ID => array(directive info)
    +
    +
    + $doctype +
    +
    + +
    Doctype object
    +
    +
    + $doctype +
    +
    + +
    Instance of current doctype
    +
    +
    + $doctypes +
    +
    + +
    Instance of HTMLPurifier_DoctypeRegistry
    +
    +
    + $doctypes +
    +
    + +
    Hash of doctype names to doctype objects
    +
    +
    + $docURL +
    +
    + +
    +
    + $docURL +
    +
    + +
    Documentation URL, can have fragment tagged on end
    +
    +
    + $dtdPublic +
    +
    + +
    Public DTD identifier
    +
    +
    + $dtdSystem +
    +
    + +
    System DTD identifier
    +
    +
    + $dtd_regex +
    +
    + +
    Allowed child pattern as defined by the DTD
    +
    +
    + Database.php +
    +
    +
    Database.php in Database.php
    +
    +
    + dataHandler +
    +
    + +
    Data event handler, interface is defined by PEAR package.
    +
    +
    + decorate +
    +
    + +
    Lazy decorator function
    +
    +
    + define +
    +
    + +
    +
    + defineAlias +
    +
    + +
    +
    + defineAllowedValues +
    +
    + +
    +
    + defineNamespace +
    +
    + +
    +
    + defineValueAliases +
    +
    + +
    +
    + destroy +
    +
    + +
    Destorys a variable in the context.
    +
    +
    + DIGITAL +
    +
    + +
    +
    + DOCTYPE +
    +
    +
    HTML5::DOCTYPE in PH5P.php
    +
    +
    + doSetup +
    +
    + +
    Constructs the info array. The meat of this class.
    +
    +
    + doSetup +
    +
    + +
    Sets up the definition object into the final form, something
    +
    +
    + doSetup +
    +
    + +
    +
    + doSetup +
    +
    + +
    +
    + doSetupProprietary +
    +
    + +
    +
    + doSetupTricky +
    +
    + +
    +
    + Database.php +
    +
    +
    Database.php in Database.php
    +
    +
    + DenyElementDecorator.php +
    +
    +
    DenyElementDecorator.php in DenyElementDecorator.php
    +
    +
    + Directive.php +
    +
    +
    Directive.php in Directive.php
    +
    +
    + DirectiveAlias.php +
    +
    +
    DirectiveAlias.php in DirectiveAlias.php
    +
    +
    + Directive.php +
    +
    +
    Directive.php in Directive.php
    +
    +
    + Definition.php +
    +
    +
    Definition.php in Definition.php
    +
    +
    + Decorator.php +
    +
    +
    Decorator.php in Decorator.php
    +
    +
    + DefinitionCache.php +
    +
    +
    DefinitionCache.php in DefinitionCache.php
    +
    +
    + DefinitionCacheFactory.php +
    +
    +
    DefinitionCacheFactory.php in DefinitionCacheFactory.php
    +
    +
    + Doctype.php +
    +
    +
    Doctype.php in Doctype.php
    +
    +
    + DoctypeRegistry.php +
    +
    +
    DoctypeRegistry.php in DoctypeRegistry.php
    +
    +
    + DisplayLinkURI.php +
    +
    +
    DisplayLinkURI.php in DisplayLinkURI.php
    +
    +
    + DirectLex.php +
    +
    +
    DirectLex.php in DirectLex.php
    +
    +
    + DOMLex.php +
    +
    +
    DOMLex.php in DOMLex.php
    +
    +
    + DisableExternal.php +
    +
    +
    DisableExternal.php in DisableExternal.php
    +
    +
    + DisableExternalResources.php +
    +
    +
    DisableExternalResources.php in DisableExternalResources.php
    +
    +
    + +
    +
    e
    + +
    +
    +
    +
    + $element +
    +
    + +
    +
    + $elementLookup +
    +
    + +
    Associative array of element name to list of modules that have definitions for the element; this array is dynamically filled.
    +
    +
    + $elements +
    +
    + +
    +
    + $elements +
    +
    + +
    +
    + $elements +
    +
    + +
    Lookup table of allowed elements.
    +
    +
    + $elements +
    +
    + +
    Informally, a list of elements this module changes. Not used in any significant way.
    +
    +
    + $elements +
    +
    + +
    Lookup array of all elements that this definition could possibly allow
    +
    +
    + $embedsResource +
    +
    + +
    +
    + $enumToCSS +
    +
    + +
    Lookup array of attribute values to CSS
    +
    +
    + $error +
    +
    + +
    True if no message file was found for this language, so English is being used instead. Check this if you'd like to notify the user that they've used a non-supported language.
    +
    +
    + $errorNames +
    +
    + +
    Array of localizable error codes
    +
    +
    + $errors +
    +
    + +
    +
    + $errors +
    +
    + +
    Errors registered for this structure.
    +
    +
    + $events +
    +
    +
    IDS_Report::$events in Report.php
    +
    Event container
    +
    +
    + $excludes +
    +
    + +
    Lookup table of tags excluded from all descendants of this tag.
    +
    +
    + $external +
    +
    + +
    List of external projects this directive depends on, e.g. array('CSSTidy').
    +
    +
    + element +
    +
    + +
    Prints a complete element with content inside
    +
    +
    + elementEmpty +
    +
    + +
    +
    + emitToken +
    +
    + +
    +
    + encode +
    +
    + +
    Our replacement for urlencode, it encodes all non-reserved characters, as well as any extra characters that were instructed to be preserved.
    +
    +
    + end +
    +
    + +
    Returns an end teg
    +
    +
    + ENDTAG +
    +
    +
    HTML5::ENDTAG in PH5P.php
    +
    +
    + END_PHASE +
    +
    + +
    +
    + ENGLISH +
    +
    + +
    +
    + EOF +
    +
    +
    HTML5::EOF in PH5P.php
    +
    +
    + error +
    +
    + +
    +
    + error +
    +
    + +
    Throws an exception.
    +
    +
    + error +
    +
    + +
    Emits an error, providing helpful context.
    +
    +
    + errorGeneric +
    +
    + +
    Generic error for if a type didn't work.
    +
    +
    + errorInconsistent +
    +
    + +
    Throws an inconsistency exception.
    +
    +
    + escape +
    +
    + +
    Escapes raw text data.
    +
    +
    + escape +
    +
    + +
    Escapes a string for HTML output.
    +
    +
    + escapeCDATA +
    +
    + +
    Translates CDATA sections into regular sections (through escaping).
    +
    +
    + escapeCommentedCDATA +
    +
    + +
    Special CDATA case that is especially convoluted for <script>
    +
    +
    + escapeHandler +
    +
    + +
    Escaped text handler, interface is defined by PEAR package.
    +
    +
    + evalArray +
    +
    + +
    Evaluates an array PHP code string without array() wrapper
    +
    +
    + evalExpression +
    +
    + +
    +
    + Event.php +
    +
    +
    Event.php in Event.php
    +
    +
    + execute +
    +
    + +
    +
    + execute +
    +
    + +
    Executes the strategy on the tokens.
    +
    +
    + execute +
    +
    + +
    +
    + execute +
    +
    + +
    +
    + execute +
    +
    + +
    +
    + execute +
    +
    + +
    Stores given data into the database
    +
    +
    + execute +
    +
    + +
    Sends the report to registered recipients
    +
    +
    + execute +
    +
    + +
    +
    + execute +
    +
    + +
    Stores given data into a file
    +
    +
    + execute +
    +
    + +
    Interface method
    +
    +
    + execute +
    +
    + +
    Iterates through registered loggers and executes them
    +
    +
    + exists +
    +
    + +
    Checks whether or not the variable exists.
    +
    +
    + expandIdentifiers +
    +
    + +
    Expands all string identifiers in an attribute array by replacing
    +
    +
    + export +
    +
    + +
    +
    + extractBody +
    +
    + +
    Takes a string of HTML (fragment or document) and returns the content
    +
    +
    + Email.php +
    +
    +
    Email.php in Email.php
    +
    +
    + Enum.php +
    +
    +
    Enum.php in Enum.php
    +
    +
    + Email.php +
    +
    +
    Email.php in Email.php
    +
    +
    + EnumToCSS.php +
    +
    +
    EnumToCSS.php in EnumToCSS.php
    +
    +
    + Empty.php +
    +
    +
    Empty.php in Empty.php
    +
    +
    + Exception.php +
    +
    +
    Exception.php in Exception.php
    +
    +
    + ElementDef.php +
    +
    +
    ElementDef.php in ElementDef.php
    +
    +
    + Encoder.php +
    +
    +
    Encoder.php in Encoder.php
    +
    +
    + EntityLookup.php +
    +
    +
    EntityLookup.php in EntityLookup.php
    +
    +
    + EntityParser.php +
    +
    +
    EntityParser.php in EntityParser.php
    +
    +
    + ErrorCollector.php +
    +
    +
    ErrorCollector.php in ErrorCollector.php
    +
    +
    + ErrorStruct.php +
    +
    +
    ErrorStruct.php in ErrorStruct.php
    +
    +
    + Exception.php +
    +
    +
    Exception.php in Exception.php
    +
    +
    + ExtractStyleBlocks.php +
    +
    +
    ExtractStyleBlocks.php in ExtractStyleBlocks.php
    +
    +
    + Edit.php +
    +
    +
    Edit.php in Edit.php
    +
    +
    + en-x-test.php +
    +
    +
    en-x-test.php in en-x-test.php
    +
    +
    + en-x-test.php +
    +
    +
    en-x-test.php in en-x-test.php
    +
    +
    + en-x-testmini.php +
    +
    +
    en-x-testmini.php in en-x-testmini.php
    +
    +
    + en.php +
    +
    +
    en.php in en.php
    +
    +
    + Empty.php +
    +
    +
    Empty.php in Empty.php
    +
    +
    + End.php +
    +
    +
    End.php in End.php
    +
    +
    + +
    +
    f
    + +
    +
    +
    +
    + $fake_elements +
    +
    + +
    +
    + $fallback +
    +
    + +
    Fallback language code
    +
    +
    + $fields +
    +
    + +
    Printers for specific fields
    +
    +
    + $filters +
    +
    +
    IDS_Event::$filters in Event.php
    +
    List of filter objects
    +
    +
    + $filters +
    +
    + +
    +
    + $filterSet +
    +
    + +
    Filter container
    +
    +
    + $finalized +
    +
    + +
    Bool indicator whether or not config is finalized
    +
    +
    + $fixesForLevel +
    +
    + +
    Lists of fixes used by getFixesForLevel(). Format is:
    +
    +
    + $fragment +
    +
    + +
    +
    + Factory.php +
    +
    +
    Factory.php in Factory.php
    +
    +
    + File.php +
    +
    +
    File.php in File.php
    +
    +
    + factory +
    +
    +
    IDS_Caching::factory() in Factory.php
    +
    Factory method
    +
    +
    + filter +
    +
    + +
    +
    + filter +
    +
    + +
    +
    + filter +
    +
    + +
    +
    + filter +
    +
    + +
    Filter a URI object
    +
    +
    + filter +
    +
    + +
    +
    + filter +
    +
    + +
    +
    + filter +
    +
    + +
    +
    + Filter.php +
    +
    +
    Filter.php in Filter.php
    +
    +
    + finalize +
    +
    + +
    Finalizes a configuration object, prohibiting further change
    +
    +
    + FLOAT +
    +
    + +
    +
    + flush +
    +
    + +
    +
    + flush +
    +
    + +
    Clears all objects from cache
    +
    +
    + flush +
    +
    + +
    +
    + flush +
    +
    + +
    +
    + formatMessage +
    +
    + +
    Formats a localised message with passed parameters
    +
    +
    + FORMATTING +
    +
    + +
    +
    + forward +
    +
    + +
    Iterator function, which starts with the next token and continues until you reach the end of the input tokens.
    +
    +
    + forwardUntilEndToken +
    +
    + +
    Similar to _forward, but accepts a third parameter $nesting (which should be initialized at 0) and stops when we hit the end tag for the node $this->inputIndex starts in.
    +
    +
    + File.php +
    +
    +
    File.php in File.php
    +
    +
    + Filter.php +
    +
    +
    Filter.php in Filter.php
    +
    +
    + Font.php +
    +
    +
    Font.php in Font.php
    +
    +
    + FontFamily.php +
    +
    +
    FontFamily.php in FontFamily.php
    +
    +
    + FrameTarget.php +
    +
    +
    FrameTarget.php in FrameTarget.php
    +
    +
    + Filter.php +
    +
    +
    Filter.php in Filter.php
    +
    +
    + Forms.php +
    +
    +
    Forms.php in Forms.php
    +
    +
    + FixNesting.php +
    +
    +
    FixNesting.php in FixNesting.php
    +
    +
    + Font.php +
    +
    +
    Font.php in Font.php
    +
    +
    + ftp.php +
    +
    +
    ftp.php in ftp.php
    +
    +
    + Flexible.php +
    +
    +
    Flexible.php in Flexible.php
    +
    +
    + +
    +
    g
    + +
    +
    +
    +
    + $generator +
    +
    + +
    +
    + $generator +
    +
    + +
    Instance of HTMLPurifier_Generator for HTML generation convenience funcs
    +
    +
    + $generator +
    +
    +
    HTMLPurifier::$generator in HTMLPurifier.php
    +
    +
    + generateAttributes +
    +
    + +
    Generates attribute declarations from attribute array.
    +
    +
    + generateBaseDirectoryPath +
    +
    + +
    Generates path to base directory that contains all definition type
    +
    +
    + generateChildDef +
    +
    + +
    Accepts a definition; generates and assigns a ChildDef for it
    +
    +
    + generateChildDefCallback +
    +
    + +
    +
    + generateDirectoryPath +
    +
    + +
    Generates the path to the directory contain this cache's serial files
    +
    +
    + generateFilePath +
    +
    + +
    Generates the file path to the serial file corresponding to
    +
    +
    + generateFromToken +
    +
    + +
    Generates HTML from a single token.
    +
    +
    + generateFromTokens +
    +
    + +
    Generates HTML from an array of tokens.
    +
    +
    + generateKey +
    +
    + +
    Generates a unique identifier for a particular configuration
    +
    +
    + generateScriptFromToken +
    +
    + +
    Special case processor for the contents of script tags
    +
    +
    + get +
    +
    + +
    +
    + get +
    +
    + +
    Retrieves reference to a doctype of a certain name
    +
    +
    + get +
    +
    + +
    Retrieves a definition object from the cache
    +
    +
    + get +
    +
    + +
    +
    + get +
    +
    + +
    Retrieves a type
    +
    +
    + get +
    +
    + +
    +
    + get +
    +
    + +
    Retreives a value from the configuration.
    +
    +
    + get +
    +
    + +
    +
    + get +
    +
    + +
    +
    + get +
    +
    + +
    Retrieves a variable reference from the context.
    +
    +
    + getAccessed +
    +
    + +
    Returns a lookup array of all array indexes that have been accessed.
    +
    +
    + getAll +
    +
    + +
    Retrieves all directives, organized by namespace
    +
    +
    + getAllowedDirectivesForForm +
    +
    + +
    Returns a list of array(namespace, directive) for all directives that are allowed in a web-form context as per an allowed namespaces/directives list.
    +
    +
    + getAnonymousModule +
    +
    + +
    Retrieves a reference to the anonymous module, so you can bust out advanced features without having to make your own module.
    +
    +
    + getBasePath +
    +
    + +
    This method checks if a base path is given and usage is set to true.
    +
    +
    + getBatch +
    +
    + +
    Retreives an array of directives to values from a given namespace
    +
    +
    + getBatchSerial +
    +
    + +
    Returns a md5 signature of a segment of the configuration object
    +
    +
    + getCache +
    +
    + +
    Returns the cached data
    +
    +
    + getCache +
    +
    + +
    Returns the cached data
    +
    +
    + getCache +
    +
    + +
    Returns the cached data
    +
    +
    + getCache +
    +
    + +
    Returns the cached data
    +
    +
    + getCache +
    +
    + +
    Interface method
    +
    +
    + getCentrifuge +
    +
    + +
    This method returns the centrifuge property or null if not filled with data
    +
    +
    + getChild +
    +
    + +
    +
    + getChildDef +
    +
    + +
    Retrieves a proper HTMLPurifier_ChildDef subclass based on content_model and content_model_type member variables of the HTMLPurifier_ElementDef class. There is a similar function in HTMLPurifier_HTMLDefinition.
    +
    +
    + getChildDef +
    +
    + +
    Instantiates a ChildDef based on content_model and content_model_type
    +
    +
    + getChildDef +
    +
    + +
    +
    + getChildDef +
    +
    + +
    +
    + getClass +
    +
    + +
    Retrieves the class of an object without prefixes, as well as metadata
    +
    +
    + getConfig +
    +
    + +
    Returns the config array
    +
    +
    + getConfigPath +
    +
    + +
    Returns path to configuration file
    +
    +
    + getCSS +
    +
    + +
    Retrieves styling, in case it is not accessible by webserver
    +
    +
    + getCSSDefinition +
    +
    + +
    Retrieves object reference to the CSS definition
    +
    +
    + getDefinition +
    +
    + +
    Retrieves a definition
    +
    +
    + getDescription +
    +
    + +
    Returns filter description
    +
    +
    + getDoctypeFromConfig +
    +
    + +
    Retrieves the doctype from the configuration object
    +
    +
    + getElement +
    +
    + +
    Retrieves a single merged element definition
    +
    +
    + getElements +
    +
    + +
    Retrieves merged element definitions.
    +
    +
    + getErrorName +
    +
    + +
    Retrieves a localised error name.
    +
    +
    + getEvent +
    +
    + +
    Get event by name
    +
    +
    + getExceptions +
    +
    + +
    Returns exception array
    +
    +
    + getFallbackFor +
    +
    + +
    Returns the fallback language for language
    +
    +
    + getFilterFromJson +
    +
    + +
    Loads filters from Json file using ext/Json
    +
    +
    + getFilterFromXML +
    +
    + +
    Loads filters from XML using SimpleXML
    +
    +
    + getFilters +
    +
    + +
    Returns list of filter objects
    +
    +
    + getFilterSet +
    +
    + +
    Returns registered filters
    +
    +
    + getFixesForLevel +
    +
    + +
    Retrieves all fixes per a level, returning fixes for that specific level as well as all levels below it.
    +
    +
    + getFixType +
    +
    + +
    Parses a fix name and determines what kind of fix it is, as well
    +
    +
    + getFormattedContext +
    +
    + +
    Returns a formatted context string.
    +
    +
    + getHtml +
    +
    +
    IDS_Monitor::getHtml() in Monitor.php
    +
    Returns html array
    +
    +
    + getHTMLDefinition +
    +
    + +
    Retrieves object reference to the HTML definition.
    +
    +
    + getHTMLFormatted +
    +
    + +
    Default HTML formatting implementation for error messages
    +
    +
    + getId +
    +
    +
    IDS_Filter::getId() in Filter.php
    +
    Get filter ID
    +
    +
    + getImpact +
    +
    + +
    Returns total impact
    +
    +
    + getImpact +
    +
    + +
    Get filter impact level
    +
    +
    + getImpact +
    +
    + +
    Returns calculated impact
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    +
    HTMLPurifier::getInstance() in HTMLPurifier.php
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getIterator +
    +
    + +
    IteratorAggregate iterator getter
    +
    +
    + getIterator +
    +
    + +
    Return iterator object
    +
    +
    + getJavaScript +
    +
    + +
    Retrieves JavaScript, in case it is not accessible by webserver
    +
    +
    + getJson +
    +
    +
    IDS_Monitor::getJson() in Monitor.php
    +
    Returns json array
    +
    +
    + getMessage +
    +
    + +
    Retrieves a localised message.
    +
    +
    + getN +
    +
    + +
    Retrieves string numeric magnitude.
    +
    +
    + getName +
    +
    + +
    Returns event name
    +
    +
    + getNonAutoCloseElements +
    +
    + +
    Get lookup of tag names that should not close this element automatically.
    +
    +
    + getNonAutoCloseElements +
    +
    + +
    +
    + getPath +
    +
    + +
    Returns the path for a specific class.
    +
    +
    + getRaw +
    +
    + +
    Retrieves raw error data for custom formatter to use
    +
    +
    + getReport +
    +
    + +
    Returns report object providing various functions to work with detected results. Also the centrifuge data is being set as property of the report object.
    +
    +
    + getRewind +
    +
    + +
    Retrieves rewind, and then unsets it.
    +
    +
    + getRule +
    +
    +
    IDS_Filter::getRule() in Filter.php
    +
    Returns filter rule
    +
    +
    + getScheme +
    +
    + +
    Retrieves a scheme validator object
    +
    +
    + getSchemeObj +
    +
    + +
    Retrieves a scheme object corresponding to the URI's scheme/default
    +
    +
    + getSerial +
    +
    + +
    Returns a md5 signature for the entire configuration object
    +
    +
    + getSigFigs +
    +
    + +
    Returns the number of significant figures in a string number.
    +
    +
    + getStorage +
    +
    + +
    Returns storage container
    +
    +
    + getTags +
    +
    +
    IDS_Filter::getTags() in Filter.php
    +
    Return list of affected tags
    +
    +
    + getTags +
    +
    +
    IDS_Report::getTags() in Report.php
    +
    Returns list of affected tags
    +
    +
    + getTags +
    +
    + +
    Returns affected tags
    +
    +
    + getTypeName +
    +
    + +
    +
    + getUnit +
    +
    + +
    Retrieves string unit.
    +
    +
    + getValue +
    +
    + +
    Returns event value
    +
    +
    + Generator.php +
    +
    +
    Generator.php in Generator.php
    +
    +
    + +
    +
    h
    + +
    +
    +
    +
    + $hierarchical +
    +
    + +
    +
    + $hierarchical +
    +
    + +
    Whether or not the URI always uses <hier_part>, resolves edge cases
    +
    +
    + $hierarchical +
    +
    + +
    +
    + $host +
    +
    + +
    +
    + $host +
    +
    + +
    String host to consider "home" base, derived off of $base
    +
    +
    + $htmlDefinition +
    +
    + +
    Instance of HTMLPurifier_HTMLDefinition
    +
    +
    + handleElement +
    +
    + +
    +
    + handleElement +
    +
    + +
    +
    + handleElement +
    +
    + +
    Handler that is called when a start or empty token is processed
    +
    +
    + handleElement +
    +
    + +
    +
    + handleElement +
    +
    + +
    +
    + handleEnd +
    +
    + +
    Handler that is called when an end token is processed
    +
    +
    + handleEnd +
    +
    + +
    +
    + handleEnd +
    +
    + +
    +
    + handleText +
    +
    + +
    +
    + handleText +
    +
    + +
    Handler that is called when a text token is processed
    +
    +
    + handleText +
    +
    + +
    +
    + handleText +
    +
    + +
    +
    + hasEvent +
    +
    + +
    Checks if a specific event with given name exists
    +
    +
    + HASH +
    +
    + +
    +
    + heavyHeader +
    +
    + +
    Creates a heavy header row
    +
    +
    + HTML5 +
    +
    +
    HTML5 in PH5P.php
    +
    +
    + HTML5TreeConstructer +
    +
    + +
    +
    + HTMLPurifier +
    +
    +
    HTMLPurifier in HTMLPurifier.php
    +
    Facade that coordinates HTML Purifier's subsystems in order to purify HTML.
    +
    +
    + HTMLPurifier +
    +
    +
    HTMLPurifier() in HTMLPurifier.func.php
    +
    Purify HTML.
    +
    +
    + HTMLPurifier_AttrCollections +
    +
    +
    HTMLPurifier_AttrCollections in AttrCollections.php
    +
    Defines common attribute collections that modules reference
    +
    +
    + HTMLPurifier_AttrDef +
    +
    +
    HTMLPurifier_AttrDef in AttrDef.php
    +
    Base class for all validating attribute definitions.
    +
    +
    + HTMLPurifier_AttrDef_CSS +
    +
    + +
    Validates the HTML attribute style, otherwise known as CSS.
    +
    +
    + HTMLPurifier_AttrDef_CSS_AlphaValue +
    +
    + +
    Validates a number as defined by the CSS spec.
    +
    +
    + HTMLPurifier_AttrDef_CSS_Background +
    +
    + +
    Validates shorthand CSS property background.
    +
    +
    + HTMLPurifier_AttrDef_CSS_BackgroundPosition +
    +
    + +
    Validates the value of background-position.
    +
    +
    + HTMLPurifier_AttrDef_CSS_Border +
    +
    + +
    Validates the border property as defined by CSS.
    +
    +
    + HTMLPurifier_AttrDef_CSS_Color +
    +
    + +
    Validates Color as defined by CSS.
    +
    +
    + HTMLPurifier_AttrDef_CSS_Composite +
    +
    + +
    Allows multiple validators to attempt to validate attribute.
    +
    +
    + HTMLPurifier_AttrDef_CSS_DenyElementDecorator +
    +
    + +
    Decorator which enables CSS properties to be disabled for specific elements.
    +
    +
    + HTMLPurifier_AttrDef_CSS_Filter +
    +
    + +
    Microsoft's proprietary filter: CSS property
    +
    +
    + HTMLPurifier_AttrDef_CSS_Font +
    +
    + +
    Validates shorthand CSS property font.
    +
    +
    + HTMLPurifier_AttrDef_CSS_FontFamily +
    +
    + +
    Validates a font family list according to CSS spec
    +
    +
    + HTMLPurifier_AttrDef_CSS_ImportantDecorator +
    +
    + +
    Decorator which enables !important to be used in CSS values.
    +
    +
    + HTMLPurifier_AttrDef_CSS_Length +
    +
    + +
    Represents a Length as defined by CSS.
    +
    +
    + HTMLPurifier_AttrDef_CSS_ListStyle +
    +
    + +
    Validates shorthand CSS property list-style.
    +
    +
    + HTMLPurifier_AttrDef_CSS_Multiple +
    +
    + +
    Framework class for strings that involve multiple values.
    +
    +
    + HTMLPurifier_AttrDef_CSS_Number +
    +
    + +
    Validates a number as defined by the CSS spec.
    +
    +
    + HTMLPurifier_AttrDef_CSS_Percentage +
    +
    + +
    Validates a Percentage as defined by the CSS spec.
    +
    +
    + HTMLPurifier_AttrDef_CSS_TextDecoration +
    +
    + +
    Validates the value for the CSS property text-decoration
    +
    +
    + HTMLPurifier_AttrDef_CSS_URI +
    +
    + +
    Validates a URI in CSS syntax, which uses url('http://example.com')
    +
    +
    + HTMLPurifier_AttrDef_Enum +
    +
    + +
    Validates a keyword against a list of valid values.
    +
    +
    + HTMLPurifier_AttrDef_HTML_Bool +
    +
    + +
    Validates a boolean attribute
    +
    +
    + HTMLPurifier_AttrDef_HTML_Color +
    +
    + +
    Validates a color according to the HTML spec.
    +
    +
    + HTMLPurifier_AttrDef_HTML_FrameTarget +
    +
    + +
    Special-case enum attribute definition that lazy loads allowed frame targets
    +
    +
    + HTMLPurifier_AttrDef_HTML_ID +
    +
    + +
    Validates the HTML attribute ID.
    +
    +
    + HTMLPurifier_AttrDef_HTML_Length +
    +
    + +
    Validates the HTML type length (not to be confused with CSS's length).
    +
    +
    + HTMLPurifier_AttrDef_HTML_LinkTypes +
    +
    + +
    Validates a rel/rev link attribute against a directive of allowed values
    +
    +
    + HTMLPurifier_AttrDef_HTML_MultiLength +
    +
    + +
    Validates a MultiLength as defined by the HTML spec.
    +
    +
    + HTMLPurifier_AttrDef_HTML_Nmtokens +
    +
    + +
    Validates contents based on NMTOKENS attribute type.
    +
    +
    + HTMLPurifier_AttrDef_HTML_Pixels +
    +
    + +
    Validates an integer representation of pixels according to the HTML spec.
    +
    +
    + HTMLPurifier_AttrDef_Integer +
    +
    + +
    Validates an integer.
    +
    +
    + HTMLPurifier_AttrDef_Lang +
    +
    + +
    Validates the HTML attribute lang, effectively a language code.
    +
    +
    + HTMLPurifier_AttrDef_Switch +
    +
    + +
    Decorator that, depending on a token, switches between two definitions.
    +
    +
    + HTMLPurifier_AttrDef_Text +
    +
    + +
    Validates arbitrary text according to the HTML spec.
    +
    +
    + HTMLPurifier_AttrDef_URI +
    +
    + +
    Validates a URI as defined by RFC 3986.
    +
    +
    + HTMLPurifier_AttrDef_URI_Email +
    +
    + +
    Base class for all validating attribute definitions.
    +
    +
    + HTMLPurifier_AttrDef_URI_Email_SimpleCheck +
    +
    + +
    Primitive email validation class based on the regexp found at
    +
    +
    + HTMLPurifier_AttrDef_URI_Host +
    +
    + +
    Validates a host according to the IPv4, IPv6 and DNS (future) specifications.
    +
    +
    + HTMLPurifier_AttrDef_URI_IPv4 +
    +
    + +
    Validates an IPv4 address
    +
    +
    + HTMLPurifier_AttrDef_URI_IPv6 +
    +
    + +
    Validates an IPv6 address.
    +
    +
    + HTMLPurifier_AttrTransform +
    +
    +
    HTMLPurifier_AttrTransform in AttrTransform.php
    +
    Processes an entire attribute array for corrections needing multiple values.
    +
    +
    + HTMLPurifier_AttrTransform_Background +
    +
    + +
    Pre-transform that changes proprietary background attribute to CSS.
    +
    +
    + HTMLPurifier_AttrTransform_BdoDir +
    +
    + +
    Post-trasnform that ensures that bdo tags have the dir attribute set.
    +
    +
    + HTMLPurifier_AttrTransform_BgColor +
    +
    + +
    Pre-transform that changes deprecated bgcolor attribute to CSS.
    +
    +
    + HTMLPurifier_AttrTransform_BoolToCSS +
    +
    + +
    Pre-transform that changes converts a boolean attribute to fixed CSS
    +
    +
    + HTMLPurifier_AttrTransform_Border +
    +
    + +
    Pre-transform that changes deprecated border attribute to CSS.
    +
    +
    + HTMLPurifier_AttrTransform_EnumToCSS +
    +
    + +
    Generic pre-transform that converts an attribute with a fixed number of values (enumerated) to CSS.
    +
    +
    + HTMLPurifier_AttrTransform_ImgRequired +
    +
    + +
    Transform that supplies default values for the src and alt attributes in img tags, as well as prevents the img tag from being removed because of a missing alt tag. This needs to be registered as both a pre and post attribute transform.
    +
    +
    + HTMLPurifier_AttrTransform_ImgSpace +
    +
    + +
    Pre-transform that changes deprecated hspace and vspace attributes to CSS
    +
    +
    + HTMLPurifier_AttrTransform_Input +
    +
    + +
    Performs miscellaneous cross attribute validation and filtering for input elements. This is meant to be a post-transform.
    +
    +
    + HTMLPurifier_AttrTransform_Lang +
    +
    + +
    Post-transform that copies lang's value to xml:lang (and vice-versa)
    +
    +
    + HTMLPurifier_AttrTransform_Length +
    +
    + +
    Class for handling width/height length attribute transformations to CSS
    +
    +
    + HTMLPurifier_AttrTransform_Name +
    +
    + +
    Pre-transform that changes deprecated name attribute to ID if necessary
    +
    +
    + HTMLPurifier_AttrTransform_SafeEmbed +
    +
    + +
    Processes an entire attribute array for corrections needing multiple values.
    +
    +
    + HTMLPurifier_AttrTransform_SafeObject +
    +
    + +
    Writes default type for all objects. Currently only supports flash.
    +
    +
    + HTMLPurifier_AttrTransform_SafeParam +
    +
    + +
    Validates name/value pairs in param tags to be used in safe objects. This will only allow name values it recognizes, and pre-fill certain attributes with required values.
    +
    +
    + HTMLPurifier_AttrTransform_ScriptRequired +
    +
    + +
    Implements required attribute stipulation for <script>
    +
    +
    + HTMLPurifier_AttrTransform_Textarea +
    +
    + +
    Sets height/width defaults for <textarea>
    +
    +
    + HTMLPurifier_AttrTypes +
    +
    +
    HTMLPurifier_AttrTypes in AttrTypes.php
    +
    Provides lookup array of attribute types to HTMLPurifier_AttrDef objects
    +
    +
    + HTMLPurifier_AttrValidator +
    +
    +
    HTMLPurifier_AttrValidator in AttrValidator.php
    +
    Validates the attributes of a token. Doesn't manage required attributes very well. The only reason we factored this out was because RemoveForeignElements also needed it besides ValidateAttributes.
    +
    +
    + HTMLPurifier_Bootstrap +
    +
    +
    HTMLPurifier_Bootstrap in Bootstrap.php
    +
    Bootstrap class that contains meta-functionality for HTML Purifier such as the autoload function.
    +
    +
    + HTMLPurifier_ChildDef +
    +
    +
    HTMLPurifier_ChildDef in ChildDef.php
    +
    Defines allowed child nodes and validates tokens against it.
    +
    +
    + HTMLPurifier_ChildDef_Chameleon +
    +
    + +
    Definition that uses different definitions depending on context.
    +
    +
    + HTMLPurifier_ChildDef_Custom +
    +
    + +
    Custom validation class, accepts DTD child definitions
    +
    +
    + HTMLPurifier_ChildDef_Empty +
    +
    + +
    Definition that disallows all elements.
    +
    +
    + HTMLPurifier_ChildDef_Optional +
    +
    + +
    Definition that allows a set of elements, and allows no children.
    +
    +
    + HTMLPurifier_ChildDef_Required +
    +
    + +
    Definition that allows a set of elements, but disallows empty children.
    +
    +
    + HTMLPurifier_ChildDef_StrictBlockquote +
    +
    + +
    Takes the contents of blockquote when in strict and reformats for validation.
    +
    +
    + HTMLPurifier_ChildDef_Table +
    +
    + +
    Definition for tables
    +
    +
    + HTMLPurifier_Config +
    +
    +
    HTMLPurifier_Config in Config.php
    +
    Configuration object that triggers customizable behavior.
    +
    +
    + HTMLPurifier_ConfigDef +
    +
    +
    HTMLPurifier_ConfigDef in ConfigDef.php
    +
    Base class for configuration entity
    +
    +
    + HTMLPurifier_ConfigDef_Directive +
    +
    + +
    Structure object containing definition of a directive.
    +
    +
    + HTMLPurifier_ConfigDef_DirectiveAlias +
    +
    + +
    Structure object describing a directive alias
    +
    +
    + HTMLPurifier_ConfigDef_Namespace +
    +
    + +
    Structure object describing of a namespace
    +
    +
    + HTMLPurifier_ConfigSchema +
    +
    +
    HTMLPurifier_ConfigSchema in ConfigSchema.php
    +
    Configuration definition, defines directives and their defaults.
    +
    +
    + HTMLPurifier_ConfigSchema_Builder_ConfigSchema +
    +
    + +
    Converts HTMLPurifier_ConfigSchema_Interchange to our runtime representation used to perform checks on user configuration.
    +
    +
    + HTMLPurifier_ConfigSchema_Builder_Xml +
    +
    + +
    Converts HTMLPurifier_ConfigSchema_Interchange to an XML format, which can be further processed to generate documentation.
    +
    +
    + HTMLPurifier_ConfigSchema_Exception +
    +
    + +
    Exceptions related to configuration schema
    +
    +
    + HTMLPurifier_ConfigSchema_Interchange +
    +
    + +
    Generic schema interchange format that can be converted to a runtime representation (HTMLPurifier_ConfigSchema) or HTML documentation. Members are completely validated.
    +
    +
    + HTMLPurifier_ConfigSchema_InterchangeBuilder +
    +
    + +
    +
    + HTMLPurifier_ConfigSchema_Interchange_Directive +
    +
    + +
    Interchange component class describing configuration directives.
    +
    +
    + HTMLPurifier_ConfigSchema_Interchange_Id +
    +
    + +
    Represents a directive ID in the interchange format.
    +
    +
    + HTMLPurifier_ConfigSchema_Interchange_Namespace +
    +
    + +
    Interchange component class describing namespaces.
    +
    +
    + HTMLPurifier_ConfigSchema_Validator +
    +
    + +
    Performs validations on HTMLPurifier_ConfigSchema_Interchange
    +
    +
    + HTMLPurifier_ConfigSchema_ValidatorAtom +
    +
    + +
    Fluent interface for validating the contents of member variables.
    +
    +
    + HTMLPurifier_ContentSets +
    +
    +
    HTMLPurifier_ContentSets in ContentSets.php
    +
    +
    + HTMLPurifier_Context +
    +
    +
    HTMLPurifier_Context in Context.php
    +
    Registry object that contains information about the current context.
    +
    +
    + HTMLPurifier_CSSDefinition +
    +
    +
    HTMLPurifier_CSSDefinition in CSSDefinition.php
    +
    Defines allowed CSS attributes and what their values are.
    +
    +
    + HTMLPurifier_Definition +
    +
    +
    HTMLPurifier_Definition in Definition.php
    +
    Super-class for definition datatype objects, implements serialization functions for the class.
    +
    +
    + HTMLPurifier_DefinitionCache +
    +
    +
    HTMLPurifier_DefinitionCache in DefinitionCache.php
    +
    Abstract class representing Definition cache managers that implements useful common methods and is a factory.
    +
    +
    + HTMLPurifier_DefinitionCacheFactory +
    +
    +
    HTMLPurifier_DefinitionCacheFactory in DefinitionCacheFactory.php
    +
    Responsible for creating definition caches.
    +
    +
    + HTMLPurifier_DefinitionCache_Decorator +
    +
    + +
    Abstract class representing Definition cache managers that implements useful common methods and is a factory.
    +
    +
    + HTMLPurifier_DefinitionCache_Decorator_Cleanup +
    +
    + +
    Definition cache decorator class that cleans up the cache whenever there is a cache miss.
    +
    +
    + HTMLPurifier_DefinitionCache_Decorator_Memory +
    +
    + +
    Definition cache decorator class that saves all cache retrievals to PHP's memory; good for unit tests or circumstances where there are lots of configuration objects floating around.
    +
    +
    + HTMLPurifier_DefinitionCache_Null +
    +
    + +
    Null cache object to use when no caching is on.
    +
    +
    + HTMLPurifier_DefinitionCache_Serializer +
    +
    + +
    Abstract class representing Definition cache managers that implements useful common methods and is a factory.
    +
    +
    + HTMLPurifier_Doctype +
    +
    +
    HTMLPurifier_Doctype in Doctype.php
    +
    Represents a document type, contains information on which modules need to be loaded.
    +
    +
    + HTMLPurifier_DoctypeRegistry +
    +
    +
    HTMLPurifier_DoctypeRegistry in DoctypeRegistry.php
    +
    +
    + HTMLPurifier_ElementDef +
    +
    +
    HTMLPurifier_ElementDef in ElementDef.php
    +
    Structure that stores an HTML element definition. Used by HTMLPurifier_HTMLDefinition and HTMLPurifier_HTMLModule.
    +
    +
    + HTMLPurifier_Encoder +
    +
    +
    HTMLPurifier_Encoder in Encoder.php
    +
    A UTF-8 specific character encoder that handles cleaning and transforming.
    +
    +
    + HTMLPurifier_EntityLookup +
    +
    +
    HTMLPurifier_EntityLookup in EntityLookup.php
    +
    Object that provides entity lookup table from entity name to character
    +
    +
    + HTMLPurifier_EntityParser +
    +
    +
    HTMLPurifier_EntityParser in EntityParser.php
    +
    Handles referencing and derefencing character entities
    +
    +
    + HTMLPurifier_ErrorCollector +
    +
    +
    HTMLPurifier_ErrorCollector in ErrorCollector.php
    +
    Error collection class that enables HTML Purifier to report HTML
    +
    +
    + HTMLPurifier_ErrorStruct +
    +
    +
    HTMLPurifier_ErrorStruct in ErrorStruct.php
    +
    Records errors for particular segments of an HTML document such as tokens, attributes or CSS properties. They can contain error structs (which apply to components of what they represent), but their main purpose is to hold errors applying to whatever struct is being used.
    +
    +
    + HTMLPurifier_Exception +
    +
    +
    HTMLPurifier_Exception in Exception.php
    +
    Global exception class for HTML Purifier; any exceptions we throw are from here.
    +
    +
    + HTMLPurifier_Filter +
    +
    +
    HTMLPurifier_Filter in Filter.php
    +
    Represents a pre or post processing filter on HTML Purifier's output
    +
    +
    + HTMLPurifier_Filter_ExtractStyleBlocks +
    +
    +
    HTMLPurifier_Filter_ExtractStyleBlocks in ExtractStyleBlocks.php
    +
    This filter extracts <style> blocks from input HTML, cleans them up using CSSTidy, and then places them in $purifier->context->get('StyleBlocks') so they can be used elsewhere in the document.
    +
    +
    + HTMLPurifier_Filter_YouTube +
    +
    + +
    Represents a pre or post processing filter on HTML Purifier's output
    +
    +
    + HTMLPurifier_Generator +
    +
    +
    HTMLPurifier_Generator in Generator.php
    +
    Generates HTML from tokens.
    +
    +
    + HTMLPurifier_HTMLDefinition +
    +
    +
    HTMLPurifier_HTMLDefinition in HTMLDefinition.php
    +
    Definition of the purified HTML that describes allowed children, attributes, and many other things.
    +
    +
    + HTMLPurifier_HTMLModule +
    +
    +
    HTMLPurifier_HTMLModule in HTMLModule.php
    +
    Represents an XHTML 1.1 module, with information on elements, tags and attributes.
    +
    +
    + HTMLPurifier_HTMLModuleManager +
    +
    +
    HTMLPurifier_HTMLModuleManager in HTMLModuleManager.php
    +
    +
    + HTMLPurifier_HTMLModule_Bdo +
    +
    + +
    XHTML 1.1 Bi-directional Text Module, defines elements that declare directionality of content. Text Extension Module.
    +
    +
    + HTMLPurifier_HTMLModule_CommonAttributes +
    +
    + +
    Represents an XHTML 1.1 module, with information on elements, tags and attributes.
    +
    +
    + HTMLPurifier_HTMLModule_Edit +
    +
    + +
    XHTML 1.1 Edit Module, defines editing-related elements. Text Extension Module.
    +
    +
    + HTMLPurifier_HTMLModule_Forms +
    +
    + +
    XHTML 1.1 Forms module, defines all form-related elements found in HTML 4.
    +
    +
    + HTMLPurifier_HTMLModule_Hypertext +
    +
    + +
    XHTML 1.1 Hypertext Module, defines hypertext links. Core Module.
    +
    +
    + HTMLPurifier_HTMLModule_Image +
    +
    + +
    XHTML 1.1 Image Module provides basic image embedding.
    +
    +
    + HTMLPurifier_HTMLModule_Legacy +
    +
    + +
    XHTML 1.1 Legacy module defines elements that were previously deprecated.
    +
    +
    + HTMLPurifier_HTMLModule_List +
    +
    + +
    XHTML 1.1 List Module, defines list-oriented elements. Core Module.
    +
    +
    + HTMLPurifier_HTMLModule_Name +
    +
    + +
    Represents an XHTML 1.1 module, with information on elements, tags and attributes.
    +
    +
    + HTMLPurifier_HTMLModule_NonXMLCommonAttributes +
    +
    + +
    Represents an XHTML 1.1 module, with information on elements, tags and attributes.
    +
    +
    + HTMLPurifier_HTMLModule_Object +
    +
    + +
    XHTML 1.1 Object Module, defines elements for generic object inclusion
    +
    +
    + HTMLPurifier_HTMLModule_Presentation +
    +
    + +
    XHTML 1.1 Presentation Module, defines simple presentation-related markup. Text Extension Module.
    +
    +
    + HTMLPurifier_HTMLModule_Proprietary +
    +
    + +
    Module defines proprietary tags and attributes in HTML.
    +
    +
    + HTMLPurifier_HTMLModule_Ruby +
    +
    + +
    XHTML 1.1 Ruby Annotation Module, defines elements that indicate short runs of text alongside base text for annotation or pronounciation.
    +
    +
    + HTMLPurifier_HTMLModule_SafeEmbed +
    +
    + +
    A "safe" embed module. See SafeObject. This is a proprietary element.
    +
    +
    + HTMLPurifier_HTMLModule_SafeObject +
    +
    + +
    A "safe" object module. In theory, objects permitted by this module will be safe, and untrusted users can be allowed to embed arbitrary flash objects (maybe other types too, but only Flash is supported as of right now).
    +
    +
    + HTMLPurifier_HTMLModule_Scripting +
    +
    + +
    XHTML 1.1 Scripting module, defines elements that are used to contain information pertaining to executable scripts or the lack of support for executable scripts.
    +
    +
    + HTMLPurifier_HTMLModule_StyleAttribute +
    +
    + +
    XHTML 1.1 Edit Module, defines editing-related elements. Text Extension Module.
    +
    +
    + HTMLPurifier_HTMLModule_Tables +
    +
    + +
    XHTML 1.1 Tables Module, fully defines accessible table elements.
    +
    +
    + HTMLPurifier_HTMLModule_Target +
    +
    + +
    XHTML 1.1 Target Module, defines target attribute in link elements.
    +
    +
    + HTMLPurifier_HTMLModule_Text +
    +
    + +
    XHTML 1.1 Text Module, defines basic text containers. Core Module.
    +
    +
    + HTMLPurifier_HTMLModule_Tidy +
    +
    + +
    Abstract class for a set of proprietary modules that clean up (tidy) poorly written HTML.
    +
    +
    + HTMLPurifier_HTMLModule_Tidy_Name +
    +
    + +
    Name is deprecated, but allowed in strict doctypes, so onl
    +
    +
    + HTMLPurifier_HTMLModule_Tidy_Proprietary +
    +
    + +
    Abstract class for a set of proprietary modules that clean up (tidy) poorly written HTML.
    +
    +
    + HTMLPurifier_HTMLModule_Tidy_Strict +
    +
    + +
    Abstract class for a set of proprietary modules that clean up (tidy) poorly written HTML.
    +
    +
    + HTMLPurifier_HTMLModule_Tidy_Transitional +
    +
    + +
    Abstract class for a set of proprietary modules that clean up (tidy) poorly written HTML.
    +
    +
    + HTMLPurifier_HTMLModule_Tidy_XHTML +
    +
    + +
    Abstract class for a set of proprietary modules that clean up (tidy) poorly written HTML.
    +
    +
    + HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4 +
    +
    + +
    Abstract class for a set of proprietary modules that clean up (tidy) poorly written HTML.
    +
    +
    + HTMLPurifier_HTMLModule_XMLCommonAttributes +
    +
    + +
    Represents an XHTML 1.1 module, with information on elements, tags and attributes.
    +
    +
    + HTMLPurifier_IDAccumulator +
    +
    +
    HTMLPurifier_IDAccumulator in IDAccumulator.php
    +
    Component of HTMLPurifier_AttrContext that accumulates IDs to prevent dupes
    +
    +
    + HTMLPurifier_Injector +
    +
    +
    HTMLPurifier_Injector in Injector.php
    +
    Injects tokens into the document while parsing for well-formedness.
    +
    +
    + HTMLPurifier_Injector_AutoParagraph +
    +
    + +
    Injector that auto paragraphs text in the root node based on double-spacing.
    +
    +
    + HTMLPurifier_Injector_DisplayLinkURI +
    +
    + +
    Injector that displays the URL of an anchor instead of linking to it, in addition to showing the text of the link.
    +
    +
    + HTMLPurifier_Injector_Linkify +
    +
    + +
    Injector that converts http, https and ftp text URLs to actual links.
    +
    +
    + HTMLPurifier_Injector_PurifierLinkify +
    +
    + +
    Injector that converts configuration directive syntax %Namespace.Directive
    +
    +
    + HTMLPurifier_Injector_RemoveEmpty +
    +
    + +
    Injects tokens into the document while parsing for well-formedness.
    +
    +
    + HTMLPurifier_Injector_SafeObject +
    +
    + +
    Adds important param elements to inside of object in order to make things safe.
    +
    +
    + HTMLPurifier_Language +
    +
    +
    HTMLPurifier_Language in Language.php
    +
    Represents a language and defines localizable string formatting and other functions, as well as the localized messages for HTML Purifier.
    +
    +
    + HTMLPurifier_LanguageFactory +
    +
    +
    HTMLPurifier_LanguageFactory in LanguageFactory.php
    +
    Class responsible for generating HTMLPurifier_Language objects, managing caching and fallbacks.
    +
    +
    + HTMLPurifier_Language_en_x_test +
    +
    + +
    Represents a language and defines localizable string formatting and other functions, as well as the localized messages for HTML Purifier.
    +
    +
    + HTMLPurifier_Length +
    +
    +
    HTMLPurifier_Length in Length.php
    +
    Represents a measurable length, with a string numeric magnitude and a unit. This object is immutable.
    +
    +
    + HTMLPurifier_Lexer +
    +
    +
    HTMLPurifier_Lexer in Lexer.php
    +
    Forgivingly lexes HTML (SGML-style) markup into tokens.
    +
    +
    + HTMLPurifier_Lexer_DirectLex +
    +
    + +
    Our in-house implementation of a parser.
    +
    +
    + HTMLPurifier_Lexer_DOMLex +
    +
    + +
    Parser that uses PHP 5's DOM extension (part of the core).
    +
    +
    + HTMLPurifier_Lexer_PEARSax3 +
    +
    + +
    Proof-of-concept lexer that uses the PEAR package XML_HTMLSax3 to parse HTML.
    +
    +
    + HTMLPurifier_Lexer_PH5P +
    +
    + +
    Experimental HTML5-based parser using Jeroen van der Meer's PH5P library.
    +
    +
    + HTMLPurifier_PercentEncoder +
    +
    +
    HTMLPurifier_PercentEncoder in PercentEncoder.php
    +
    Class that handles operations involving percent-encoding in URIs.
    +
    +
    + HTMLPURIFIER_PREFIX +
    +
    +
    HTMLPURIFIER_PREFIX in Bootstrap.php
    +
    +
    + HTMLPurifier_Printer +
    +
    +
    HTMLPurifier_Printer in Printer.php
    +
    +
    + HTMLPurifier_Printer_ConfigForm +
    +
    + +
    +
    + HTMLPurifier_Printer_ConfigForm_bool +
    +
    + +
    Bool form field printer
    +
    +
    + HTMLPurifier_Printer_ConfigForm_default +
    +
    + +
    Swiss-army knife configuration form field printer
    +
    +
    + HTMLPurifier_Printer_ConfigForm_NullDecorator +
    +
    + +
    Printer decorator for directives that accept null
    +
    +
    + HTMLPurifier_Printer_CSSDefinition +
    +
    + +
    +
    + HTMLPurifier_Printer_HTMLDefinition +
    +
    + +
    +
    + HTMLPurifier_Strategy +
    +
    +
    HTMLPurifier_Strategy in Strategy.php
    +
    Supertype for classes that define a strategy for modifying/purifying tokens.
    +
    +
    + HTMLPurifier_Strategy_Composite +
    +
    + +
    Composite strategy that runs multiple strategies on tokens.
    +
    +
    + HTMLPurifier_Strategy_Core +
    +
    + +
    Core strategy composed of the big four strategies.
    +
    +
    + HTMLPurifier_Strategy_FixNesting +
    +
    + +
    Takes a well formed list of tokens and fixes their nesting.
    +
    +
    + HTMLPurifier_Strategy_MakeWellFormed +
    +
    + +
    Takes tokens makes them well-formed (balance end tags, etc.)
    +
    +
    + HTMLPurifier_Strategy_RemoveForeignElements +
    +
    +
    HTMLPurifier_Strategy_RemoveForeignElements in RemoveForeignElements.php
    +
    Removes all unrecognized tags from the list of tokens.
    +
    +
    + HTMLPurifier_Strategy_ValidateAttributes +
    +
    + +
    Validate all attributes in the tokens.
    +
    +
    + HTMLPurifier_StringHash +
    +
    +
    HTMLPurifier_StringHash in StringHash.php
    +
    This is in almost every respect equivalent to an array except that it keeps track of which keys were accessed.
    +
    +
    + HTMLPurifier_StringHashParser +
    +
    +
    HTMLPurifier_StringHashParser in StringHashParser.php
    +
    Parses string hash files. File format is as such:
    +
    +
    + HTMLPurifier_TagTransform +
    +
    +
    HTMLPurifier_TagTransform in TagTransform.php
    +
    Defines a mutation of an obsolete tag into a valid tag.
    +
    +
    + HTMLPurifier_TagTransform_Font +
    +
    + +
    Transforms FONT tags to the proper form (SPAN with CSS styling)
    +
    +
    + HTMLPurifier_TagTransform_Simple +
    +
    + +
    Simple transformation, just change tag name to something else, and possibly add some styling. This will cover most of the deprecated tag cases.
    +
    +
    + HTMLPurifier_Token +
    +
    +
    HTMLPurifier_Token in Token.php
    +
    Abstract base token class that all others inherit from.
    +
    +
    + HTMLPurifier_TokenFactory +
    +
    +
    HTMLPurifier_TokenFactory in TokenFactory.php
    +
    Factory for token generation.
    +
    +
    + HTMLPurifier_Token_Comment +
    +
    + +
    Concrete comment token class. Generally will be ignored.
    +
    +
    + HTMLPurifier_Token_Empty +
    +
    + +
    Concrete empty token class.
    +
    +
    + HTMLPurifier_Token_End +
    +
    + +
    Concrete end token class.
    +
    +
    + HTMLPurifier_Token_Start +
    +
    + +
    Concrete start token class.
    +
    +
    + HTMLPurifier_Token_Tag +
    +
    + +
    Abstract class of a tag token (start, end or empty), and its behavior.
    +
    +
    + HTMLPurifier_Token_Text +
    +
    + +
    Concrete text token class.
    +
    +
    + HTMLPurifier_UnitConverter +
    +
    +
    HTMLPurifier_UnitConverter in UnitConverter.php
    +
    Class for converting between different unit-lengths as specified by CSS.
    +
    +
    + HTMLPurifier_URI +
    +
    +
    HTMLPurifier_URI in URI.php
    +
    HTML Purifier's internal representation of a URI.
    +
    +
    + HTMLPurifier_URIDefinition +
    +
    +
    HTMLPurifier_URIDefinition in URIDefinition.php
    +
    Super-class for definition datatype objects, implements serialization functions for the class.
    +
    +
    + HTMLPurifier_URIFilter +
    +
    +
    HTMLPurifier_URIFilter in URIFilter.php
    +
    Chainable filters for custom URI processing.
    +
    +
    + HTMLPurifier_URIFilter_DisableExternal +
    +
    + +
    Chainable filters for custom URI processing.
    +
    +
    + HTMLPurifier_URIFilter_DisableExternalResources +
    +
    +
    HTMLPurifier_URIFilter_DisableExternalResources in DisableExternalResources.php
    +
    Chainable filters for custom URI processing.
    +
    +
    + HTMLPurifier_URIFilter_HostBlacklist +
    +
    + +
    Chainable filters for custom URI processing.
    +
    +
    + HTMLPurifier_URIFilter_MakeAbsolute +
    +
    + +
    Chainable filters for custom URI processing.
    +
    +
    + HTMLPurifier_URIFilter_Munge +
    +
    + +
    Chainable filters for custom URI processing.
    +
    +
    + HTMLPurifier_URIParser +
    +
    +
    HTMLPurifier_URIParser in URIParser.php
    +
    Parses a URI into the components and fragment identifier as specified by RFC 3986.
    +
    +
    + HTMLPurifier_URIScheme +
    +
    +
    HTMLPurifier_URIScheme in URIScheme.php
    +
    Validator for the components of a URI for a specific scheme
    +
    +
    + HTMLPurifier_URISchemeRegistry +
    +
    +
    HTMLPurifier_URISchemeRegistry in URISchemeRegistry.php
    +
    Registry for retrieving specific URI scheme validator objects.
    +
    +
    + HTMLPurifier_URIScheme_ftp +
    +
    + +
    Validates ftp (File Transfer Protocol) URIs as defined by generic RFC 1738.
    +
    +
    + HTMLPurifier_URIScheme_http +
    +
    + +
    Validates http (HyperText Transfer Protocol) as defined by RFC 2616
    +
    +
    + HTMLPurifier_URIScheme_https +
    +
    + +
    Validates https (Secure HTTP) according to http scheme.
    +
    +
    + HTMLPurifier_URIScheme_mailto +
    +
    + +
    Validates mailto (for E-mail) according to RFC 2368
    +
    +
    + HTMLPurifier_URIScheme_news +
    +
    + +
    Validates news (Usenet) as defined by generic RFC 1738
    +
    +
    + HTMLPurifier_URIScheme_nntp +
    +
    + +
    Validates nntp (Network News Transfer Protocol) as defined by generic RFC 1738
    +
    +
    + HTMLPurifier_VarParser +
    +
    +
    HTMLPurifier_VarParser in VarParser.php
    +
    Parses string representations into their corresponding native PHP variable type. The base implementation does a simple type-check.
    +
    +
    + HTMLPurifier_VarParserException +
    +
    +
    HTMLPurifier_VarParserException in VarParserException.php
    +
    Exception type for HTMLPurifier_VarParser
    +
    +
    + HTMLPurifier_VarParser_Flexible +
    +
    + +
    Performs safe variable parsing based on types which can be used by users. This may not be able to represent all possible data inputs, however.
    +
    +
    + HTMLPurifier_VarParser_Native +
    +
    + +
    This variable parser uses PHP's internal code engine. Because it does this, it can represent all inputs; however, it is dangerous and cannot be used by users.
    +
    +
    + Host.php +
    +
    +
    Host.php in Host.php
    +
    +
    + HTMLDefinition.php +
    +
    +
    HTMLDefinition.php in HTMLDefinition.php
    +
    +
    + Hypertext.php +
    +
    +
    Hypertext.php in Hypertext.php
    +
    +
    + HTMLModule.php +
    +
    +
    HTMLModule.php in HTMLModule.php
    +
    +
    + HTMLModuleManager.php +
    +
    +
    HTMLModuleManager.php in HTMLModuleManager.php
    +
    +
    + HTMLDefinition.php +
    +
    +
    HTMLDefinition.php in HTMLDefinition.php
    +
    +
    + HostBlacklist.php +
    +
    +
    HostBlacklist.php in HostBlacklist.php
    +
    +
    + http.php +
    +
    +
    http.php in http.php
    +
    +
    + https.php +
    +
    +
    https.php in https.php
    +
    +
    + HTMLPurifier.auto.php +
    +
    +
    HTMLPurifier.auto.php in HTMLPurifier.auto.php
    +
    +
    + HTMLPurifier.autoload.php +
    +
    +
    HTMLPurifier.autoload.php in HTMLPurifier.autoload.php
    +
    +
    + HTMLPurifier.func.php +
    +
    +
    HTMLPurifier.func.php in HTMLPurifier.func.php
    +
    +
    + HTMLPurifier.includes.php +
    +
    +
    HTMLPurifier.includes.php in HTMLPurifier.includes.php
    +
    +
    + HTMLPurifier.kses.php +
    +
    +
    HTMLPurifier.kses.php in HTMLPurifier.kses.php
    +
    +
    + HTMLPurifier.path.php +
    +
    +
    HTMLPurifier.path.php in HTMLPurifier.path.php
    +
    +
    + HTMLPurifier.php +
    +
    +
    HTMLPurifier.php in HTMLPurifier.php
    +
    +
    + HTMLPurifier.safe-includes.php +
    +
    +
    HTMLPurifier.safe-includes.php in HTMLPurifier.safe-includes.php
    +
    +
    + +
    +
    i
    + +
    +
    +
    +
    + $id +
    +
    + +
    ID of directive, instance of HTMLPurifier_ConfigSchema_Interchange_Id.
    +
    +
    + $ids +
    +
    + +
    Lookup table of IDs we've accumulated.
    +
    +
    + $impact +
    +
    +
    IDS_Event::$impact in Event.php
    +
    Calculated impact
    +
    +
    + $impact +
    +
    +
    IDS_Report::$impact in Report.php
    +
    Impact level
    +
    +
    + $impact +
    +
    +
    IDS_Filter::$impact in Filter.php
    +
    Filter impact level
    +
    +
    + $implementations +
    +
    + +
    +
    + $info +
    +
    + +
    Associative array of element names to HTMLPurifier_ElementDef
    +
    +
    + $info +
    +
    + +
    Local copy of component validators.
    +
    +
    + $info +
    +
    + +
    Assoc array of attribute name to definition object.
    +
    +
    + $info +
    +
    + +
    Associative array of element names to element definitions.
    +
    +
    + $info +
    +
    + +
    Lookup array of attribute string identifiers to concrete implementations
    +
    +
    + $info +
    +
    + +
    Local copy of component validators.
    +
    +
    + $info +
    +
    + +
    Local copy of properties this property is shorthand for.
    +
    +
    + $info +
    +
    + +
    Associative array of attribute collections, indexed by name
    +
    +
    + $info +
    +
    + +
    Local copy of component validators.
    +
    +
    + $info +
    +
    + +
    Definition of the directives. The structure of this is:
    +
    +
    + $info +
    +
    + +
    List of content set strings (pipe seperators) indexed by name.
    +
    +
    + $info_attr_transform_post +
    +
    + +
    List of HTMLPurifier_AttrTransform to be performed after validation.
    +
    +
    + $info_attr_transform_post +
    +
    + +
    Indexed list of HTMLPurifier_AttrTransform to be performed after validation.
    +
    +
    + $info_attr_transform_pre +
    +
    + +
    Indexed list of HTMLPurifier_AttrTransform to be performed before validation.
    +
    +
    + $info_attr_transform_pre +
    +
    + +
    List of HTMLPurifier_AttrTransform to be performed before validation.
    +
    +
    + $info_block_wrapper +
    +
    + +
    String name of element used to wrap inline elements in block context
    +
    +
    + $info_content_sets +
    +
    + +
    Nested lookup array of content set name (Block, Inline) to element name to whether or not it belongs in that content set.
    +
    +
    + $info_global_attr +
    +
    + +
    Associative array of global attribute name to attribute definition.
    +
    +
    + $info_injector +
    +
    + +
    Indexed list of HTMLPurifier_Injector to be used.
    +
    +
    + $info_injector +
    +
    + +
    List of HTMLPurifier_Injector to be performed during well-formedness fixing.
    +
    +
    + $info_parent +
    +
    + +
    String name of parent element HTML will be going into.
    +
    +
    + $info_parent_def +
    +
    + +
    Definition for parent element, allows parent element to be a tag that's not allowed inside the HTML fragment.
    +
    +
    + $info_tag_transform +
    +
    + +
    Associative array of deprecated tag name to HTMLPurifier_TagTransform
    +
    +
    + $info_tag_transform +
    +
    + +
    Associative array of deprecated tag name to HTMLPurifier_TagTransform
    +
    +
    + $init +
    +
    + +
    +
    + $injectors +
    +
    + +
    Injectors active in this stream processing.
    +
    +
    + $inline +
    +
    + +
    Instance of the definition object to use when inline. Usually stricter.
    +
    +
    + $inputIndex +
    +
    + +
    Reference to InputIndex variable in Context. This is an integer array index for $this->inputTokens that indicates what token is currently being processed.
    +
    +
    + $inputTokens +
    +
    + +
    Reference to InputTokens variable in Context. This is an array list of the input tokens that are being processed.
    +
    +
    + $interchange +
    +
    + +
    Easy to access global objects.
    +
    +
    + $interchange +
    +
    + +
    +
    + $internalPrecision +
    +
    + +
    Bcmath precision for internal calculations.
    +
    +
    + $intValidator +
    +
    + +
    +
    + $ip4 +
    +
    + +
    IPv4 regex, protected so that IPv6 can reuse it
    +
    +
    + $ipv4 +
    +
    + +
    Instance of HTMLPurifier_AttrDef_URI_IPv4 sub-validator
    +
    +
    + $ipv6 +
    +
    + +
    Instance of HTMLPurifier_AttrDef_URI_IPv6 sub-validator
    +
    +
    + $isValid +
    +
    + +
    Whether or not this length is valid. Null if not calculated yet.
    +
    +
    + $is_tag +
    +
    + +
    Static bool marker that indicates the class is a tag.
    +
    +
    + $is_whitespace +
    +
    + +
    < Parsed character data of text.
    +
    +
    + Interface.php +
    +
    +
    Interface.php in Interface.php
    +
    +
    + id +
    +
    + +
    Convenience function that creates an HTMLPurifier_ConfigSchema_Interchange_Id object based on a string Id.
    +
    +
    + IDS_Caching +
    +
    +
    IDS_Caching in Factory.php
    +
    Caching factory
    +
    +
    + IDS_Caching_Database +
    +
    +
    IDS_Caching_Database in Database.php
    +
    Database caching wrapper
    +
    +
    + IDS_Caching_File +
    +
    +
    IDS_Caching_File in File.php
    +
    File caching wrapper
    +
    +
    + IDS_Caching_Interface +
    +
    +
    IDS_Caching_Interface in Interface.php
    +
    Caching wrapper interface
    +
    +
    + IDS_Caching_Memcached +
    +
    +
    IDS_Caching_Memcached in Memcached.php
    +
    File caching wrapper
    +
    +
    + IDS_Caching_Session +
    +
    +
    IDS_Caching_Session in Session.php
    +
    File caching wrapper
    +
    +
    + IDS_Converter +
    +
    +
    IDS_Converter in Converter.php
    +
    PHPIDS specific utility class to convert charsets manually
    +
    +
    + IDS_Event +
    +
    +
    IDS_Event in Event.php
    +
    PHPIDS event object
    +
    +
    + IDS_Filter +
    +
    +
    IDS_Filter in Filter.php
    +
    PHPIDS Filter object
    +
    +
    + IDS_Filter_Storage +
    +
    +
    IDS_Filter_Storage in Storage.php
    +
    Filter Storage
    +
    +
    + IDS_Init +
    +
    +
    IDS_Init in Init.php
    +
    Framework initiation
    +
    +
    + IDS_Log_Composite +
    +
    +
    IDS_Log_Composite in Composite.php
    +
    Log Composite
    +
    +
    + IDS_Log_Database +
    +
    +
    IDS_Log_Database in Database.php
    +
    Database logging wrapper
    +
    +
    + IDS_Log_Email +
    +
    +
    IDS_Log_Email in Email.php
    +
    Email logging wrapper
    +
    +
    + IDS_Log_File +
    +
    +
    IDS_Log_File in File.php
    +
    File logging wrapper
    +
    +
    + IDS_Log_Interface +
    +
    +
    IDS_Log_Interface in Interface.php
    +
    Interface for logging wrappers
    +
    +
    + IDS_Monitor +
    +
    +
    IDS_Monitor in Monitor.php
    +
    Monitoring engine
    +
    +
    + IDS_Report +
    +
    +
    IDS_Report in Report.php
    +
    PHPIDS report object
    +
    +
    + init +
    +
    +
    IDS_Init::init() in Init.php
    +
    Returns an instance of this class. Also a PHP version check is being performed to avoid compatibility problems with PHP < 5.1.6
    +
    +
    + Init.php +
    +
    +
    Init.php in Init.php
    +
    +
    + INIT_PHASE +
    +
    + +
    +
    + instance +
    +
    + +
    Retrieves an instance of global definition cache factory.
    +
    +
    + instance +
    +
    +
    HTMLPurifier::instance() in HTMLPurifier.php
    +
    Singleton for enforcing just one HTML Purifier in your system
    +
    +
    + instance +
    +
    + +
    Retrieve sole instance of the factory.
    +
    +
    + instance +
    +
    + +
    Retrieves an instance of the application-wide configuration definition.
    +
    +
    + instance +
    +
    + +
    Retrieves sole instance of the object.
    +
    +
    + instance +
    +
    + +
    Retrieve sole instance of the registry.
    +
    +
    + INT +
    +
    + +
    +
    + IN_BODY +
    +
    + +
    +
    + IN_CAPTION +
    +
    + +
    +
    + IN_CELL +
    +
    + +
    +
    + IN_CGROUP +
    +
    + +
    +
    + IN_FRAME +
    +
    + +
    +
    + IN_HEAD +
    +
    + +
    +
    + IN_ROW +
    +
    + +
    +
    + IN_SELECT +
    +
    + +
    +
    + IN_TABLE +
    +
    + +
    +
    + IN_TBODY +
    +
    + +
    +
    + isEmpty +
    +
    +
    IDS_Report::isEmpty() in Report.php
    +
    Checks if any events are registered
    +
    +
    + isFinalized +
    +
    + +
    Checks whether or not the configuration object is finalized.
    +
    +
    + isOld +
    +
    + +
    Tests whether or not a key is old with respect to the configuration's version and revision number.
    +
    +
    + isSpamAttempt +
    +
    + +
    Detects spam attempts
    +
    +
    + ISTRING +
    +
    + +
    +
    + isValid +
    +
    + +
    Returns true if this length unit is valid.
    +
    +
    + ITEXT +
    +
    + +
    +
    + Interface.php +
    +
    +
    Interface.php in Interface.php
    +
    +
    + ImportantDecorator.php +
    +
    +
    ImportantDecorator.php in ImportantDecorator.php
    +
    +
    + ID.php +
    +
    +
    ID.php in ID.php
    +
    +
    + Integer.php +
    +
    +
    Integer.php in Integer.php
    +
    +
    + IPv4.php +
    +
    +
    IPv4.php in IPv4.php
    +
    +
    + IPv6.php +
    +
    +
    IPv6.php in IPv6.php
    +
    +
    + ImgRequired.php +
    +
    +
    ImgRequired.php in ImgRequired.php
    +
    +
    + ImgSpace.php +
    +
    +
    ImgSpace.php in ImgSpace.php
    +
    +
    + Input.php +
    +
    +
    Input.php in Input.php
    +
    +
    + Id.php +
    +
    +
    Id.php in Id.php
    +
    +
    + Interchange.php +
    +
    +
    Interchange.php in Interchange.php
    +
    +
    + InterchangeBuilder.php +
    +
    +
    InterchangeBuilder.php in InterchangeBuilder.php
    +
    +
    + Image.php +
    +
    +
    Image.php in Image.php
    +
    +
    + IDAccumulator.php +
    +
    +
    IDAccumulator.php in IDAccumulator.php
    +
    +
    + Injector.php +
    +
    +
    Injector.php in Injector.php
    +
    +
    + +
    +
    k
    + +
    +
    +
    +
    + $keys +
    +
    + +
    Synchronized list of defined content sets (keys of info)
    +
    +
    + $keys +
    +
    + +
    Valid keys in the HTMLPurifier_Language object. Designates which variables to slurp out of a message file.
    +
    +
    + kses +
    +
    +
    kses() in HTMLPurifier.kses.php
    +
    +
    + +
    +
    l
    + +
    +
    +
    +
    + $length +
    +
    + +
    +
    + $levels +
    +
    + +
    List of supported levels. Index zero is a special case "no fixes" level.
    +
    +
    + $line +
    +
    + +
    +
    + $lines +
    +
    + +
    +
    + $locale +
    +
    + +
    +
    + $loggers +
    +
    + +
    Holds registered logging wrapper
    +
    +
    + $lookup +
    +
    + +
    List of content set lookups (element => true) indexed by name.
    +
    +
    + LINENO +
    +
    + +
    Identifiers for the returned error array. These are purposely numeric so list() can be used.
    +
    +
    + listify +
    +
    + +
    Takes a list of strings and turns them into a single list
    +
    +
    + listify +
    +
    + +
    Converts an array list into a string readable representation
    +
    +
    + listifyAttr +
    +
    + +
    Listifies a hash of attributes to AttrDef classes
    +
    +
    + listifyObjectList +
    +
    + +
    Listifies a list of objects by retrieving class names and internal state
    +
    +
    + listifyTagLookup +
    +
    + +
    Listifies a tag lookup table.
    +
    +
    + load +
    +
    + +
    Loads language object with necessary info from factory cache
    +
    +
    + load +
    +
    + +
    Load a list of IDs into the lookup table
    +
    +
    + loadArray +
    +
    + +
    Loads configuration values from an array with the following structure:
    +
    +
    + loadArray +
    +
    + +
    Loads a series of variables from an associative array
    +
    +
    + loadArrayFromForm +
    +
    + +
    Loads configuration values from $_GET/$_POST that were posted
    +
    +
    + loadIni +
    +
    + +
    Loads configuration values from an ini file
    +
    +
    + loadLanguage +
    +
    + +
    Loads language into the cache, handles message file and fallbacks
    +
    +
    + LOOKUP +
    +
    + +
    +
    + lookup +
    +
    + +
    Converts an array list into a lookup array.
    +
    +
    + Length.php +
    +
    +
    Length.php in Length.php
    +
    +
    + ListStyle.php +
    +
    +
    ListStyle.php in ListStyle.php
    +
    +
    + Length.php +
    +
    +
    Length.php in Length.php
    +
    +
    + LinkTypes.php +
    +
    +
    LinkTypes.php in LinkTypes.php
    +
    +
    + Lang.php +
    +
    +
    Lang.php in Lang.php
    +
    +
    + Lang.php +
    +
    +
    Lang.php in Lang.php
    +
    +
    + Length.php +
    +
    +
    Length.php in Length.php
    +
    +
    + Legacy.php +
    +
    +
    Legacy.php in Legacy.php
    +
    +
    + List.php +
    +
    +
    List.php in List.php
    +
    +
    + Linkify.php +
    +
    +
    Linkify.php in Linkify.php
    +
    +
    + Language.php +
    +
    +
    Language.php in Language.php
    +
    +
    + LanguageFactory.php +
    +
    +
    LanguageFactory.php in LanguageFactory.php
    +
    +
    + Length.php +
    +
    +
    Length.php in Length.php
    +
    +
    + Lexer.php +
    +
    +
    Lexer.php in Lexer.php
    +
    +
    + +
    +
    m
    + +
    +
    +
    +
    + $manager +
    +
    + +
    +
    + $max +
    +
    + +
    +
    + $max +
    +
    + +
    Max number of values allowed.
    +
    +
    + $max +
    +
    + +
    +
    + $member +
    +
    + +
    +
    + $mergeable_keys_list +
    +
    + +
    Keys whose contents are a list and can be merged
    +
    +
    + $mergeable_keys_map +
    +
    + +
    Keys whose contents are a hash map and can be merged
    +
    +
    + $messages +
    +
    + +
    Array of localizable messages
    +
    +
    + $min +
    +
    + +
    +
    + $minimized +
    +
    + +
    +
    + $minimized +
    +
    + +
    Tells us whether or not an HTML attribute is minimized. Has no meaning in other contexts.
    +
    +
    + $modules +
    +
    + +
    List of standard modules (string identifiers or literal objects)
    +
    +
    + $modules +
    +
    + +
    Active instances of modules for the specified doctype are indexed, by name, in this array.
    +
    +
    + Memcached.php +
    +
    +
    Memcached.php in Memcached.php
    +
    +
    + MAIN_PHASE +
    +
    + +
    +
    + make +
    +
    + +
    +
    + make +
    +
    + +
    +
    + make +
    +
    + +
    +
    + make +
    +
    + +
    +
    + make +
    +
    + +
    Factory method for creating this class from a string.
    +
    +
    + make +
    +
    + +
    Creates a doctype based on a configuration object,
    +
    +
    + make +
    +
    + +
    +
    + make +
    +
    + +
    +
    + makeFixes +
    +
    + +
    +
    + makeFixes +
    +
    + +
    +
    + makeFixes +
    +
    + +
    Defines all fixes the module will perform in a compact associative array of fix name to fix implementation.
    +
    +
    + makeFixes +
    +
    + +
    +
    + makeFixes +
    +
    + +
    +
    + makeFixes +
    +
    + +
    +
    + makeFixesForLevel +
    +
    + +
    Dynamically populates the $fixesForLevel member variable using the fixes array. It may be custom overloaded, used in conjunction with $defaultLevel, or not used at all.
    +
    +
    + makeFromSerial +
    +
    + +
    Unserializes the default ConfigSchema.
    +
    +
    + makeLookup +
    +
    + +
    Convenience function that generates a lookup table with boolean true as value.
    +
    +
    + makeReplace +
    +
    + +
    +
    + MARKER +
    +
    + +
    +
    + match +
    +
    +
    IDS_Filter::match() in Filter.php
    +
    Matches a string against current filter
    +
    +
    + mergeArrayFromForm +
    +
    + +
    Merges in configuration values from $_GET/$_POST to object. NOT STATIC.
    +
    +
    + mergeIn +
    +
    + +
    Merges the values of another element definition into this one.
    +
    +
    + mergeInAttrIncludes +
    +
    + +
    Convenience function that merges a list of attribute includes into an attribute array.
    +
    +
    + MESSAGE +
    +
    + +
    +
    + METRIC +
    +
    + +
    +
    + MIXED +
    +
    + +
    +
    + Monitor.php +
    +
    +
    Monitor.php in Monitor.php
    +
    +
    + mungeRgb +
    +
    + +
    Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work
    +
    +
    + muteErrorHandler +
    +
    + +
    An error handler that mutes all errors
    +
    +
    + Multiple.php +
    +
    +
    Multiple.php in Multiple.php
    +
    +
    + MultiLength.php +
    +
    +
    MultiLength.php in MultiLength.php
    +
    +
    + Memory.php +
    +
    +
    Memory.php in Memory.php
    +
    +
    + MakeWellFormed.php +
    +
    +
    MakeWellFormed.php in MakeWellFormed.php
    +
    +
    + MakeAbsolute.php +
    +
    +
    MakeAbsolute.php in MakeAbsolute.php
    +
    +
    + Munge.php +
    +
    +
    Munge.php in Munge.php
    +
    +
    + mailto.php +
    +
    +
    mailto.php in mailto.php
    +
    +
    + +
    +
    n
    + +
    +
    +
    +
    + $n +
    +
    + +
    String numeric magnitude.
    +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    Name config attribute to pull.
    +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    Unique identifier of filter
    +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    The lower-case name of the tag, like 'a', 'b' or 'blockquote'.
    +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    Name of the filter for identification purposes
    +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    Advisory name of injector, this is for friendly error messages
    +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    Full name of doctype
    +
    +
    + $name +
    +
    + +
    Directive being aliased to
    +
    +
    + $name +
    +
    + +
    Name of form element to stuff config in
    +
    +
    + $name +
    +
    + +
    Name of the application this schema is describing.
    +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    +
    IDS_Event::$name in Event.php
    +
    Event name
    +
    +
    + $name +
    +
    + +
    Short unique string identifier of the module
    +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $name +
    +
    + +
    +
    + $namespace +
    +
    + +
    +
    + $namespace +
    +
    + +
    Name of namespace defined.
    +
    +
    + $namespace +
    +
    + +
    Namespace being aliased to
    +
    +
    + $namespaces +
    +
    + +
    Array of Namespace ID => array(namespace info)
    +
    +
    + $needed +
    +
    + +
    +
    + $needed +
    +
    + +
    +
    + $needed +
    +
    + +
    +
    + $needed +
    +
    + +
    +
    + $needed +
    +
    + +
    +
    + $needed +
    +
    + +
    Array of elements and attributes this injector creates and therefore
    +
    +
    + $negative +
    +
    + +
    Bool indicating whether or not negative values are allowed
    +
    +
    + $non_negative +
    +
    + +
    Bool indicating whether or not only positive values allowed.
    +
    +
    + $number_def +
    +
    + +
    Instance of HTMLPurifier_AttrDef_CSS_Number to defer number validation
    +
    +
    + nonSpecialEntityCallback +
    +
    + +
    Callback function for substituteNonSpecialEntities() that does the work.
    +
    +
    + normalize +
    +
    + +
    Fix up percent-encoding by decoding unreserved characters and normalizing.
    +
    +
    + normalize +
    +
    + +
    Takes a piece of HTML and normalizes it by converting entities, fixing encoding, extracting bits, and other good stuff.
    +
    +
    + notifyEnd +
    +
    + +
    Notifier that is called when an end token is processed
    +
    +
    + Number.php +
    +
    +
    Number.php in Number.php
    +
    +
    + Nmtokens.php +
    +
    +
    Nmtokens.php in Nmtokens.php
    +
    +
    + Name.php +
    +
    +
    Name.php in Name.php
    +
    +
    + Namespace.php +
    +
    +
    Namespace.php in Namespace.php
    +
    +
    + Namespace.php +
    +
    +
    Namespace.php in Namespace.php
    +
    +
    + Null.php +
    +
    +
    Null.php in Null.php
    +
    +
    + Name.php +
    +
    +
    Name.php in Name.php
    +
    +
    + NonXMLCommonAttributes.php +
    +
    +
    NonXMLCommonAttributes.php in NonXMLCommonAttributes.php
    +
    +
    + Name.php +
    +
    +
    Name.php in Name.php
    +
    +
    + news.php +
    +
    +
    news.php in news.php
    +
    +
    + nntp.php +
    +
    +
    nntp.php in nntp.php
    +
    +
    + Native.php +
    +
    +
    Native.php in Native.php
    +
    +
    + +
    +
    o
    + +
    +
    +
    +
    + $obj +
    +
    + +
    Printer being decorated
    +
    +
    + $obj +
    +
    + +
    +
    + $objectStack +
    +
    + +
    +
    + $ourHostParts +
    +
    + +
    +
    + $outputPrecision +
    +
    + +
    Minimum bcmath precision for output.
    +
    +
    + offsetGet +
    +
    + +
    Retrieves a value, and logs the access.
    +
    +
    + openHandler +
    +
    + +
    Open tag event handler, interface is defined by PEAR package.
    +
    +
    + Optional.php +
    +
    +
    Optional.php in Optional.php
    +
    +
    + Object.php +
    +
    +
    Object.php in Object.php
    +
    +
    + +
    +
    p
    + +
    +
    +
    +
    + $paramStack +
    +
    + +
    +
    + $parser +
    +
    + +
    HTMLPurifier_VarParser to test default's type.
    +
    +
    + $parser +
    +
    + +
    +
    + $parser +
    +
    + +
    Parser for variables
    +
    +
    + $path +
    +
    + +
    +
    + $percentage +
    +
    + +
    +
    + $percentEncoder +
    +
    + +
    Instance of HTMLPurifier_PercentEncoder to do normalization with.
    +
    +
    + $pixels +
    +
    + +
    +
    + $port +
    +
    + +
    +
    + $positive +
    +
    + +
    Bool indicating whether or not positive values are allowed
    +
    +
    + $post +
    +
    + +
    True if this filter should be run after scheme validation.
    +
    +
    + $post +
    +
    + +
    +
    + $postFilters +
    +
    + +
    +
    + $prefixes +
    +
    + +
    List of prefixes we should use for registering small names
    +
    +
    + $preserve +
    +
    + +
    Reserved characters to preserve when using encode().
    +
    +
    + parse +
    +
    + +
    Validate a variable according to type. Throws HTMLPurifier_VarParserException if invalid.
    +
    +
    + parse +
    +
    + +
    Parses a URI.
    +
    +
    + parseAttributeString +
    +
    + +
    Takes the inside of an HTML tag and makes an assoc array of attributes.
    +
    +
    + parseCDATA +
    +
    + +
    Convenience method that parses a string as if it were CDATA.
    +
    +
    + parseContents +
    +
    + +
    Convenience function that transforms single-string contents
    +
    +
    + parseData +
    +
    + +
    Parses special entities into the proper characters.
    +
    +
    + parseFile +
    +
    + +
    Parses a file that contains a single string-hash.
    +
    +
    + parseHandle +
    +
    + +
    Internal parser that acepts a file handle.
    +
    +
    + parseImplementation +
    +
    + +
    Actually implements the parsing. Base implementation is to not
    +
    +
    + parseImplementation +
    +
    + +
    +
    + parseImplementation +
    +
    + +
    +
    + parseMultiFile +
    +
    + +
    Parses a file that contains multiple string-hashes delimited by '----'
    +
    +
    + parseTinyMCEAllowedList +
    +
    + +
    Parses a TinyMCE-flavored Allowed Elements and Attributes list into separate lists for processing. Format is element[attr1|attr2],element2...
    +
    +
    + PCDATA +
    +
    +
    HTML5::PCDATA in PH5P.php
    +
    +
    + performInclusions +
    +
    + +
    Takes a reference to an attribute associative array and performs all inclusions specified by the zero index.
    +
    +
    + PHP_EOL +
    +
    +
    PHP_EOL in Bootstrap.php
    +
    +
    + PHRASING +
    +
    + +
    +
    + PLAINTEXT +
    +
    +
    HTML5::PLAINTEXT in PH5P.php
    +
    +
    + populate +
    +
    + +
    Populates the module with transforms and other special-case code
    +
    +
    + position +
    +
    + +
    Sets the position of the token in the source document.
    +
    +
    + postFilter +
    +
    + +
    Post-processor function, handles HTML after HTML Purifier
    +
    +
    + postFilter +
    +
    + +
    +
    + postFilter +
    +
    + +
    +
    + postProcess +
    +
    + +
    Replaces any stdclass that only has the type property with type integer.
    +
    +
    + preFilter +
    +
    + +
    +
    + preFilter +
    +
    + +
    Removes inline <style> tags from HTML, saves them for later use
    +
    +
    + preFilter +
    +
    + +
    Pre-processor function, handles HTML before HTML Purifier
    +
    +
    + prepare +
    +
    + +
    +
    + prepare +
    +
    + +
    +
    + prepare +
    +
    + +
    Performs initialization for the filter
    +
    +
    + prepare +
    +
    + +
    +
    + prepare +
    +
    + +
    +
    + prepare +
    +
    + +
    +
    + prepare +
    +
    + +
    +
    + prepare +
    +
    + +
    Prepares the injector by giving it the config and context objects: this allows references to important variables to be made within the injector. This function also checks if the HTML environment will work with the Injector (see checkNeeded()).
    +
    +
    + prepare +
    +
    + +
    +
    + prepareArrayFromForm +
    +
    + +
    Prepares an array from a form into something usable for the more
    +
    +
    + prepareData +
    +
    + +
    Prepares data
    +
    +
    + prepareData +
    +
    + +
    Prepares data
    +
    +
    + prepareGenerator +
    +
    + +
    Give generator necessary configuration if possible
    +
    +
    + prependCSS +
    +
    + +
    Prepends CSS properties to the style attribute, creating the attribute if it doesn't exist.
    +
    +
    + prependCSS +
    +
    + +
    Prepends CSS properties to the style attribute, creating the attribute if it doesn't exist.
    +
    +
    + processModule +
    +
    + +
    Takes a module and adds it to the active module collection, registering it if necessary.
    +
    +
    + processModules +
    +
    + +
    Extract out the information from the manager
    +
    +
    + processToken +
    +
    + +
    Processes arbitrary token values for complicated substitution patterns.
    +
    +
    + purify +
    +
    +
    HTMLPurifier::purify() in HTMLPurifier.php
    +
    Filters an HTML snippet/document to be XSS-free and standards-compliant.
    +
    +
    + purifyArray +
    +
    +
    HTMLPurifier::purifyArray() in HTMLPurifier.php
    +
    Filters an array of HTML snippets
    +
    +
    + Percentage.php +
    +
    +
    Percentage.php in Percentage.php
    +
    +
    + Pixels.php +
    +
    +
    Pixels.php in Pixels.php
    +
    +
    + Presentation.php +
    +
    +
    Presentation.php in Presentation.php
    +
    +
    + Proprietary.php +
    +
    +
    Proprietary.php in Proprietary.php
    +
    +
    + Proprietary.php +
    +
    +
    Proprietary.php in Proprietary.php
    +
    +
    + PurifierLinkify.php +
    +
    +
    PurifierLinkify.php in PurifierLinkify.php
    +
    +
    + PEARSax3.php +
    +
    +
    PEARSax3.php in PEARSax3.php
    +
    +
    + PH5P.php +
    +
    +
    PH5P.php in PH5P.php
    +
    +
    + PercentEncoder.php +
    +
    +
    PercentEncoder.php in PercentEncoder.php
    +
    +
    + Printer.php +
    +
    +
    Printer.php in Printer.php
    +
    +
    + +
    +
    q
    + +
    +
    +
    +
    + $query +
    +
    + +
    +
    + +
    +
    r
    + +
    +
    +
    +
    + $real_elements +
    +
    + +
    +
    + $registeredFilters +
    +
    + +
    +
    + $registeredModules +
    +
    + +
    Array of recognized HTMLPurifier_Module instances, indexed by module's class name. This array is usually lazy loaded, but a user can overload a module by pre-emptively registering it.
    +
    +
    + $replace +
    +
    + +
    +
    + $required +
    +
    + +
    Tells us whether or not an HTML attribute is required. Has no
    +
    +
    + $required_attr +
    +
    + +
    List of the names of required attributes this element has. Dynamically
    +
    +
    + $rewind +
    +
    + +
    +
    + $rewind +
    +
    + +
    Index of inputTokens to rewind to.
    +
    +
    + $rows +
    +
    + +
    +
    + $rule +
    +
    +
    IDS_Filter::$rule in Filter.php
    +
    Filter rule
    +
    +
    + rawPosition +
    +
    + +
    Convenience function for DirectLex settings line/col position.
    +
    +
    + RCDATA +
    +
    +
    HTML5::RCDATA in PH5P.php
    +
    +
    + register +
    +
    + +
    Registers a doctype to the registry
    +
    +
    + register +
    +
    + +
    Registers a custom scheme to the cache, bypassing reflection.
    +
    +
    + register +
    +
    + +
    Registers a new definition cache object
    +
    +
    + register +
    +
    + +
    Registers a variable into the context.
    +
    +
    + registerAutoload +
    +
    + +
    "Pre-registers" our autoloader on the SPL stack.
    +
    +
    + registerFilter +
    +
    + +
    +
    + registerModule +
    +
    + +
    Registers a module to the recognized module list, useful for overloading pre-existing modules.
    +
    +
    + remove +
    +
    + +
    +
    + remove +
    +
    + +
    Removes a definition object to the cache
    +
    +
    + remove +
    +
    + +
    +
    + remove +
    +
    + +
    +
    + removeLogger +
    +
    + +
    Removes a logger
    +
    +
    + render +
    +
    + +
    +
    + render +
    +
    + +
    +
    + render +
    +
    + +
    +
    + render +
    +
    + +
    +
    + render +
    +
    + +
    +
    + render +
    +
    + +
    Returns HTML output for a configuration form
    +
    +
    + renderChildren +
    +
    + +
    Renders a row describing the allowed children of an element
    +
    +
    + renderContentSets +
    +
    + +
    Renders the Content Sets table
    +
    +
    + renderDoctype +
    +
    + +
    Renders the Doctype table
    +
    +
    + renderEnvironment +
    +
    + +
    Renders environment table, which is miscellaneous info
    +
    +
    + renderInfo +
    +
    + +
    Renders the Elements ($info) table
    +
    +
    + renderNamespace +
    +
    + +
    Renders a single namespace
    +
    +
    + replace +
    +
    + +
    +
    + replace +
    +
    + +
    +
    + replace +
    +
    + +
    Replace an object in the cache
    +
    +
    + replace +
    +
    + +
    +
    + replace +
    +
    + +
    +
    + replace +
    +
    + +
    +
    + Report.php +
    +
    +
    Report.php in Report.php
    +
    +
    + resetAccessed +
    +
    + +
    Resets the access array.
    +
    +
    + rewind +
    +
    + +
    Rewind to a spot to re-perform processing. This is useful if you deleted a node, and now need to see if this change affected any earlier nodes. Rewinding does not affect other injectors, and can result in infinite loops if not used carefully.
    +
    +
    + ROOT_PHASE +
    +
    + +
    +
    + row +
    +
    + +
    Prints a simple key/value row in a table.
    +
    +
    + run +
    +
    +
    IDS_Monitor::run() in Monitor.php
    +
    Starts the scan mechanism
    +
    +
    + runAll +
    +
    +
    IDS_Converter::runAll() in Converter.php
    +
    Runs all converter functions
    +
    +
    + runCentrifuge +
    +
    + +
    This method is the centrifuge prototype
    +
    +
    + Required.php +
    +
    +
    Required.php in Required.php
    +
    +
    + Ruby.php +
    +
    +
    Ruby.php in Ruby.php
    +
    +
    + RemoveEmpty.php +
    +
    +
    RemoveEmpty.php in RemoveEmpty.php
    +
    +
    + RemoveForeignElements.php +
    +
    +
    RemoveForeignElements.php in RemoveForeignElements.php
    +
    +
    + +
    +
    s
    + +
    +
    +
    +
    + $safe +
    +
    + +
    +
    + $safe +
    +
    + +
    Boolean flag whether or not this module is safe. If it is not safe, all
    +
    +
    + $safe +
    +
    + +
    +
    + $safe +
    +
    + +
    +
    + $scanKeys +
    +
    +
    IDS_Monitor::$scanKeys in Monitor.php
    +
    Scan keys switch
    +
    +
    + $scheme +
    +
    + +
    +
    + $schemes +
    +
    + +
    Cache of retrieved schemes.
    +
    +
    + $serial +
    +
    + +
    Serial for entire configuration object
    +
    +
    + $serials +
    +
    + +
    Namespace indexed array of serials for specific namespaces (see getSerial() for more info).
    +
    +
    + $setup +
    +
    + +
    Has setup() been called yet?
    +
    +
    + $single +
    +
    + +
    Instance of component definition to defer validation to.
    +
    +
    + $singleton +
    +
    + +
    Application-wide singleton
    +
    +
    + $skip +
    +
    + +
    Used during MakeWellFormed.
    +
    +
    + $source +
    +
    + +
    Filter source file
    +
    +
    + $stack +
    +
    + +
    Current nesting of elements.
    +
    +
    + $stack +
    +
    + +
    +
    + $standalone +
    +
    + +
    Does the definition work by itself, or is it created solely
    +
    +
    + $start +
    +
    + +
    Token that started this node. Added by MakeWellFormed. Please
    +
    +
    + $strategies +
    +
    + +
    List of strategies to run tokens through.
    +
    +
    + $strategy +
    +
    +
    HTMLPurifier::$strategy in HTMLPurifier.php
    +
    +
    + $stringTypes +
    +
    + +
    Lookup table of types that are string, and can have aliases or allowed value lists.
    +
    +
    + $style +
    +
    + +
    +
    + Session.php +
    +
    +
    Session.php in Session.php
    +
    +
    + Storage.php +
    +
    +
    Storage.php in Storage.php
    +
    +
    + save +
    +
    + +
    +
    + save +
    +
    +
    HTML5::save() in PH5P.php
    +
    +
    + SCOPING +
    +
    + +
    +
    + scriptCallback +
    +
    + +
    Callback function for script CDATA fudge
    +
    +
    + send +
    +
    + +
    Sends an email
    +
    +
    + send +
    +
    + +
    Sends an error message to the collector for later use
    +
    +
    + set +
    +
    + +
    +
    + set +
    +
    + +
    Sets a new implementation for a type
    +
    +
    + set +
    +
    + +
    +
    + set +
    +
    + +
    +
    + set +
    +
    + +
    +
    + set +
    +
    + +
    +
    + set +
    +
    + +
    Unconditionally saves a definition object to the cache
    +
    +
    + set +
    +
    + +
    Sets a value to configuration.
    +
    +
    + setCache +
    +
    + +
    Writes cache data into the session
    +
    +
    + setCache +
    +
    + +
    Interface method
    +
    +
    + setCache +
    +
    + +
    Writes cache data
    +
    +
    + setCache +
    +
    + +
    Writes cache data into the file
    +
    +
    + setCache +
    +
    + +
    Writes cache data into the database
    +
    +
    + setCentrifuge +
    +
    + +
    This method sets the centrifuge property
    +
    +
    + setConfig +
    +
    + +
    Merges new settings into the exsiting ones or overwrites them
    +
    +
    + setConfigPath +
    +
    + +
    Sets the path to the configuration file
    +
    +
    + setExceptions +
    +
    + +
    Sets exception array
    +
    +
    + setFilterSet +
    +
    + +
    Sets the filter array
    +
    +
    + setHtml +
    +
    +
    IDS_Monitor::setHtml() in Monitor.php
    +
    Sets html array
    +
    +
    + setJson +
    +
    +
    IDS_Monitor::setJson() in Monitor.php
    +
    Sets json array
    +
    +
    + setTextareaDimensions +
    +
    + +
    Sets default column and row size for textareas in sub-printers
    +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    Lazy load construction of the module after determining whether or not it's needed, and also when a finalized configuration object is available.
    +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    Setup function that aborts if already setup
    +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    Lazy load constructs the module by determining the necessary fixes to create and then delegating to the populate() function.
    +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    +
    HTMLPurifier_DefinitionCacheFactory::setup() in DefinitionCacheFactory.php
    +
    Initialize default decorators
    +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    Sets up the entity lookup table from the serialized file contents.
    +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    +
    + setup +
    +
    + +
    Performs processing on modules, after being called you may
    +
    +
    + setup +
    +
    + +
    Sets up the singleton, much like a constructor
    +
    +
    + setupConfigStuff +
    +
    + +
    Sets up stuff based on config. We need a better way of doing this.
    +
    +
    + setupConfigStuff +
    +
    + +
    Performs extra config-based processing. Based off of HTMLPurifier_HTMLDefinition.
    +
    +
    + setupFilters +
    +
    + +
    +
    + setupMemberVariables +
    +
    + +
    +
    + SEVERITY +
    +
    + +
    +
    + SPECIAL +
    +
    + +
    +
    + specialEntityCallback +
    +
    + +
    Callback function for substituteSpecialEntities() that does the work.
    +
    +
    + start +
    +
    + +
    Returns a start tag
    +
    +
    + STARTTAG +
    +
    +
    HTML5::STARTTAG in PH5P.php
    +
    +
    + STRING +
    +
    + +
    +
    + styleCallback +
    +
    + +
    Save the contents of CSS blocks to style matches
    +
    +
    + substituteNonSpecialEntities +
    +
    + +
    Substitutes non-special entities with their parsed equivalents. Since running this whenever you have parsed character is t3h 5uck, we run it before everything else.
    +
    +
    + substituteSpecialEntities +
    +
    + +
    Substitutes only special entities with their parsed equivalents.
    +
    +
    + substrCount +
    +
    + +
    PHP 5.0.x compatible substr_count that implements offset and length
    +
    +
    + Switch.php +
    +
    +
    Switch.php in Switch.php
    +
    +
    + SimpleCheck.php +
    +
    +
    SimpleCheck.php in SimpleCheck.php
    +
    +
    + SafeEmbed.php +
    +
    +
    SafeEmbed.php in SafeEmbed.php
    +
    +
    + SafeObject.php +
    +
    +
    SafeObject.php in SafeObject.php
    +
    +
    + SafeParam.php +
    +
    +
    SafeParam.php in SafeParam.php
    +
    +
    + ScriptRequired.php +
    +
    +
    ScriptRequired.php in ScriptRequired.php
    +
    +
    + StrictBlockquote.php +
    +
    +
    StrictBlockquote.php in StrictBlockquote.php
    +
    +
    + Serializer.php +
    +
    +
    Serializer.php in Serializer.php
    +
    +
    + SafeEmbed.php +
    +
    +
    SafeEmbed.php in SafeEmbed.php
    +
    +
    + SafeObject.php +
    +
    +
    SafeObject.php in SafeObject.php
    +
    +
    + Scripting.php +
    +
    +
    Scripting.php in Scripting.php
    +
    +
    + StyleAttribute.php +
    +
    +
    StyleAttribute.php in StyleAttribute.php
    +
    +
    + Strict.php +
    +
    +
    Strict.php in Strict.php
    +
    +
    + SafeObject.php +
    +
    +
    SafeObject.php in SafeObject.php
    +
    +
    + Strategy.php +
    +
    +
    Strategy.php in Strategy.php
    +
    +
    + StringHash.php +
    +
    +
    StringHash.php in StringHash.php
    +
    +
    + StringHashParser.php +
    +
    +
    StringHashParser.php in StringHashParser.php
    +
    +
    + Simple.php +
    +
    +
    Simple.php in Simple.php
    +
    +
    + Start.php +
    +
    +
    Start.php in Start.php
    +
    +
    + +
    +
    t
    + +
    +
    +
    +
    + $t +
    +
    + +
    Current index in $tokens.
    +
    +
    + $table +
    +
    + +
    Assoc array of entity name to character represented.
    +
    +
    + $tag +
    +
    + +
    +
    + $tags +
    +
    +
    IDS_Report::$tags in Report.php
    +
    List of affected tags
    +
    +
    + $tags +
    +
    +
    IDS_Filter::$tags in Filter.php
    +
    List of tags of the filter
    +
    +
    + $tags +
    +
    +
    IDS_Event::$tags in Event.php
    +
    Affecte tags
    +
    +
    + $tidyModules +
    +
    + +
    List of modules to use for tidying up code
    +
    +
    + $tokens +
    +
    + +
    Array stream of tokens being processed.
    +
    +
    + $tokens +
    +
    + +
    Internal accumulator array for SAX parsers.
    +
    +
    + $tracksLineNumbers +
    +
    + +
    +
    + $tracksLineNumbers +
    +
    + +
    Whether or not this lexer implements line-number/column-number tracking.
    +
    +
    + $transform_to +
    +
    + +
    +
    + $transform_to +
    +
    + +
    Tag name to transform the tag to.
    +
    +
    + $trusted +
    +
    + +
    If set to true, unsafe elements and attributes will be allowed
    +
    +
    + $type +
    +
    + +
    +
    + $type +
    +
    + +
    +
    + $type +
    +
    + +
    Type of child definition, usually right-most part of class name lowercase.
    +
    +
    + $type +
    +
    + +
    +
    + $type +
    +
    + +
    +
    + $type +
    +
    + +
    +
    + $type +
    +
    + +
    +
    + $type +
    +
    + +
    Type of this struct.
    +
    +
    + $type +
    +
    + +
    +
    + $type +
    +
    + +
    +
    + $type +
    +
    + +
    String type, e.g. 'integer' or 'istring'.
    +
    +
    + $type +
    +
    + +
    What type of definition is it?
    +
    +
    + $type +
    +
    + +
    +
    + $type +
    +
    + +
    +
    + $type +
    +
    + +
    Allowed type of the directive. Values are:
    +
    +
    + $type +
    +
    + +
    +
    + $typeAllowsNull +
    +
    + +
    Boolean whether or not null is allowed as a value.
    +
    +
    + $types +
    +
    + +
    Lookup table of allowed types. Mainly for backwards compatibility, but also convenient for transforming string type names to the integer constants.
    +
    +
    + testEncodingSupportsASCII +
    +
    + +
    This expensive function tests whether or not a given character encoding supports ASCII. 7/8-bit encodings like Shift_JIS will fail this test, and require special processing. Variable width encodings shouldn't ever fail.
    +
    +
    + text +
    +
    + +
    +
    + TEXT +
    +
    + +
    +
    + TOKEN +
    +
    + +
    Possible values for $children first-key. Note that top-level structures are automatically token-level.
    +
    +
    + tokenizeDOM +
    +
    + +
    Recursive function that tokenizes a node, putting it into an accumulator.
    +
    +
    + tokenizeHTML +
    +
    + +
    +
    + tokenizeHTML +
    +
    + +
    Lexes an HTML string into tokens.
    +
    +
    + tokenizeHTML +
    +
    + +
    +
    + tokenizeHTML +
    +
    + +
    +
    + tokenizeHTML +
    +
    + +
    +
    + toString +
    +
    + +
    Convert URI back to string
    +
    +
    + toString +
    +
    + +
    +
    + toString +
    +
    + +
    Returns string representation of number.
    +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    Transforms the obsolete tag into the valid tag.
    +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    Abstract: makes changes to the attributes dependent on multiple values.
    +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transform +
    +
    + +
    +
    + transformAttrToAssoc +
    +
    + +
    Converts a DOMNamedNodeMap of DOMAttr objects into an assoc array.
    +
    +
    + TextDecoration.php +
    +
    +
    TextDecoration.php in TextDecoration.php
    +
    +
    + Text.php +
    +
    +
    Text.php in Text.php
    +
    +
    + Textarea.php +
    +
    +
    Textarea.php in Textarea.php
    +
    +
    + Table.php +
    +
    +
    Table.php in Table.php
    +
    +
    + Tables.php +
    +
    +
    Tables.php in Tables.php
    +
    +
    + Target.php +
    +
    +
    Target.php in Target.php
    +
    +
    + Text.php +
    +
    +
    Text.php in Text.php
    +
    +
    + Transitional.php +
    +
    +
    Transitional.php in Transitional.php
    +
    +
    + Tidy.php +
    +
    +
    Tidy.php in Tidy.php
    +
    +
    + TagTransform.php +
    +
    +
    TagTransform.php in TagTransform.php
    +
    +
    + Tag.php +
    +
    +
    Tag.php in Tag.php
    +
    +
    + Text.php +
    +
    +
    Text.php in Text.php
    +
    +
    + Token.php +
    +
    +
    Token.php in Token.php
    +
    +
    + TokenFactory.php +
    +
    +
    TokenFactory.php in TokenFactory.php
    +
    +
    + +
    +
    u
    + +
    +
    +
    +
    + $unit +
    +
    + +
    String unit. False is permitted if $n = 0.
    +
    +
    + $units +
    +
    + +
    Units information array. Units are grouped into measuring systems
    +
    +
    + $userinfo +
    +
    + +
    +
    + $userModules +
    +
    + +
    List of extra modules that were added by the user using addModule().
    +
    +
    + unichr +
    +
    + +
    Translates a Unicode codepoint into its corresponding UTF-8 character.
    +
    +
    + unpack +
    +
    + +
    Unpacks a mailbox into its display-name and address
    +
    +
    + URI.php +
    +
    +
    URI.php in URI.php
    +
    +
    + URI.php +
    +
    +
    URI.php in URI.php
    +
    +
    + UnitConverter.php +
    +
    +
    UnitConverter.php in UnitConverter.php
    +
    +
    + URI.php +
    +
    +
    URI.php in URI.php
    +
    +
    + URIDefinition.php +
    +
    +
    URIDefinition.php in URIDefinition.php
    +
    +
    + URIFilter.php +
    +
    +
    URIFilter.php in URIFilter.php
    +
    +
    + URIParser.php +
    +
    +
    URIParser.php in URIParser.php
    +
    +
    + URIScheme.php +
    +
    +
    URIScheme.php in URIScheme.php
    +
    +
    + URISchemeRegistry.php +
    +
    +
    URISchemeRegistry.php in URISchemeRegistry.php
    +
    +
    + +
    +
    v
    + +
    +
    +
    +
    + $validator +
    +
    + +
    Instance of HTMLPurifier_AttrDef_Lang to validate language codes
    +
    +
    + $valid_values +
    +
    + +
    Lookup table of valid values.
    +
    +
    + $valid_values +
    +
    + +
    +
    + $value +
    +
    + +
    Value of the struct we are recording errors for. There are various
    +
    +
    + $value +
    +
    +
    IDS_Event::$value in Event.php
    +
    Value of the event
    +
    +
    + $valueAliases +
    +
    + +
    Hash of value aliases, e.g. array('alt' => 'real'). Null if value aliasing is disabled (necessary for non-scalar types).
    +
    +
    + $values +
    +
    + +
    Synchronized list of defined content values (values of info)
    +
    +
    + $varParser +
    +
    + +
    Used for processing DEFAULT, nothing else.
    +
    +
    + $version +
    +
    +
    HTMLPurifier::$version in HTMLPurifier.php
    +
    Version of HTML Purifier
    +
    +
    + $version +
    +
    + +
    HTML Purifier's version
    +
    +
    + $version +
    +
    + +
    Version of HTML Purifier the directive was introduced, e.g. '1.3.1'.
    +
    +
    + validate +
    +
    + +
    Validates the components of a URI
    +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    Generic validation method applicable for all schemes. May modify this URI in order to get it into a compliant form.
    +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    Validates a fully-formed interchange object. Throws an HTMLPurifier_ConfigSchema_Exception if there's a problem.
    +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    Validates the number and unit.
    +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    Convenience function to perform standard validation. Throws exception on failed validation.
    +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    Validates and cleans passed string according to a definition.
    +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    Checks if CurrentToken is set and equal to $this->element
    +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    Intercepts and removes !important if necessary
    +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validate +
    +
    + +
    +
    + validateChildren +
    +
    + +
    +
    + validateChildren +
    +
    + +
    +
    + validateChildren +
    +
    + +
    +
    + validateChildren +
    +
    + +
    +
    + validateChildren +
    +
    + +
    +
    + validateChildren +
    +
    + +
    Validates nodes according to definition and returns modification.
    +
    +
    + validateChildren +
    +
    + +
    +
    + validateChildren +
    +
    + +
    +
    + validateDirective +
    +
    + +
    Validates a HTMLPurifier_ConfigSchema_Interchange_Directive object.
    +
    +
    + validateDirectiveAliases +
    +
    + +
    Extra validation if $aliases member variable of HTMLPurifier_ConfigSchema_Interchange_Directive is defined.
    +
    +
    + validateDirectiveAllowed +
    +
    + +
    Extra validation if $allowed member variable of HTMLPurifier_ConfigSchema_Interchange_Directive is defined.
    +
    +
    + validateDirectiveValueAliases +
    +
    + +
    Extra validation if $valueAliases member variable of HTMLPurifier_ConfigSchema_Interchange_Directive is defined.
    +
    +
    + validateId +
    +
    + +
    Validates a HTMLPurifier_ConfigSchema_Interchange_Id object.
    +
    +
    + validateNamespace +
    +
    + +
    Validates a HTMLPurifier_ConfigSchema_Interchange_Namespace object.
    +
    +
    + validateToken +
    +
    + +
    Validates the attributes of a token, returning a modified token
    +
    +
    + Validator.php +
    +
    +
    Validator.php in Validator.php
    +
    +
    + ValidatorAtom.php +
    +
    +
    ValidatorAtom.php in ValidatorAtom.php
    +
    +
    + ValidateAttributes.php +
    +
    +
    ValidateAttributes.php in ValidateAttributes.php
    +
    +
    + VarParser.php +
    +
    +
    VarParser.php in VarParser.php
    +
    +
    + VarParserException.php +
    +
    +
    VarParserException.php in VarParserException.php
    +
    +
    + VERSION +
    +
    +
    HTMLPurifier::VERSION in HTMLPurifier.php
    +
    Constant with version of HTML Purifier
    +
    +
    + +
    +
    w
    + +
    +
    +
    +
    + $withoutTag +
    +
    + +
    +
    + $withTag +
    +
    + +
    +
    + with +
    +
    + +
    Convenience function for generating HTMLPurifier_ConfigSchema_ValidatorAtom for validating simple member variables of objects.
    +
    +
    + wrapHTML +
    +
    + +
    Wraps an HTML fragment in the necessary HTML
    +
    +
    + writeHTMLDiv +
    +
    + +
    +
    + +
    +
    x
    + +
    +
    +
    +
    + $xml +
    +
    + +
    Is the language derived from XML (i.e. XHTML)?
    +
    +
    + Xml.php +
    +
    +
    Xml.php in Xml.php
    +
    +
    + XHTML.php +
    +
    +
    XHTML.php in XHTML.php
    +
    +
    + XHTMLAndHTML4.php +
    +
    +
    XHTMLAndHTML4.php in XHTMLAndHTML4.php
    +
    +
    + XMLCommonAttributes.php +
    +
    +
    XMLCommonAttributes.php in XMLCommonAttributes.php
    +
    +
    + +
    +
    y
    + +
    +
    +
    +
    + YouTube.php +
    +
    +
    YouTube.php in YouTube.php
    +
    +
    + +
    +
    z
    + +
    +
    +
    +
    + $zero +
    +
    + +
    Bool indicating whether or not zero is allowed
    +
    +
    + +
    +
    _
    + +
    +
    +
    +
    + $_current +
    +
    + +
    +
    + $_entity_lookup +
    +
    + +
    Reference to entity lookup table.
    +
    +
    + $_loaded +
    +
    + +
    Has the language object been loaded yet?
    +
    +
    + $_size_lookup +
    +
    + +
    +
    + $_special_dec2str +
    +
    + +
    Decimal to parsed string conversion table for special entities.
    +
    +
    + $_special_ent2dec +
    +
    + +
    Stripped entity names to decimal conversion table for special entities.
    +
    +
    + $_special_entity2str +
    +
    + +
    Most common entity to raw value conversion table for special entities.
    +
    +
    + $_stacks +
    +
    + +
    +
    + $_substituteEntitiesRegex +
    +
    + +
    Callback regex string for parsing entities.
    +
    +
    + $_whitespace +
    +
    + +
    Whitespace characters for str(c)spn.
    +
    +
    + _compileRegex +
    +
    + +
    Compiles the PCRE regex from a DTD regex ($dtd_regex to $_pcre_regex)
    +
    +
    + _findUnused +
    +
    + +
    Triggers errors for any unused keys passed in the hash; such keys may indicate typos, missing values, etc.
    +
    +
    + _loadRegex +
    +
    + +
    Lazy load function to prevent regex from being stuffed in cache.
    +
    +
    + _mergeConfig +
    +
    + +
    Merge config hashes recursivly
    +
    +
    + __autoload +
    +
    +
    __autoload() in HTMLPurifier.autoload.php
    +
    +
    + __clone +
    +
    + +
    Permitting to clone this object
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Generates blank prototypes for cloning.
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Constructor, accepts data and determines if it is whitespace.
    +
    +
    + __construct +
    +
    + +
    Non-overloaded constructor, which lower-cases passed tag name.
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    String of characters that should be preserved while using encode().
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Initialize $generator.
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Merges in module's content sets, expands identifiers in the content sets and populates the keys, values and lookup member variables.
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Constructs the info array, supplying default implementations for attribute types.
    +
    +
    + __construct +
    +
    + +
    Performs all expansions on internal data for use by other inclusions
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Transparent constructor.
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    +
    HTMLPurifier::__construct() in HTMLPurifier.php
    +
    Initializes the purifier.
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Performs low-cost, preliminary initialization.
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __construct +
    +
    + +
    +
    + __get +
    +
    + +
    +
    + __toString +
    +
    + +
    Directly outputs all available information
    +
    +
    + +
    + a + b + c + d + e + f + g + h + i + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z + _ +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/elementindex_PHPIDS.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/elementindex_PHPIDS.html new file mode 100644 index 0000000..4f91585 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/elementindex_PHPIDS.html @@ -0,0 +1,1325 @@ + + + + + + + + + + + +

    [PHPIDS] element index

    +

    Package indexes

    + +All elements +
    +
    + a + c + d + e + f + g + h + i + l + m + n + p + r + s + t + v + _ +
    + + +
    +
    _
    + +
    +
    +
    +
    + _mergeConfig +
    +
    + +
    Merge config hashes recursivly
    +
    +
    + __clone +
    +
    + +
    Permitting to clone this object
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __construct +
    +
    + +
    Constructor
    +
    +
    + __toString +
    +
    + +
    Directly outputs all available information
    +
    +
    + +
    +
    a
    + +
    +
    +
    +
    + addEvent +
    +
    + +
    Adds an IDS_Event object to the report
    +
    +
    + addFilter +
    +
    + +
    Adds a filter
    +
    +
    + addHtml +
    +
    +
    IDS_Monitor::addHtml() in Monitor.php
    +
    Adds a value to the html array
    +
    +
    + addJson +
    +
    +
    IDS_Monitor::addJson() in Monitor.php
    +
    Adds a value to the json array
    +
    +
    + addLogger +
    +
    + +
    Registers a new logging wrapper
    +
    +
    + +
    +
    c
    + +
    +
    +
    +
    + $cache +
    +
    + +
    Cache container
    +
    +
    + $cacheSettings +
    +
    + +
    Holds caching settings
    +
    +
    + $centrifuge +
    +
    + +
    Centrifuge data
    +
    +
    + $config +
    +
    +
    IDS_Init::$config in Init.php
    +
    Holds config settings
    +
    +
    + clear +
    +
    +
    IDS_Report::clear() in Report.php
    +
    Clears calculated/collected values
    +
    +
    + convertConcatenations +
    +
    + +
    Converts basic concatenations
    +
    +
    + convertEntities +
    +
    + +
    Converts from hex/dec entities
    +
    +
    + Converter.php +
    +
    +
    Converter.php in Converter.php
    +
    +
    + convertFromCommented +
    +
    + +
    Check for comments and erases them if available
    +
    +
    + convertFromControlChars +
    +
    + +
    Detects nullbytes and controls chars via ord()
    +
    +
    + convertFromJSCharcode +
    +
    + +
    Checks for common charcode pattern and decodes them
    +
    +
    + convertFromJSUnicode +
    +
    + +
    This method converts JS unicode code points to regular characters
    +
    +
    + convertFromNestedBase64 +
    +
    + +
    This method matches and translates base64 strings and fragments used in data URIs
    +
    +
    + convertFromNewLines +
    +
    + +
    Strip newlines
    +
    +
    + convertFromOutOfRangeChars +
    +
    + +
    Detects nullbytes and controls chars via ord()
    +
    +
    + convertFromProprietaryEncodings +
    +
    + +
    This method collects and decodes proprietary encoding types
    +
    +
    + convertFromSQLHex +
    +
    + +
    Converts SQLHEX to plain text
    +
    +
    + convertFromSQLKeywords +
    +
    + +
    Converts basic SQL keywords and obfuscations
    +
    +
    + convertFromUTF7 +
    +
    + +
    Converts relevant UTF-7 tags to UTF-8
    +
    +
    + convertFromXML +
    +
    + +
    Strip XML patterns
    +
    +
    + convertJSRegexModifiers +
    +
    + +
    Eliminate JS regex modifiers
    +
    +
    + convertQuotes +
    +
    + +
    Normalize quotes
    +
    +
    + count +
    +
    +
    IDS_Event::count() in Event.php
    +
    Returns number of filters
    +
    +
    + count +
    +
    +
    IDS_Report::count() in Report.php
    +
    Returns total amount of events
    +
    +
    + Composite.php +
    +
    +
    Composite.php in Composite.php
    +
    +
    + +
    +
    d
    + +
    +
    +
    +
    + $description +
    +
    + +
    Filter description
    +
    +
    + Database.php +
    +
    +
    Database.php in Database.php
    +
    +
    + Database.php +
    +
    +
    Database.php in Database.php
    +
    +
    + +
    +
    e
    + +
    +
    +
    +
    + $events +
    +
    +
    IDS_Report::$events in Report.php
    +
    Event container
    +
    +
    + Event.php +
    +
    +
    Event.php in Event.php
    +
    +
    + execute +
    +
    + +
    Stores given data into a file
    +
    +
    + execute +
    +
    + +
    Interface method
    +
    +
    + execute +
    +
    + +
    Sends the report to registered recipients
    +
    +
    + execute +
    +
    + +
    Iterates through registered loggers and executes them
    +
    +
    + execute +
    +
    + +
    Stores given data into the database
    +
    +
    + Email.php +
    +
    +
    Email.php in Email.php
    +
    +
    + +
    +
    f
    + +
    +
    +
    +
    + $filters +
    +
    +
    IDS_Event::$filters in Event.php
    +
    List of filter objects
    +
    +
    + $filterSet +
    +
    + +
    Filter container
    +
    +
    + Factory.php +
    +
    +
    Factory.php in Factory.php
    +
    +
    + File.php +
    +
    +
    File.php in File.php
    +
    +
    + factory +
    +
    +
    IDS_Caching::factory() in Factory.php
    +
    Factory method
    +
    +
    + Filter.php +
    +
    +
    Filter.php in Filter.php
    +
    +
    + File.php +
    +
    +
    File.php in File.php
    +
    +
    + +
    +
    g
    + +
    +
    +
    +
    + getBasePath +
    +
    + +
    This method checks if a base path is given and usage is set to true.
    +
    +
    + getCache +
    +
    + +
    Interface method
    +
    +
    + getCache +
    +
    + +
    Returns the cached data
    +
    +
    + getCache +
    +
    + +
    Returns the cached data
    +
    +
    + getCache +
    +
    + +
    Returns the cached data
    +
    +
    + getCache +
    +
    + +
    Returns the cached data
    +
    +
    + getCentrifuge +
    +
    + +
    This method returns the centrifuge property or null if not filled with data
    +
    +
    + getConfig +
    +
    + +
    Returns the config array
    +
    +
    + getConfigPath +
    +
    + +
    Returns path to configuration file
    +
    +
    + getDescription +
    +
    + +
    Returns filter description
    +
    +
    + getEvent +
    +
    + +
    Get event by name
    +
    +
    + getExceptions +
    +
    + +
    Returns exception array
    +
    +
    + getFilterFromJson +
    +
    + +
    Loads filters from Json file using ext/Json
    +
    +
    + getFilterFromXML +
    +
    + +
    Loads filters from XML using SimpleXML
    +
    +
    + getFilters +
    +
    + +
    Returns list of filter objects
    +
    +
    + getFilterSet +
    +
    + +
    Returns registered filters
    +
    +
    + getHtml +
    +
    +
    IDS_Monitor::getHtml() in Monitor.php
    +
    Returns html array
    +
    +
    + getId +
    +
    +
    IDS_Filter::getId() in Filter.php
    +
    Get filter ID
    +
    +
    + getImpact +
    +
    + +
    Returns calculated impact
    +
    +
    + getImpact +
    +
    + +
    Get filter impact level
    +
    +
    + getImpact +
    +
    + +
    Returns total impact
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getInstance +
    +
    + +
    Returns an instance of this class
    +
    +
    + getIterator +
    +
    + +
    Return iterator object
    +
    +
    + getIterator +
    +
    + +
    IteratorAggregate iterator getter
    +
    +
    + getJson +
    +
    +
    IDS_Monitor::getJson() in Monitor.php
    +
    Returns json array
    +
    +
    + getName +
    +
    + +
    Returns event name
    +
    +
    + getReport +
    +
    + +
    Returns report object providing various functions to work with detected results. Also the centrifuge data is being set as property of the report object.
    +
    +
    + getRule +
    +
    +
    IDS_Filter::getRule() in Filter.php
    +
    Returns filter rule
    +
    +
    + getStorage +
    +
    + +
    Returns storage container
    +
    +
    + getTags +
    +
    +
    IDS_Filter::getTags() in Filter.php
    +
    Return list of affected tags
    +
    +
    + getTags +
    +
    +
    IDS_Report::getTags() in Report.php
    +
    Returns list of affected tags
    +
    +
    + getTags +
    +
    + +
    Returns affected tags
    +
    +
    + getValue +
    +
    + +
    Returns event value
    +
    +
    + +
    +
    h
    + +
    +
    +
    +
    + hasEvent +
    +
    + +
    Checks if a specific event with given name exists
    +
    +
    + +
    +
    i
    + +
    +
    +
    +
    + $impact +
    +
    +
    IDS_Event::$impact in Event.php
    +
    Calculated impact
    +
    +
    + $impact +
    +
    +
    IDS_Report::$impact in Report.php
    +
    Impact level
    +
    +
    + $impact +
    +
    +
    IDS_Filter::$impact in Filter.php
    +
    Filter impact level
    +
    +
    + Interface.php +
    +
    +
    Interface.php in Interface.php
    +
    +
    + IDS_Caching +
    +
    +
    IDS_Caching in Factory.php
    +
    Caching factory
    +
    +
    + IDS_Caching_Database +
    +
    +
    IDS_Caching_Database in Database.php
    +
    Database caching wrapper
    +
    +
    + IDS_Caching_File +
    +
    +
    IDS_Caching_File in File.php
    +
    File caching wrapper
    +
    +
    + IDS_Caching_Interface +
    +
    +
    IDS_Caching_Interface in Interface.php
    +
    Caching wrapper interface
    +
    +
    + IDS_Caching_Memcached +
    +
    +
    IDS_Caching_Memcached in Memcached.php
    +
    File caching wrapper
    +
    +
    + IDS_Caching_Session +
    +
    +
    IDS_Caching_Session in Session.php
    +
    File caching wrapper
    +
    +
    + IDS_Converter +
    +
    +
    IDS_Converter in Converter.php
    +
    PHPIDS specific utility class to convert charsets manually
    +
    +
    + IDS_Event +
    +
    +
    IDS_Event in Event.php
    +
    PHPIDS event object
    +
    +
    + IDS_Filter +
    +
    +
    IDS_Filter in Filter.php
    +
    PHPIDS Filter object
    +
    +
    + IDS_Filter_Storage +
    +
    +
    IDS_Filter_Storage in Storage.php
    +
    Filter Storage
    +
    +
    + IDS_Init +
    +
    +
    IDS_Init in Init.php
    +
    Framework initiation
    +
    +
    + IDS_Log_Composite +
    +
    +
    IDS_Log_Composite in Composite.php
    +
    Log Composite
    +
    +
    + IDS_Log_Database +
    +
    +
    IDS_Log_Database in Database.php
    +
    Database logging wrapper
    +
    +
    + IDS_Log_Email +
    +
    +
    IDS_Log_Email in Email.php
    +
    Email logging wrapper
    +
    +
    + IDS_Log_File +
    +
    +
    IDS_Log_File in File.php
    +
    File logging wrapper
    +
    +
    + IDS_Log_Interface +
    +
    +
    IDS_Log_Interface in Interface.php
    +
    Interface for logging wrappers
    +
    +
    + IDS_Monitor +
    +
    +
    IDS_Monitor in Monitor.php
    +
    Monitoring engine
    +
    +
    + IDS_Report +
    +
    +
    IDS_Report in Report.php
    +
    PHPIDS report object
    +
    +
    + init +
    +
    +
    IDS_Init::init() in Init.php
    +
    Returns an instance of this class. Also a PHP version check is being performed to avoid compatibility problems with PHP < 5.1.6
    +
    +
    + Init.php +
    +
    +
    Init.php in Init.php
    +
    +
    + isEmpty +
    +
    +
    IDS_Report::isEmpty() in Report.php
    +
    Checks if any events are registered
    +
    +
    + isSpamAttempt +
    +
    + +
    Detects spam attempts
    +
    +
    + Interface.php +
    +
    +
    Interface.php in Interface.php
    +
    +
    + +
    +
    l
    + +
    +
    +
    +
    + $loggers +
    +
    + +
    Holds registered logging wrapper
    +
    +
    + +
    +
    m
    + +
    +
    +
    +
    + Memcached.php +
    +
    +
    Memcached.php in Memcached.php
    +
    +
    + match +
    +
    +
    IDS_Filter::match() in Filter.php
    +
    Matches a string against current filter
    +
    +
    + Monitor.php +
    +
    +
    Monitor.php in Monitor.php
    +
    +
    + +
    +
    n
    + +
    +
    +
    +
    + $name +
    +
    +
    IDS_Event::$name in Event.php
    +
    Event name
    +
    +
    + +
    +
    p
    + +
    +
    +
    +
    + prepareData +
    +
    + +
    Prepares data
    +
    +
    + prepareData +
    +
    + +
    Prepares data
    +
    +
    + +
    +
    r
    + +
    +
    +
    +
    + $rule +
    +
    +
    IDS_Filter::$rule in Filter.php
    +
    Filter rule
    +
    +
    + removeLogger +
    +
    + +
    Removes a logger
    +
    +
    + Report.php +
    +
    +
    Report.php in Report.php
    +
    +
    + run +
    +
    +
    IDS_Monitor::run() in Monitor.php
    +
    Starts the scan mechanism
    +
    +
    + runAll +
    +
    +
    IDS_Converter::runAll() in Converter.php
    +
    Runs all converter functions
    +
    +
    + runCentrifuge +
    +
    + +
    This method is the centrifuge prototype
    +
    +
    + +
    +
    s
    + +
    +
    +
    +
    + $scanKeys +
    +
    +
    IDS_Monitor::$scanKeys in Monitor.php
    +
    Scan keys switch
    +
    +
    + $source +
    +
    + +
    Filter source file
    +
    +
    + Session.php +
    +
    +
    Session.php in Session.php
    +
    +
    + Storage.php +
    +
    +
    Storage.php in Storage.php
    +
    +
    + send +
    +
    + +
    Sends an email
    +
    +
    + setCache +
    +
    + +
    Writes cache data into the database
    +
    +
    + setCache +
    +
    + +
    Writes cache data
    +
    +
    + setCache +
    +
    + +
    Writes cache data into the file
    +
    +
    + setCache +
    +
    + +
    Writes cache data into the session
    +
    +
    + setCache +
    +
    + +
    Interface method
    +
    +
    + setCentrifuge +
    +
    + +
    This method sets the centrifuge property
    +
    +
    + setConfig +
    +
    + +
    Merges new settings into the exsiting ones or overwrites them
    +
    +
    + setConfigPath +
    +
    + +
    Sets the path to the configuration file
    +
    +
    + setExceptions +
    +
    + +
    Sets exception array
    +
    +
    + setFilterSet +
    +
    + +
    Sets the filter array
    +
    +
    + setHtml +
    +
    +
    IDS_Monitor::setHtml() in Monitor.php
    +
    Sets html array
    +
    +
    + setJson +
    +
    +
    IDS_Monitor::setJson() in Monitor.php
    +
    Sets json array
    +
    +
    + +
    +
    t
    + +
    +
    +
    +
    + $tags +
    +
    +
    IDS_Report::$tags in Report.php
    +
    List of affected tags
    +
    +
    + $tags +
    +
    +
    IDS_Filter::$tags in Filter.php
    +
    List of tags of the filter
    +
    +
    + $tags +
    +
    +
    IDS_Event::$tags in Event.php
    +
    Affecte tags
    +
    +
    + +
    +
    v
    + +
    +
    +
    +
    + $value +
    +
    +
    IDS_Event::$value in Event.php
    +
    Value of the event
    +
    +
    + +
    + a + c + d + e + f + g + h + i + l + m + n + p + r + s + t + v + _ +
    + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/errors.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/errors.html new file mode 100644 index 0000000..6c04e39 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/errors.html @@ -0,0 +1,1433 @@ + + + + + + phpDocumentor Parser Errors and Warnings + + + + + Post-parsing
    +AttrCollections.php
    +AttrDef.php
    +AttrTransform.php
    +AttrTypes.php
    +AttrValidator.php
    +AutoParagraph.php
    +Background.php
    +BackgroundPosition.php
    +Bdo.php
    +BdoDir.php
    +BgColor.php
    +Bool.php
    +BoolToCSS.php
    +Bootstrap.php
    +Border.php
    +Chameleon.php
    +ChildDef.php
    +Cleanup.php
    +Color.php
    +Comment.php
    +CommonAttributes.php
    +Composite.php
    +Config.php
    +ConfigDef.php
    +ConfigForm.php
    +ConfigSchema.php
    +ContentSets.php
    +Context.php
    +Core.php
    +CSS.php
    +CSSDefinition.php
    +Custom.php
    +Database.php
    +Decorator.php
    +Definition.php
    +DefinitionCache.php
    +DefinitionCacheFactory.php
    +DenyElementDecorator.php
    +Directive.php
    +DirectiveAlias.php
    +DirectLex.php
    +DisableExternal.php
    +DisableExternalResources.php
    +DisplayLinkURI.php
    +Doctype.php
    +DoctypeRegistry.php
    +DOMLex.php
    +Edit.php
    +ElementDef.php
    +Email.php
    +Empty.php
    +en-x-test.php
    +en-x-testmini.php
    +en.php
    +Encoder.php
    +End.php
    +EntityLookup.php
    +EntityParser.php
    +Enum.php
    +EnumToCSS.php
    +ErrorCollector.php
    +ErrorStruct.php
    +Exception.php
    +ExtractStyleBlocks.php
    +File.php
    +Filter.php
    +FixNesting.php
    +Flexible.php
    +Font.php
    +FontFamily.php
    +Forms.php
    +FrameTarget.php
    +ftp.php
    +Generator.php
    +Host.php
    +HostBlacklist.php
    +HTMLDefinition.php
    +HTMLModule.php
    +HTMLModuleManager.php
    +HTMLPurifier.auto.php
    +HTMLPurifier.autoload.php
    +HTMLPurifier.func.php
    +HTMLPurifier.includes.php
    +HTMLPurifier.kses.php
    +HTMLPurifier.path.php
    +HTMLPurifier.php
    +HTMLPurifier.safe-includes.php
    +http.php
    +https.php
    +Hypertext.php
    +ID.php
    +Id.php
    +IDAccumulator.php
    +Image.php
    +ImgRequired.php
    +ImgSpace.php
    +ImportantDecorator.php
    +Injector.php
    +Input.php
    +Integer.php
    +Interchange.php
    +InterchangeBuilder.php
    +IPv4.php
    +IPv6.php
    +Lang.php
    +Language.php
    +LanguageFactory.php
    +Legacy.php
    +Length.php
    +Lexer.php
    +Linkify.php
    +LinkTypes.php
    +List.php
    +ListStyle.php
    +mailto.php
    +MakeAbsolute.php
    +MakeWellFormed.php
    +Memcached.php
    +Memory.php
    +Monitor.php
    +MultiLength.php
    +Multiple.php
    +Munge.php
    +Name.php
    +Namespace.php
    +Native.php
    +news.php
    +Nmtokens.php
    +nntp.php
    +NonXMLCommonAttributes.php
    +Null.php
    +Number.php
    +Object.php
    +Optional.php
    +PEARSax3.php
    +Percentage.php
    +PercentEncoder.php
    +PH5P.php
    +Pixels.php
    +Presentation.php
    +Printer.php
    +Proprietary.php
    +PurifierLinkify.php
    +RemoveEmpty.php
    +RemoveForeignElements.php
    +Required.php
    +Ruby.php
    +SafeEmbed.php
    +SafeObject.php
    +SafeParam.php
    +Scripting.php
    +ScriptRequired.php
    +Serializer.php
    +Session.php
    +Simple.php
    +SimpleCheck.php
    +Start.php
    +Strategy.php
    +Strict.php
    +StrictBlockquote.php
    +StringHash.php
    +StringHashParser.php
    +StyleAttribute.php
    +Switch.php
    +Table.php
    +Tables.php
    +Tag.php
    +TagTransform.php
    +Target.php
    +Text.php
    +Textarea.php
    +TextDecoration.php
    +Tidy.php
    +Token.php
    +TokenFactory.php
    +Transitional.php
    +UnitConverter.php
    +URI.php
    +URIDefinition.php
    +URIFilter.php
    +URIParser.php
    +URIScheme.php
    +URISchemeRegistry.php
    +ValidateAttributes.php
    +Validator.php
    +ValidatorAtom.php
    +VarParser.php
    +VarParserException.php
    +XHTML.php
    +XHTMLAndHTML4.php
    +Xml.php
    +XMLCommonAttributes.php
    +YouTube.php
    + +

    AlphaValue.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_AlphaValue
    +Warning on line 18 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    AttrCollections.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrCollections
    +Warning on line 125 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrCollections.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    AttrDef.php

    +

    Warnings:


    +Warning on line 13 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef
    +Warning on line 57 - Unknown tag "@note" used
    +Warning on line 57 - Unknown tag "@warning" used
    +Warning on line 84 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    AttrTransform.php

    +

    Warnings:


    +Warning on line 17 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform
    +Warning on line 53 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    AttrTypes.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTypes
    +Warning on line 71 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTypes.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    AttrValidator.php

    +

    Warnings:


    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrValidator
    +Warning on line 159 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrValidator.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    AutoParagraph.php

    +

    Warnings:


    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_Injector_AutoParagraph
    +Warning on line 337 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/AutoParagraph.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Background.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_Background
    +Warning on line 6 - Unknown tag "@warning" used
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_Background
    +Warning on line 13 - Unknown tag "@note" used
    +Warning on line 20 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Background.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 84 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Background.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    BackgroundPosition.php

    +

    Warnings:


    +Warning on line 44 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_BackgroundPosition
    +Warning on line 123 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Bdo.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Bdo
    +Warning on line 28 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Bdo.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    BdoDir.php

    +

    Warnings:


    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_BdoDir
    +Warning on line 16 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BdoDir.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    BgColor.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_BgColor
    +Warning on line 20 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BgColor.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Bool.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_HTML_Bool
    +Warning on line 25 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Bool.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    BoolToCSS.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_BoolToCSS
    +Warning on line 33 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BoolToCSS.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Bootstrap.php

    +

    Warnings:


    +Warning on line 15 - +duplicate define element "PHP_EOL" in file /home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Bootstrap.php will be ignored. +Use an @ignore tag on the original if you want this case to be documented.
    +Warning on line 18 - +duplicate define element "PHP_EOL" in file /home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Bootstrap.php will be ignored. +Use an @ignore tag on the original if you want this case to be documented.
    +Warning on line 29 - Unknown tag "@note" used
    +Warning on line 30 - no @package tag was used in a DocBlock for class HTMLPurifier_Bootstrap
    +Warning on line 95 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Bootstrap.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Border.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_Border
    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_Border
    +Warning on line 15 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Border.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 40 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Border.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Chameleon.php

    +

    Warnings:


    +Warning on line 12 - no @package tag was used in a DocBlock for class HTMLPurifier_ChildDef_Chameleon
    +Warning on line 45 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Chameleon.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ChildDef.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_ChildDef
    +Warning on line 45 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +

    Errors:


    +Error on line 44 - DocBlock has multiple @return tags, illegal. ignoring additional tag "@return array of replacement child tokens"
    +Error on line 44 - DocBlock has multiple @return tags, illegal. ignoring additional tag "@return bool false to remove parent node"
    + +

    Cleanup.php

    +

    Warnings:


    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_DefinitionCache_Decorator_Cleanup
    +Warning on line 40 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Color.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_HTML_Color
    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_Color
    +Warning on line 29 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Color.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 75 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Color.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Comment.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_Token_Comment
    +Warning on line 18 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Comment.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    CommonAttributes.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_CommonAttributes
    +Warning on line 22 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/CommonAttributes.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Composite.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_Strategy_Composite
    +Warning on line 12 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_Composite
    +Warning on line 22 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/Composite.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 33 - Page-level DocBlock precedes "require_once 'IDS/Log/Interface.php'", use another DocBlock to document the source element
    +Warning on line 35 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Composite.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +

    Errors:


    +Error on line 33 - require_once include's DocBlock has @package tag, illegal. ignoring tag "@package PHPIDS"
    + +

    Config.php

    +

    Warnings:


    +Warning on line 16 - Unknown tag "@note" used
    +Warning on line 16 - Unknown tag "@warning" used
    +Warning on line 17 - no @package tag was used in a DocBlock for class HTMLPurifier_Config
    +Warning on line 58 - Unknown tag "@note" used
    +Warning on line 157 - Unknown tag "@note" used
    +Warning on line 423 - Unknown tag "@note" used
    +Warning on line 488 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Config.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ConfigDef.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigDef
    +Warning on line 7 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ConfigForm.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_Printer_ConfigForm
    +Warning on line 187 - no @package tag was used in a DocBlock for class HTMLPurifier_Printer_ConfigForm_NullDecorator
    +Warning on line 237 - no @package tag was used in a DocBlock for class HTMLPurifier_Printer_ConfigForm_default
    +Warning on line 319 - no @package tag was used in a DocBlock for class HTMLPurifier_Printer_ConfigForm_bool
    +Warning on line 365 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ConfigSchema.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigSchema
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigSchema_Builder_ConfigSchema
    +Warning on line 11 - Unknown tag "@note" used
    +Warning on line 49 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 80 - Unknown tag "@warning" used
    +Warning on line 80 - Unknown tag "@warning" used
    +Warning on line 94 - Unknown tag "@warning" used
    +Warning on line 125 - Unknown tag "@warning" used
    +Warning on line 205 - Unknown tag "@deprecated," used
    +Warning on line 218 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ContentSets.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_ContentSets
    +Warning on line 17 - Unknown tag "@note" used
    +Warning on line 103 - Unknown tag "@note" used
    +Warning on line 152 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ContentSets.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Context.php

    +

    Warnings:


    +Warning on line 9 - Unknown tag "@warning" used
    +Warning on line 9 - Unknown tag "@note" used
    +Warning on line 10 - no @package tag was used in a DocBlock for class HTMLPurifier_Context
    +Warning on line 79 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Context.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Core.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_Strategy_Core
    +Warning on line 15 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/Core.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    CSS.php

    +

    Warnings:


    +Warning on line 13 - Unknown tag "@note" used
    +Warning on line 13 - Unknown tag "@note" used
    +Warning on line 14 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS
    +Warning on line 84 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    CSSDefinition.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_Printer_CSSDefinition
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_CSSDefinition
    +Warning on line 35 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/CSSDefinition.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 288 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/CSSDefinition.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Custom.php

    +

    Warnings:


    +Warning on line 8 - Unknown tag "@warning" used
    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_ChildDef_Custom
    +Warning on line 87 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Custom.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Database.php

    +

    Warnings:


    +Warning on line 33 - Page-level DocBlock precedes "require_once 'IDS/Caching/Interface.php'", use another DocBlock to document the source element
    +Warning on line 33 - Page-level DocBlock precedes "require_once 'IDS/Log/Interface.php'", use another DocBlock to document the source element
    +Warning on line 33 - package default is already in category default, will now replace with category Security
    +

    Errors:


    +Error on line 33 - require_once include's DocBlock has @package tag, illegal. ignoring tag "@package PHPIDS"
    +Error on line 33 - require_once include's DocBlock has @package tag, illegal. ignoring tag "@package PHPIDS"
    + +

    Decorator.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_DefinitionCache_Decorator
    +Warning on line 59 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Definition.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_Definition
    +Warning on line 36 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Definition.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    DefinitionCache.php

    +

    Warnings:


    +Warning on line 11 - no @package tag was used in a DocBlock for class HTMLPurifier_DefinitionCache
    +Warning on line 59 - Unknown tag "@note" used
    +Warning on line 103 - Unknown tag "@note" used
    +Warning on line 105 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    DefinitionCacheFactory.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_DefinitionCacheFactory
    +Warning on line 88 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCacheFactory.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +

    Errors:


    +Error on line 80 - "@param" tag was used without any parameters, illegal
    + +

    DenyElementDecorator.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_DenyElementDecorator
    +Warning on line 25 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Directive.php

    +

    Warnings:


    +Warning on line 6 - Unknown tag "@note" used
    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigSchema_Interchange_Directive
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigDef_Directive
    +Warning on line 41 - Unknown tag "@bool" used
    +Warning on line 53 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/Directive.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 74 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    DirectiveAlias.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigDef_DirectiveAlias
    +Warning on line 22 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/DirectiveAlias.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    DirectLex.php

    +

    Warnings:


    +Warning on line 13 - no @package tag was used in a DocBlock for class HTMLPurifier_Lexer_DirectLex
    +Warning on line 487 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/DirectLex.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    DisableExternal.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_URIFilter_DisableExternal
    +Warning on line 20 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/DisableExternal.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    DisableExternalResources.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_URIFilter_DisableExternalResources
    +Warning on line 9 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/DisableExternalResources.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    DisplayLinkURI.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_Injector_DisplayLinkURI
    +Warning on line 23 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/DisplayLinkURI.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Doctype.php

    +

    Warnings:


    +Warning on line 8 - Unknown tag "@note" used
    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_Doctype
    +Warning on line 57 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Doctype.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    DoctypeRegistry.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_DoctypeRegistry
    +Warning on line 25 - Unknown tag "@note" used
    +Warning on line 55 - Unknown tag "@note" used
    +Warning on line 55 - Unknown tag "@note" used
    +Warning on line 73 - Unknown tag "@note" used
    +Warning on line 100 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DoctypeRegistry.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    DOMLex.php

    +

    Warnings:


    +Warning on line 26 - Unknown tag "@note" used
    +Warning on line 26 - Unknown tag "@warning" used
    +Warning on line 26 - Unknown tag "@note" used
    +Warning on line 27 - no @package tag was used in a DocBlock for class HTMLPurifier_Lexer_DOMLex
    +Warning on line 210 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/DOMLex.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Edit.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Edit
    +Warning on line 35 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Edit.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ElementDef.php

    +

    Warnings:


    +Warning on line 8 - Unknown tag "@note" used
    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_ElementDef
    +Warning on line 28 - Unknown tag "@note" used
    +Warning on line 52 - Unknown tag "@warning" used
    +Warning on line 61 - Unknown tag "@warning" used
    +Warning on line 61 - Unknown tag "@warning" used
    +Warning on line 90 - Unknown tag "@note" used
    +Warning on line 158 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ElementDef.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Email.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_URI_Email
    +Warning on line 14 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Email.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 33 - Page-level DocBlock precedes "require_once 'IDS/Log/Interface.php'", use another DocBlock to document the source element
    +

    Errors:


    +Error on line 33 - require_once include's DocBlock has @package tag, illegal. ignoring tag "@package PHPIDS"
    + +

    Empty.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_Token_Empty
    +Warning on line 8 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Empty.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 9 - Unknown tag "@warning" used
    +Warning on line 10 - no @package tag was used in a DocBlock for class HTMLPurifier_ChildDef_Empty
    +Warning on line 17 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Empty.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    en-x-test.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_Language_en_x_test
    +Warning on line 8 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en-x-test.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 9 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/classes/en-x-test.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    en-x-testmini.php

    +

    Warnings:


    +Warning on line 9 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en-x-testmini.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    en.php

    +

    Warnings:


    +Warning on line 58 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Encoder.php

    +

    Warnings:


    +Warning on line 6 - Unknown tag "@note" used
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_Encoder
    +Warning on line 46 - Unknown tag "@note" used
    +Warning on line 46 - Unknown tag "@note" used
    +Warning on line 212 - Unknown tag "@note" used
    +Warning on line 212 - Unknown tag "@note" used
    +Warning on line 212 - Unknown tag "@note" used
    +Warning on line 298 - Unknown tag "@note" used
    +Warning on line 344 - Unknown tag "@note" used
    +Warning on line 344 - Unknown tag "@note" used
    +Warning on line 344 - Unknown tag "@note" used
    +Warning on line 344 - Unknown tag "@warning" used
    +Warning on line 417 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Encoder.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    End.php

    +

    Warnings:


    +Warning on line 9 - Unknown tag "@warning" used
    +Warning on line 10 - no @package tag was used in a DocBlock for class HTMLPurifier_Token_End
    +Warning on line 16 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/End.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    EntityLookup.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_EntityLookup
    +Warning on line 18 - Unknown tag "@warning" used
    +Warning on line 18 - Unknown tag "@note" used
    +Warning on line 41 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityLookup.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    EntityParser.php

    +

    Warnings:


    +Warning on line 10 - no @package tag was used in a DocBlock for class HTMLPurifier_EntityParser
    +Warning on line 108 - Unknown tag "@notice" used
    +Warning on line 141 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityParser.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Enum.php

    +

    Warnings:


    +Warning on line 9 - Unknown tag "@warning" used
    +Warning on line 10 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_Enum
    +Warning on line 22 - Unknown tag "@note" used
    +Warning on line 62 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Enum.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    EnumToCSS.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_EnumToCSS
    +Warning on line 23 - Unknown tag "@warning" used
    +Warning on line 55 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/EnumToCSS.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ErrorCollector.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_ErrorCollector
    +Warning on line 206 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ErrorCollector.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ErrorStruct.php

    +

    Warnings:


    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_ErrorStruct
    +Warning on line 57 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ErrorStruct.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Exception.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigSchema_Exception
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_Exception
    +Warning on line 8 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Exception.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 9 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Exception.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ExtractStyleBlocks.php

    +

    Warnings:


    +Warning on line 16 - Unknown tag "@note" used
    +Warning on line 16 - Unknown tag "@note" used
    +Warning on line 17 - no @package tag was used in a DocBlock for class HTMLPurifier_Filter_ExtractStyleBlocks
    +Warning on line 62 - Unknown tag "@warning" used
    +Warning on line 132 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    File.php

    +

    Warnings:


    +Warning on line 33 - Page-level DocBlock precedes "require_once 'IDS/Caching/Interface.php'", use another DocBlock to document the source element
    +Warning on line 33 - Page-level DocBlock precedes "require_once 'IDS/Log/Interface.php'", use another DocBlock to document the source element
    +

    Errors:


    +Error on line 33 - require_once include's DocBlock has @package tag, illegal. ignoring tag "@package PHPIDS"
    +Error on line 33 - require_once include's DocBlock has @package tag, illegal. ignoring tag "@package PHPIDS"
    + +

    Filter.php

    +

    Warnings:


    +Warning on line 7 - Unknown tag "@note" used
    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_Filter
    +Warning on line 21 - Unknown tag "@note" used
    +Warning on line 22 - no @package tag was used in a DocBlock for class HTMLPurifier_Filter
    +Warning on line 43 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 51 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Filter.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    FixNesting.php

    +

    Warnings:


    +Warning on line 30 - Unknown tag "@note" used
    +Warning on line 31 - no @package tag was used in a DocBlock for class HTMLPurifier_Strategy_FixNesting
    +Warning on line 325 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/FixNesting.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Flexible.php

    +

    Warnings:


    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_VarParser_Flexible
    +Warning on line 93 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser/Flexible.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Font.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_Font
    +Warning on line 14 - Unknown tag "@note" used
    +Warning on line 15 - no @package tag was used in a DocBlock for class HTMLPurifier_TagTransform_Font
    +Warning on line 16 - Unknown tag "@note" used
    +Warning on line 90 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform/Font.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 146 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Font.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    FontFamily.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_FontFamily
    +Warning on line 87 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Forms.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Forms
    +Warning on line 115 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Forms.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    FrameTarget.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_HTML_FrameTarget
    +Warning on line 18 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ftp.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_URIScheme_ftp
    +Warning on line 40 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/ftp.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Generator.php

    +

    Warnings:


    +Warning on line 10 - no @package tag was used in a DocBlock for class HTMLPurifier_Generator
    +Warning on line 133 - Unknown tag "@warning" used
    +Warning on line 148 - Unknown tag "@note" used
    +Warning on line 180 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Generator.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Host.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_URI_Host
    +Warning on line 59 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Host.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    HostBlacklist.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_URIFilter_HostBlacklist
    +Warning on line 18 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/HostBlacklist.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    HTMLDefinition.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_Printer_HTMLDefinition
    +Warning on line 25 - Unknown tag "@warning" used
    +Warning on line 25 - Unknown tag "@note" used
    +Warning on line 26 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLDefinition
    +Warning on line 55 - Unknown tag "@note" used
    +Warning on line 101 - Unknown tag "@note" used
    +Warning on line 116 - Unknown tag "@note" used
    +Warning on line 130 - Unknown tag "@note" used
    +Warning on line 269 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/HTMLDefinition.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 386 - Unknown tag "@warning" used
    +Warning on line 417 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLDefinition.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    HTMLModule.php

    +

    Warnings:


    +Warning on line 17 - Unknown tag "@note" used
    +Warning on line 17 - Unknown tag "@note" used
    +Warning on line 18 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule
    +Warning on line 101 - Unknown tag "@note" used
    +Warning on line 129 - Unknown tag "@note" used
    +Warning on line 184 - Unknown tag "@note" used
    +Warning on line 223 - Unknown tag "@note" used
    +Warning on line 241 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    HTMLModuleManager.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModuleManager
    +Warning on line 144 - Unknown tag "@note" used
    +Warning on line 144 - Unknown tag "@note" used
    +Warning on line 329 - Unknown tag "@note" used
    +Warning on line 400 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModuleManager.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    HTMLPurifier.auto.php

    +

    Warnings:


    +Warning on line 8 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier.auto.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    HTMLPurifier.autoload.php

    +

    Warnings:


    +Warning on line 7 - Unknown tag "@file" used
    +Warning on line 18 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier.autoload.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    HTMLPurifier.func.php

    +

    Warnings:


    +Warning on line 13 - Unknown tag "@file" used
    +Warning on line 13 - Unknown tag "@note" used
    +Warning on line 14 - no @package tag was used in a DocBlock for file /home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier.func.php
    +Warning on line 14 - package default is already in category Security, will now replace with category default
    + +

    HTMLPurifier.includes.php

    +

    Warnings:


    +Warning on line 20 - Unknown tag "@warning" used
    +Warning on line 20 - Unknown tag "@warning" used
    +Warning on line 20 - Unknown tag "@file" used
    +Warning on line 203 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier.includes.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    HTMLPurifier.kses.php

    +

    Warnings:


    +Warning on line 7 - Unknown tag "@file" used
    +Warning on line 27 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier.kses.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    HTMLPurifier.path.php

    +

    Warnings:


    +Warning on line 8 - Unknown tag "@file" used
    +Warning on line 8 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier.path.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    HTMLPurifier.php

    +

    Warnings:


    +Warning on line 53 - Unknown tag "@note" used
    +Warning on line 54 - no @package tag was used in a DocBlock for class HTMLPurifier
    +Warning on line 229 - Unknown tag "@note" used
    +Warning on line 233 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    HTMLPurifier.safe-includes.php

    +

    Warnings:


    +Warning on line 12 - Unknown tag "@file" used
    +Warning on line 197 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier.safe-includes.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    http.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_URIScheme_http
    +Warning on line 17 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/http.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    https.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_URIScheme_https
    +Warning on line 9 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/https.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Hypertext.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Hypertext
    +Warning on line 27 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Hypertext.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Id.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigSchema_Interchange_Id
    +Warning on line 19 - Unknown tag "@warning" used
    +Warning on line 28 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ID.php

    +

    Warnings:


    +Warning on line 11 - Unknown tag "@warning" used
    +Warning on line 12 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_HTML_ID
    +Warning on line 67 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/ID.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    IDAccumulator.php

    +

    Warnings:


    +Warning on line 8 - Unknown tag "@note" used
    +Warning on line 8 - Unknown tag "@note" used
    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_IDAccumulator
    +Warning on line 44 - Unknown tag "@note" used
    +Warning on line 50 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/IDAccumulator.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Image.php

    +

    Warnings:


    +Warning on line 7 - Unknown tag "@note" used
    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Image
    +Warning on line 37 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Image.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ImgRequired.php

    +

    Warnings:


    +Warning on line 11 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_ImgRequired
    +Warning on line 39 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ImgRequired.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ImgSpace.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_ImgSpace
    +Warning on line 41 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ImgSpace.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ImportantDecorator.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_ImportantDecorator
    +Warning on line 37 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Injector.php

    +

    Warnings:


    +Warning on line 16 - no @package tag was used in a DocBlock for class HTMLPurifier_Injector
    +Warning on line 67 - Unknown tag "@warning" used
    +Warning on line 150 - Unknown tag "@warning" used
    +Warning on line 183 - Unknown tag "@warning" used
    +Warning on line 200 - Unknown tag "@warning" used
    +Warning on line 227 - Unknown tag "@note" used
    +Warning on line 230 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Input.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_Input
    +Warning on line 37 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Input.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Integer.php

    +

    Warnings:


    +Warning on line 9 - Unknown tag "@note" used
    +Warning on line 10 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_Integer
    +Warning on line 70 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Integer.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Interchange.php

    +

    Warnings:


    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigSchema_Interchange
    +Warning on line 54 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    InterchangeBuilder.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigSchema_InterchangeBuilder
    +Warning on line 173 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    IPv4.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_URI_IPv4
    +Warning on line 36 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/IPv4.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    IPv6.php

    +

    Warnings:


    +Warning on line 8 - Unknown tag "@note" used
    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_URI_IPv6
    +Warning on line 96 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/IPv6.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Lang.php

    +

    Warnings:


    +Warning on line 6 - Unknown tag "@note" used
    +Warning on line 7 - Unknown tag "@note" used
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_Lang
    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_Lang
    +Warning on line 25 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Lang.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 70 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Lang.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Language.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_Language
    +Warning on line 56 - Unknown tag "@note" used
    +Warning on line 160 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    LanguageFactory.php

    +

    Warnings:


    +Warning on line 9 - Unknown tag "@note" used
    +Warning on line 10 - no @package tag was used in a DocBlock for class HTMLPurifier_LanguageFactory
    +Warning on line 17 - Unknown tag "@value" used
    +Warning on line 24 - Unknown tag "@value" used
    +Warning on line 30 - Unknown tag "@value" used
    +Warning on line 37 - Unknown tag "@value" used
    +Warning on line 43 - Unknown tag "@value" used
    +Warning on line 49 - Unknown tag "@value" used
    +Warning on line 71 - Unknown tag "@note" used
    +Warning on line 128 - Unknown tag "@note" used
    +Warning on line 195 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/LanguageFactory.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Legacy.php

    +

    Warnings:


    +Warning on line 18 - Unknown tag "@note" used
    +Warning on line 19 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Legacy
    +Warning on line 134 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Legacy.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Length.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_Length
    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_Length
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_Length
    +Warning on line 10 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_HTML_Length
    +Warning on line 24 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Length.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 38 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Length.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 44 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Length.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 45 - Unknown tag "@warning" used
    +Warning on line 102 - Unknown tag "@warning" used
    +Warning on line 112 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Length.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Lexer.php

    +

    Warnings:


    +Warning on line 41 - Unknown tag "@par" used
    +Warning on line 41 - Unknown tag "@note" used
    +Warning on line 41 - Unknown tag "@par" used
    +Warning on line 41 - Unknown tag "@note" used
    +Warning on line 41 - Unknown tag "@par" used
    +Warning on line 42 - no @package tag was used in a DocBlock for class HTMLPurifier_Lexer
    +Warning on line 67 - Unknown tag "@note" used
    +Warning on line 173 - Unknown tag "@warning" used
    +Warning on line 241 - Unknown tag "@warning" used
    +Warning on line 241 - Unknown tag "@params" used
    +Warning on line 295 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Linkify.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_Injector_Linkify
    +Warning on line 43 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/Linkify.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    LinkTypes.php

    +

    Warnings:


    +Warning on line 8 - Unknown tag "@note" used
    +Warning on line 8 - Unknown tag "@note" used
    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_HTML_LinkTypes
    +Warning on line 50 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    List.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_List
    +Warning on line 32 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/List.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ListStyle.php

    +

    Warnings:


    +Warning on line 6 - Unknown tag "@warning" used
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_ListStyle
    +Warning on line 13 - Unknown tag "@note" used
    +Warning on line 75 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    mailto.php

    +

    Warnings:


    +Warning on line 11 - no @package tag was used in a DocBlock for class HTMLPurifier_URIScheme_mailto
    +Warning on line 24 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/mailto.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    MakeAbsolute.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_URIFilter_MakeAbsolute
    +Warning on line 111 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/MakeAbsolute.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    MakeWellFormed.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_Strategy_MakeWellFormed
    +Warning on line 429 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/MakeWellFormed.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Memcached.php

    +

    Warnings:


    +Warning on line 33 - Page-level DocBlock precedes "require_once 'IDS/Caching/Interface.php'", use another DocBlock to document the source element
    +

    Errors:


    +Error on line 33 - require_once include's DocBlock has @package tag, illegal. ignoring tag "@package PHPIDS"
    + +

    Memory.php

    +

    Warnings:


    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_DefinitionCache_Decorator_Memory
    +Warning on line 43 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator/Memory.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Monitor.php

    +

    Warnings:


    +Warning on line 49 - package default is already in category default, will now replace with category Security
    + +

    MultiLength.php

    +

    Warnings:


    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_HTML_MultiLength
    +Warning on line 38 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Multiple.php

    +

    Warnings:


    +Warning on line 13 - Unknown tag "@note" used
    +Warning on line 14 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_Multiple
    +Warning on line 55 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Multiple.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Munge.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_URIFilter_Munge
    +Warning on line 51 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/Munge.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Name.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Name
    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_Name
    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Tidy_Name
    +Warning on line 15 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Name.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 16 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Name.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 21 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Name.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Namespace.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigDef_Namespace
    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigSchema_Interchange_Namespace
    +Warning on line 8 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/Namespace.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 18 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Namespace.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Native.php

    +

    Warnings:


    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_VarParser_Native
    +Warning on line 23 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser/Native.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    news.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_URIScheme_news
    +Warning on line 19 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/news.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Nmtokens.php

    +

    Warnings:


    +Warning on line 9 - Unknown tag "@warning" used
    +Warning on line 9 - Unknown tag "@note" used
    +Warning on line 9 - Unknown tag "@note" used
    +Warning on line 10 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_HTML_Nmtokens
    +Warning on line 45 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Nmtokens.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    nntp.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_URIScheme_nntp
    +Warning on line 17 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/nntp.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    NonXMLCommonAttributes.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_NonXMLCommonAttributes
    +Warning on line 11 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Null.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_DefinitionCache_Null
    +Warning on line 36 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Null.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Number.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_Number
    +Warning on line 24 - Unknown tag "@warning" used
    +Warning on line 66 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Number.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Object.php

    +

    Warnings:


    +Warning on line 7 - Unknown tag "@warning" used
    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Object
    +Warning on line 44 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Object.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Optional.php

    +

    Warnings:


    +Warning on line 9 - Unknown tag "@note" used
    +Warning on line 10 - no @package tag was used in a DocBlock for class HTMLPurifier_ChildDef_Optional
    +Warning on line 21 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Optional.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    PEARSax3.php

    +

    Warnings:


    +Warning on line 21 - Unknown tag "@warning" used
    +Warning on line 22 - no @package tag was used in a DocBlock for class HTMLPurifier_Lexer_PEARSax3
    +Warning on line 103 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/PEARSax3.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Percentage.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_Percentage
    +Warning on line 37 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Percentage.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    PercentEncoder.php

    +

    Warnings:


    +Warning on line 10 - Unknown tag "@warning" used
    +Warning on line 11 - no @package tag was used in a DocBlock for class HTMLPurifier_PercentEncoder
    +Warning on line 49 - Unknown tag "@note" used
    +Warning on line 68 - Unknown tag "@warning" used
    +Warning on line 95 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/PercentEncoder.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    PH5P.php

    +

    Warnings:


    +Warning on line 12 - no @package tag was used in a DocBlock for class HTMLPurifier_Lexer_PH5P
    +Warning on line 12 - Unknown tag "@note" used
    +Warning on line 62 - no @package tag was used in a DocBlock for class HTML5
    +Warning on line 1179 - no @package tag was used in a DocBlock for class HTML5TreeConstructer
    +Warning on line 3905 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/PH5P.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Pixels.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_HTML_Pixels
    +Warning on line 45 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Pixels.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Presentation.php

    +

    Warnings:


    +Warning on line 12 - Unknown tag "@note" used
    +Warning on line 13 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Presentation
    +Warning on line 28 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Presentation.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Printer.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_Printer
    +Warning on line 37 - Unknown tag "@note" used
    +Warning on line 165 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Proprietary.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Tidy_Proprietary
    +Warning on line 6 - Unknown tag "@warning" used
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Proprietary
    +Warning on line 20 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Proprietary.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 30 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Proprietary.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    PurifierLinkify.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_Injector_PurifierLinkify
    +Warning on line 42 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/PurifierLinkify.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    RemoveEmpty.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_Injector_RemoveEmpty
    +Warning on line 39 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/RemoveEmpty.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    RemoveForeignElements.php

    +

    Warnings:


    +Warning on line 11 - no @package tag was used in a DocBlock for class HTMLPurifier_Strategy_RemoveForeignElements
    +Warning on line 168 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/RemoveForeignElements.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Required.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_ChildDef_Required
    +Warning on line 104 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Required.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Ruby.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Ruby
    +Warning on line 24 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Ruby.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    SafeEmbed.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_SafeEmbed
    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_SafeEmbed
    +Warning on line 12 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/SafeEmbed.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 30 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/SafeEmbed.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    SafeObject.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_SafeObject
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_Injector_SafeObject
    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_SafeObject
    +Warning on line 13 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/SafeObject.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 47 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/SafeObject.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 84 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/SafeObject.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    SafeParam.php

    +

    Warnings:


    +Warning on line 14 - Unknown tag "@note" used
    +Warning on line 14 - Unknown tag "@warning" used
    +Warning on line 15 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_SafeParam
    +Warning on line 47 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/SafeParam.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Scripting.php

    +

    Warnings:


    +Warning on line 15 - Unknown tag "@note" used
    +Warning on line 16 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Scripting
    +Warning on line 51 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Scripting.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ScriptRequired.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_ScriptRequired
    +Warning on line 13 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ScriptRequired.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Serializer.php

    +

    Warnings:


    +Warning on line 4 - no @package tag was used in a DocBlock for class HTMLPurifier_DefinitionCache_Serializer
    +Warning on line 79 - Unknown tag "@note" used
    +Warning on line 169 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Session.php

    +

    Warnings:


    +Warning on line 33 - Page-level DocBlock precedes "require_once 'IDS/Caching/Interface.php'", use another DocBlock to document the source element
    +

    Errors:


    +Error on line 33 - require_once include's DocBlock has @package tag, illegal. ignoring tag "@package PHPIDS"
    + +

    Simple.php

    +

    Warnings:


    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_TagTransform_Simple
    +Warning on line 32 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform/Simple.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    SimpleCheck.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_URI_Email_SimpleCheck
    +Warning on line 18 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Start.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_Token_Start
    +Warning on line 8 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Start.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Strategy.php

    +

    Warnings:


    +Warning on line 12 - no @package tag was used in a DocBlock for class HTMLPurifier_Strategy
    +Warning on line 23 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Strict.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Tidy_Strict
    +Warning on line 18 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Strict.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    StrictBlockquote.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_ChildDef_StrictBlockquote
    +Warning on line 17 - Unknown tag "@note" used
    +Warning on line 85 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/StrictBlockquote.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    StringHash.php

    +

    Warnings:


    +Warning on line 10 - Unknown tag "@warning" used
    +Warning on line 11 - no @package tag was used in a DocBlock for class HTMLPurifier_StringHash
    +Warning on line 36 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/StringHash.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    StringHashParser.php

    +

    Warnings:


    +Warning on line 28 - no @package tag was used in a DocBlock for class HTMLPurifier_StringHashParser
    +Warning on line 67 - Unknown tag "@note" used
    +Warning on line 103 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/StringHashParser.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    StyleAttribute.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_StyleAttribute
    +Warning on line 21 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/StyleAttribute.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Switch.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_Switch
    +Warning on line 31 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Switch.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Table.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_ChildDef_Table
    +Warning on line 139 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Table.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Tables.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Tables
    +Warning on line 63 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tables.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Tag.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_Token_Tag
    +Warning on line 22 - Unknown tag "@note" used
    +Warning on line 53 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Tag.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    TagTransform.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_TagTransform
    +Warning on line 28 - Unknown tag "@warning" used
    +Warning on line 33 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Target.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Target
    +Warning on line 20 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Target.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Text.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_Text
    +Warning on line 12 - no @package tag was used in a DocBlock for class HTMLPurifier_Token_Text
    +Warning on line 12 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Text.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 14 - Unknown tag "@note" used
    +Warning on line 15 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Text
    +Warning on line 30 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Text.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 60 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Text.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Textarea.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrTransform_Textarea
    +Warning on line 15 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Textarea.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    TextDecoration.php

    +

    Warnings:


    +Warning on line 7 - Unknown tag "@note" used
    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_TextDecoration
    +Warning on line 35 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Tidy.php

    +

    Warnings:


    +Warning on line 8 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Tidy
    +Warning on line 171 - Unknown tag "@note" used
    +Warning on line 204 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Token.php

    +

    Warnings:


    +Warning on line 5 - no @package tag was used in a DocBlock for class HTMLPurifier_Token
    +Warning on line 53 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    TokenFactory.php

    +

    Warnings:


    +Warning on line 13 - Unknown tag "@note" used
    +Warning on line 14 - no @package tag was used in a DocBlock for class HTMLPurifier_TokenFactory
    +Warning on line 91 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TokenFactory.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Transitional.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Tidy_Transitional
    +Warning on line 6 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    UnitConverter.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_UnitConverter
    +Warning on line 76 - Unknown tag "@note" used
    +Warning on line 251 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/UnitConverter.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    URI.php

    +

    Warnings:


    +Warning on line 6 - Unknown tag "@note" used
    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_URI
    +Warning on line 10 - Unknown tag "@note" used
    +Warning on line 11 - Unknown tag "@note" used
    +Warning on line 11 - no @package tag was used in a DocBlock for class HTMLPurifier_URI
    +Warning on line 11 - Unknown tag "@warning" used
    +Warning on line 12 - no @package tag was used in a DocBlock for class HTMLPurifier_AttrDef_CSS_URI
    +Warning on line 18 - Unknown tag "@note" used
    +Warning on line 53 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/URI.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 74 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +Warning on line 170 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URI.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    URIDefinition.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_URIDefinition
    +Warning on line 90 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIDefinition.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    URIFilter.php

    +

    Warnings:


    +Warning on line 13 - Unknown tag "@warning" used
    +Warning on line 14 - no @package tag was used in a DocBlock for class HTMLPurifier_URIFilter
    +Warning on line 42 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    URIParser.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_URIParser
    +Warning on line 67 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIParser.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    URIScheme.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_URIScheme
    +Warning on line 34 - Unknown tag "@note" used
    +Warning on line 39 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    URISchemeRegistry.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_URISchemeRegistry
    +Warning on line 15 - Unknown tag "@note" used
    +Warning on line 66 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URISchemeRegistry.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ValidateAttributes.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_Strategy_ValidateAttributes
    +Warning on line 36 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/ValidateAttributes.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Validator.php

    +

    Warnings:


    +Warning on line 10 - Unknown tag "@note" used
    +Warning on line 11 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigSchema_Validator
    +Warning on line 222 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Validator.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    ValidatorAtom.php

    +

    Warnings:


    +Warning on line 9 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigSchema_ValidatorAtom
    +Warning on line 63 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    VarParser.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_VarParser
    +Warning on line 129 - Unknown tag "@note" used
    +Warning on line 151 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    VarParserException.php

    +

    Warnings:


    +Warning on line 6 - no @package tag was used in a DocBlock for class HTMLPurifier_VarParserException
    +Warning on line 8 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParserException.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    XHTML.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Tidy_XHTML
    +Warning on line 14 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/XHTML.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    XHTMLAndHTML4.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4
    +Warning on line 158 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    Xml.php

    +

    Warnings:


    +Warning on line 7 - no @package tag was used in a DocBlock for class HTMLPurifier_ConfigSchema_Builder_Xml
    +Warning on line 105 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    XMLCommonAttributes.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_HTMLModule_XMLCommonAttributes
    +Warning on line 11 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    + +

    YouTube.php

    +

    Warnings:


    +Warning on line 3 - no @package tag was used in a DocBlock for class HTMLPurifier_Filter_YouTube
    +Warning on line 29 - File "/home/mario/workspace/php-ids.org/trunk/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter/YouTube.php" has no page-level DocBlock, use @package in the first DocBlock to create one
    +

    + Documentation generated on Mon, 22 Dec 2008 13:36:56 +0100 by phpDocumentor 1.4.2 +

    + + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/index.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/index.html new file mode 100644 index 0000000..823da12 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/index.html @@ -0,0 +1,24 @@ + + + + + + Generated Documentation + + + + + + + + + + + <H2>Frame Alert</H2> + <P>This document is designed to be viewed using the frames feature. + If you see this message, you are using a non-frame-capable web client.</P> + + + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/li_PHPIDS.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/li_PHPIDS.html new file mode 100644 index 0000000..826977a --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/li_PHPIDS.html @@ -0,0 +1,69 @@ + + + + + + + + + + +
    PHPIDS
    + +

    phpDocumentor v 1.4.2

    + + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/media/banner.css b/dvwa/external/phpids/0.6/docs/phpdocumentor/media/banner.css new file mode 100644 index 0000000..f2149eb --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/media/banner.css @@ -0,0 +1,32 @@ +body +{ + background-color: #CCCCFF; + margin: 0px; + padding: 0px; +} + +/* Banner (top bar) classes */ + +.banner { } + +.banner-menu +{ + clear: both; + padding: .5em; + border-top: 2px solid #6666AA; +} + +.banner-title +{ + text-align: right; + font-size: 20pt; + font-weight: bold; + margin: .2em; +} + +.package-selector +{ + background-color: #AAAADD; + border: 1px solid black; + color: yellow; +} diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/media/stylesheet.css b/dvwa/external/phpids/0.6/docs/phpdocumentor/media/stylesheet.css new file mode 100644 index 0000000..1fc91c1 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/media/stylesheet.css @@ -0,0 +1,144 @@ +a { color: #336699; text-decoration: none; } +a:hover { color: #6699CC; text-decoration: underline; } +a:active { color: #6699CC; text-decoration: underline; } + +body { background : #FFFFFF; } +body, table { font-family: Georgia, Times New Roman, Times, serif; font-size: 10pt } +p, li { line-height: 140% } +a img { border: 0px; } +dd { margin-left: 0px; padding-left: 1em; } + +/* Page layout/boxes */ + +.info-box {} +.info-box-title { margin: 1em 0em 0em 0em; padding: .25em; font-weight: normal; font-size: 14pt; border: 2px solid #999999; background-color: #CCCCFF } +.info-box-body { border: 1px solid #999999; padding: .5em; } +.nav-bar { font-size: 8pt; white-space: nowrap; text-align: right; padding: .2em; margin: 0em 0em 1em 0em; } + +.oddrow { background-color: #F8F8F8; border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em} +.evenrow { border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em} + +.page-body { max-width: 800px; margin: auto; } +.tree dl { margin: 0px } + +/* Index formatting classes */ + +.index-item-body { margin-top: .5em; margin-bottom: .5em} +.index-item-description { margin-top: .25em } +.index-item-details { font-weight: normal; font-style: italic; font-size: 8pt } +.index-letter-section { background-color: #EEEEEE; border: 1px dotted #999999; padding: .5em; margin-bottom: 1em} +.index-letter-title { font-size: 12pt; font-weight: bold } +.index-letter-menu { text-align: center; margin: 1em } +.index-letter { font-size: 12pt } + +/* Docbook classes */ + +.description {} +.short-description { font-weight: bold; color: #666666; } +.tags { padding-left: 0em; margin-left: 3em; color: #666666; list-style-type: square; } +.parameters { padding-left: 0em; margin-left: 3em; font-style: italic; list-style-type: square; } +.redefinitions { font-size: 8pt; padding-left: 0em; margin-left: 2em; } +.package { } +.package-title { font-weight: bold; font-size: 14pt; border-bottom: 1px solid black } +.package-details { font-size: 85%; } +.sub-package { font-weight: bold; font-size: 120% } +.tutorial { border-width: thin; border-color: #0066ff } +.tutorial-nav-box { width: 100%; border: 1px solid #999999; background-color: #F8F8F8; } +.nav-button-disabled { color: #999999; } +.nav-button:active, +.nav-button:focus, +.nav-button:hover { background-color: #DDDDDD; outline: 1px solid #999999; text-decoration: none } +.folder-title { font-style: italic } + +/* Generic formatting */ + +.field { font-weight: bold; } +.detail { font-size: 8pt; } +.notes { font-style: italic; font-size: 8pt; } +.separator { background-color: #999999; height: 2px; } +.warning { color: #FF6600; } +.disabled { font-style: italic; color: #999999; } + +/* Code elements */ + +.line-number { } + +.class-table { width: 100%; } +.class-table-header { border-bottom: 1px dotted #666666; text-align: left} +.class-name { color: #000000; font-weight: bold; } + +.method-summary { padding-left: 1em; font-size: 8pt } +.method-header { } +.method-definition { margin-bottom: .3em } +.method-title { font-weight: bold; } +.method-name { font-weight: bold; } +.method-signature { font-size: 85%; color: #666666; margin: .5em 0em } +.method-result { font-style: italic; } + +.var-summary { padding-left: 1em; font-size: 8pt; } +.var-header { } +.var-title { margin-bottom: .3em } +.var-type { font-style: italic; } +.var-name { font-weight: bold; } +.var-default {} +.var-description { font-weight: normal; color: #000000; } + +.include-title { } +.include-type { font-style: italic; } +.include-name { font-weight: bold; } + +.const-title { } +.const-name { font-weight: bold; } + +/* Syntax highlighting */ + +.src-code { border: 1px solid #336699; padding: 1em; background-color: #EEEEEE; } +.src-line { font-family: 'Courier New', Courier, monospace; font-weight: normal; } + +.src-comm { color: green; } +.src-id { } +.src-inc { color: #0000FF; } +.src-key { color: #0000FF; } +.src-num { color: #CC0000; } +.src-str { color: #66cccc; } +.src-sym { font-weight: bold; } +.src-var { } + +.src-php { font-weight: bold; } + +.src-doc { color: #009999 } +.src-doc-close-template { color: #0000FF } +.src-doc-coretag { color: #0099FF; font-weight: bold } +.src-doc-inlinetag { color: #0099FF } +.src-doc-internal { color: #6699cc } +.src-doc-tag { color: #0080CC } +.src-doc-template { color: #0000FF } +.src-doc-type { font-style: italic } +.src-doc-var { font-style: italic } + +.tute-tag { color: #009999 } +.tute-attribute-name { color: #0000FF } +.tute-attribute-value { color: #0099FF } +.tute-entity { font-weight: bold; } +.tute-comment { font-style: italic } +.tute-inline-tag { color: #636311; font-weight: bold } + +/* tutorial */ + +.authors { } +.author { font-style: italic; font-weight: bold } +.author-blurb { margin: .5em 0em .5em 2em; font-size: 85%; font-weight: normal; font-style: normal } +.example { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; } +*[class="example"] { line-height : 0.5em } +.listing { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; white-space: nowrap; } +*[class="listing"] { line-height : 0.5em } +.release-info { font-size: 85%; font-style: italic; margin: 1em 0em } +.ref-title-box { } +.ref-title { } +.ref-purpose { font-style: italic; color: #666666 } +.ref-synopsis { } +.title { font-weight: bold; margin: 1em 0em 0em 0em; padding: .25em; border: 2px solid #999999; background-color: #CCCCFF } +.cmd-synopsis { margin: 1em 0em } +.cmd-title { font-weight: bold } +.toc { margin-left: 2em; padding-left: 0em } + diff --git a/dvwa/external/phpids/0.6/docs/phpdocumentor/packages.html b/dvwa/external/phpids/0.6/docs/phpdocumentor/packages.html new file mode 100644 index 0000000..2f76eb1 --- /dev/null +++ b/dvwa/external/phpids/0.6/docs/phpdocumentor/packages.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/lib/IDS/Caching/Database.php b/dvwa/external/phpids/0.6/lib/IDS/Caching/Database.php new file mode 100644 index 0000000..52aad70 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Caching/Database.php @@ -0,0 +1,286 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +require_once 'IDS/Caching/Interface.php'; + +/** + * Needed SQL: + * + + #create the database + + CREATE DATABASE IF NOT EXISTS `phpids` DEFAULT CHARACTER + SET utf8 COLLATE utf8_general_ci; + DROP TABLE IF EXISTS `cache`; + + #now select the created datbase and create the table + + CREATE TABLE `cache` ( + `type` VARCHAR( 32 ) NOT null , + `data` TEXT NOT null , + `created` DATETIME NOT null , + `modified` DATETIME NOT null + ) ENGINE = MYISAM ; + */ + +/** + * Database caching wrapper + * + * This class inhabits functionality to get and set cache via a database. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Groupup + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Database.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + * @since Version 0.4 + */ +class IDS_Caching_Database implements IDS_Caching_Interface +{ + + /** + * Caching type + * + * @var string + */ + private $type = null; + + /** + * Cache configuration + * + * @var array + */ + private $config = null; + + /** + * DBH + * + * @var object + */ + private $handle = null; + + /** + * Holds an instance of this class + * + * @var object + */ + private static $cachingInstance = null; + + /** + * Constructor + * + * Connects to database. + * + * @param string $type caching type + * @param array $init the IDS_Init object + * + * @return void + */ + public function __construct($type, $init) + { + + $this->type = $type; + $this->config = $init->config['Caching']; + $this->handle = $this->_connect(); + } + + /** + * Returns an instance of this class + * + * @param string $type caching type + * @param array $init the IDS_Init object + * + * @return object $this + */ + public static function getInstance($type, $init) + { + + if (!self::$cachingInstance) { + self::$cachingInstance = new IDS_Caching_Database($type, $init); + } + return self::$cachingInstance; + } + + /** + * Writes cache data into the database + * + * @param array $data the caching data + * + * @throws PDOException if a db error occurred + * @return object $this + */ + public function setCache(array $data) + { + + $handle = $this->handle; + + $rows = $handle->query('SELECT created FROM `' . + $handle->quote($this->config['table']).'`'); + + if (!$rows || $rows->rowCount() === 0) { + + $this->_write($handle, $data); + } else { + + foreach ($rows as $row) { + + if ((time()-strtotime($row['created'])) > + $this->config['expiration_time']) { + + $this->_write($handle, $data); + } + } + } + + return $this; + } + + /** + * Returns the cached data + * + * Note that this method returns false if either type or file cache is + * not set + * + * @throws PDOException if a db error occurred + * @return mixed cache data or false + */ + public function getCache() + { + + try{ + $handle = $this->handle; + $result = $handle->prepare('SELECT * FROM ' . + $handle->quote($this->config['table']) . + ' where type=?'); + $result->execute(array($this->type)); + + foreach ($result as $row) { + return unserialize($row['data']); + } + + } catch (PDOException $e) { + die('PDOException: ' . $e->getMessage()); + } + return false; + } + + /** + * Connect to database and return a handle + * + * @return object dbh + * @throws PDOException if a db error occurred + */ + private function _connect() + { + + // validate connection parameters + if (!$this->config['wrapper'] + || !$this->config['user'] + || !$this->config['password'] + || !$this->config['table']) { + + throw new Exception(' + Insufficient connection parameters' + ); + } + + // try to connect + try { + $handle = new PDO( + $this->config['wrapper'], + $this->config['user'], + $this->config['password'] + ); + + } catch (PDOException $e) { + die('PDOException: ' . $e->getMessage()); + } + return $handle; + } + + /** + * Write the cache data to the table + * + * @param object $handle the database handle + * @param array $data the caching data + * + * @return object dbh + * @throws PDOException if a db error occurred + */ + private function _write($handle, $data) + { + + try { + $handle->query('TRUNCATE ' . + $this->config['table'].''); + $statement = $handle->prepare(' + INSERT INTO `' . + $this->config['table'].'` ( + type, + data, + created, + modified + ) + VALUES ( + :type, + :data, + now(), + now() + ) + '); + + $statement->bindParam('type', + $handle->quote($this->type)); + $statement->bindParam('data', serialize($data)); + + if (!$statement->execute()) { + throw new PDOException($statement->errorCode()); + } + + } catch (PDOException $e) { + die('PDOException: ' . $e->getMessage()); + } + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Caching/Factory.php b/dvwa/external/phpids/0.6/lib/IDS/Caching/Factory.php new file mode 100644 index 0000000..0ae0ed9 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Caching/Factory.php @@ -0,0 +1,94 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +/** + * Caching factory + * + * This class is used as a factory to load the correct concrete caching + * implementation. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Factory.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + * @since Version 0.4 + */ +class IDS_Caching +{ + + /** + * Factory method + * + * @param array $init the IDS_Init object + * @param string $type the caching type + * + * @return object the caching facility + */ + public static function factory($init, $type) + { + + $object = false; + $wrapper = preg_replace( + '/\W+/m', + null, + ucfirst($init->config['Caching']['caching']) + ); + $class = 'IDS_Caching_' . $wrapper; + $path = dirname(__FILE__) . DIRECTORY_SEPARATOR . + $wrapper . '.php'; + + if (file_exists($path)) { + include_once $path; + + if (class_exists($class)) { + $object = call_user_func(array($class, 'getInstance'), + $type, $init); + } + } + + return $object; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Caching/File.php b/dvwa/external/phpids/0.6/lib/IDS/Caching/File.php new file mode 100644 index 0000000..7971f62 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Caching/File.php @@ -0,0 +1,183 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +require_once 'IDS/Caching/Interface.php'; + +/** + * File caching wrapper + * + * This class inhabits functionality to get and set cache via a static flatfile. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:File.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + * @since Version 0.4 + */ +class IDS_Caching_File implements IDS_Caching_Interface +{ + + /** + * Caching type + * + * @var string + */ + private $type = null; + + /** + * Cache configuration + * + * @var array + */ + private $config = null; + + /** + * Path to cache file + * + * @var string + */ + private $path = null; + + /** + * Holds an instance of this class + * + * @var object + */ + private static $cachingInstance = null; + + /** + * Constructor + * + * @param string $type caching type + * @param array $init the IDS_Init object + * + * @return void + */ + public function __construct($type, $init) + { + + $this->type = $type; + $this->config = $init->config['Caching']; + $this->path = $init->getBasePath() . $this->config['path']; + + if (file_exists($this->path) && !is_writable($this->path)) { + throw new Exception('Make sure all files in ' . + htmlspecialchars($this->path, ENT_QUOTES, 'UTF-8') . + 'are writeable!'); + } + } + + /** + * Returns an instance of this class + * + * @param string $type caching type + * @param array $init the IDS_Init object + * + * @return object $this + */ + public static function getInstance($type, $init) + { + if (!self::$cachingInstance) { + self::$cachingInstance = new IDS_Caching_File($type, $init); + } + + return self::$cachingInstance; + } + + /** + * Writes cache data into the file + * + * @param array $data the cache data + * + * @throws Exception if cache file couldn't be created + * @return object $this + */ + public function setCache(array $data) + { + + if (!is_writable(preg_replace('/[\/][^\/]+\.[^\/]++$/', null, + $this->path))) { + throw new Exception('Temp directory ' . + htmlspecialchars($this->path, ENT_QUOTES, 'UTF-8') . + ' seems not writable'); + } + + if ((!file_exists($this->path) || (time()-filectime($this->path)) > + $this->config['expiration_time'])) { + $handle = @fopen($this->path, 'w+'); + + if (!$handle) { + throw new Exception("Cache file couldn't be created"); + } + + fwrite($handle, serialize($data)); + fclose($handle); + } + + return $this; + } + + /** + * Returns the cached data + * + * Note that this method returns false if either type or file cache is + * not set + * + * @return mixed cache data or false + */ + public function getCache() + { + + // make sure filters are parsed again if cache expired + if (file_exists($this->path) && (time()-filectime($this->path)) < + $this->config['expiration_time']) { + $data = unserialize(file_get_contents($this->path)); + return $data; + } + + return false; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Caching/Interface.php b/dvwa/external/phpids/0.6/lib/IDS/Caching/Interface.php new file mode 100644 index 0000000..6ec77fc --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Caching/Interface.php @@ -0,0 +1,73 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +/** + * Caching wrapper interface + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @version SVN: $Id:Interface.php 517 2007-09-15 15:04:13Z mario $ + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @since Version 0.4 + * @link http://php-ids.org/ + */ +interface IDS_Caching_Interface +{ + /** + * Interface method + * + * @param array $data the cache data + * + * @return void + */ + public function setCache(array $data); + + /** + * Interface method + * + * @return void + */ + public function getCache(); +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Caching/Memcached.php b/dvwa/external/phpids/0.6/lib/IDS/Caching/Memcached.php new file mode 100644 index 0000000..4d24f82 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Caching/Memcached.php @@ -0,0 +1,228 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +require_once 'IDS/Caching/Interface.php'; + +/** + * File caching wrapper + * + * This class inhabits functionality to get and set cache via memcached. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Groupoup + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Memcached.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + * @since Version 0.4 + */ +class IDS_Caching_Memcached implements IDS_Caching_Interface +{ + + /** + * Caching type + * + * @var string + */ + private $type = null; + + /** + * Cache configuration + * + * @var array + */ + private $config = null; + + /** + * Path to memcache timestamp file + * + * @var string + */ + private $path = null; + + /** + * Flag if the filter storage has been found in memcached + * + * @var boolean + */ + private $isCached = false; + + /** + * Memcache object + * + * @var object + */ + private $memcache = null; + + /** + * Holds an instance of this class + * + * @var object + */ + private static $cachingInstance = null; + + + /** + * Constructor + * + * @param string $type caching type + * @param array $init the IDS_Init object + * + * @throws Exception if necessary files aren't writeable + * @return void + */ + public function __construct($type, $init) + { + + $this->type = $type; + $this->config = $init->config['Caching']; + $this->path = $init->getBasePath() . $this->config['path']; + + $this->_connect(); + + if (file_exists($this->path) && !is_writable($this->path)) { + throw new Exception('Make sure all files in ' . + htmlspecialchars($this->path, ENT_QUOTES, 'UTF-8') . + ' are writeable!'); + } + } + + /** + * Returns an instance of this class + * + * @param string $type caching type + * @param array $init the IDS_Init object + * + * @return object $this + */ + public static function getInstance($type, $init) + { + + if (!self::$cachingInstance) { + self::$cachingInstance = new IDS_Caching_Memcached($type, $init); + } + + return self::$cachingInstance; + } + + /** + * Writes cache data + * + * @param array $data the caching data + * + * @throws Exception if necessary files aren't writeable + * @return object $this + */ + public function setCache(array $data) + { + + if (!file_exists($this->path)) { + $handle = fopen($this->path, 'w'); + fclose($handle); + } + + if (!is_writable($this->path)) { + throw new Exception('Make sure all files in ' . + htmlspecialchars($this->path, ENT_QUOTES, 'UTF-8') . + ' are writeable!'); + } + + if(!$this->isCached) { + $this->memcache->set( + $this->config['key_prefix'] . '.storage', + $data, false, $this->config['expiration_time'] + ); + } + + return $this; + } + + /** + * Returns the cached data + * + * Note that this method returns false if either type or file cache is + * not set + * + * @return mixed cache data or false + */ + public function getCache() + { + + $data = $this->memcache->get( + $this->config['key_prefix'] . + '.storage' + ); + $this->isCached = !empty($data); + + return $data; + } + + /** + * Connect to the memcached server + * + * @throws Exception if connection parameters are insufficient + * @return void + */ + private function _connect() + { + + if ($this->config['host'] && $this->config['port']) { + // establish the memcache connection + $this->memcache = new Memcache; + $this->memcache->pconnect($this->config['host'], + $this->config['port']); + $this->path = $this->config['tmp_path']; + + if(isset($init->config['General']['base_path']) + && $init->config['General']['base_path'] + && isset($init->config['General']['use_base_path']) + && $init->config['General']['use_base_path']) { + $this->source = $init->config['General']['base_path'] . $this->path; + } + + } else { + throw new Exception('Insufficient connection parameters'); + } + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Caching/Session.php b/dvwa/external/phpids/0.6/lib/IDS/Caching/Session.php new file mode 100644 index 0000000..e5a1671 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Caching/Session.php @@ -0,0 +1,146 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +require_once 'IDS/Caching/Interface.php'; + +/** + * File caching wrapper + * + * This class inhabits functionality to get and set cache via session. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Session.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + * @since Version 0.4 + */ +class IDS_Caching_Session implements IDS_Caching_Interface +{ + + /** + * Caching type + * + * @var string + */ + private $type = null; + + /** + * Cache configuration + * + * @var array + */ + private $config = null; + + /** + * Holds an instance of this class + * + * @var object + */ + private static $cachingInstance = null; + + /** + * Constructor + * + * @param string $type caching type + * @param array $init the IDS_Init object + * + * @return void + */ + public function __construct($type, $init) + { + $this->type = $type; + $this->config = $init->config['Caching']; + } + + /** + * Returns an instance of this class + * + * @param string $type caching type + * @param array $init the IDS_Init object + * + * @return object $this + */ + public static function getInstance($type, $init) + { + + if (!self::$cachingInstance) { + self::$cachingInstance = new IDS_Caching_Session($type, $init); + } + + return self::$cachingInstance; + } + + /** + * Writes cache data into the session + * + * @param array $data the caching data + * + * @return object $this + */ + public function setCache(array $data) + { + + $_SESSION['PHPIDS'][$this->type] = $data; + return $this; + } + + /** + * Returns the cached data + * + * Note that this method returns false if either type or file cache is not set + * + * @return mixed cache data or false + */ + public function getCache() + { + + if ($this->type && $_SESSION['PHPIDS'][$this->type]) { + return $_SESSION['PHPIDS'][$this->type]; + } + + return false; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Config/Config.ini b/dvwa/external/phpids/0.6/lib/IDS/Config/Config.ini new file mode 100644 index 0000000..b96eaf3 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Config/Config.ini @@ -0,0 +1,89 @@ +; PHPIDS Config.ini + +; General configuration settings + +; !!!DO NOT PLACE THIS FILE INSIDE THE WEB-ROOT IF DATABASE CONNECTION DATA WAS ADDED!!! + +[General] + + ; basic settings - customize to make the PHPIDS work at all + filter_type = xml + + base_path = /full/path/to/IDS/ + use_base_path = false + + filter_path = default_filter.xml + tmp_path = tmp + scan_keys = false + + ; in case you want to use a different HTMLPurifier source, specify it here + ; By default, those files are used that are being shipped with PHPIDS + HTML_Purifier_Path = IDS/vendors/htmlpurifier/HTMLPurifier.auto.php + HTML_Purifier_Cache = IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer + + ; define which fields contain html and need preparation before + ; hitting the PHPIDS rules (new in PHPIDS 0.5) + html[] = __wysiwyg + + ; define which fields contain JSON data and should be treated as such + ; for fewer false positives (new in PHPIDS 0.5.3) + json[] = __jsondata + + ; define which fields shouldn't be monitored (a[b]=c should be referenced via a.b) + exceptions[] = __utmz + exceptions[] = __utmc + + ; PHPIDS should run with PHP 5.1.2 but this is untested - set + ; this value to force compatibilty with minor versions + min_php_version = 5.1.6 + +; If you use the PHPIDS logger you can define specific configuration here + +[Logging] + + ; file logging + path = tmp/phpids_log.txt + + ; email logging + + ; note that enabling safemode you can prevent spam attempts, + ; see documentation + recipients[] = test@test.com.invalid + subject = "PHPIDS detected an intrusion attempt!" + header = "From: info@php-ids.org" + envelope = "" + safemode = true + urlencode = true + allowed_rate = 15 + + ; database logging + + wrapper = "mysql:host=localhost;port=3306;dbname=phpids" + user = phpids_user + password = 123456 + table = intrusions + +; If you would like to use other methods than file caching you can configure them here + +[Caching] + + ; caching: session|file|database|memcached|none + caching = file + expiration_time = 600 + + ; file cache + path = tmp/default_filter.cache + + ; database cache + wrapper = "mysql:host=localhost;port=3306;dbname=phpids" + user = phpids_user + password = 123456 + table = cache + + ; memcached + ;host = localhost + ;port = 11211 + ;key_prefix = PHPIDS + ;tmp_path = tmp/memcache.timestamp + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/Converter.php b/dvwa/external/phpids/0.6/lib/IDS/Converter.php new file mode 100644 index 0000000..4a6d878 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Converter.php @@ -0,0 +1,721 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +/** + * PHPIDS specific utility class to convert charsets manually + * + * Note that if you make use of IDS_Converter::runAll(), existing class + * methods will be executed in the same order as they are implemented in the + * class tree! + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Converter.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + */ +class IDS_Converter +{ + /** + * Runs all converter functions + * + * Note that if you make use of IDS_Converter::runAll(), existing class + * methods will be executed in the same order as they are implemented in the + * class tree! + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function runAll($value) + { + foreach (get_class_methods(__CLASS__) as $method) { + + if (strpos($method, 'run') === 0) { + continue; + } + $value = self::$method($value); + } + + return $value; + } + + /** + * Check for comments and erases them if available + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromCommented($value) + { + // check for existing comments + if (preg_match('/(?:\|\/\*|\*\/|\/\/\W*\w+\s*$)|' . + '(?:--[^-]*-)/ms', $value)) { + + $pattern = array( + '/(?:(?:))/ms', + '/(?:(?:\/\*\/*[^\/\*]*)+\*\/)/ms', + '/(?:--[^-]*-)/ms' + ); + + $converted = preg_replace($pattern, ';', $value); + $value .= "\n" . $converted; + } + + // deal with x509 false alerts + $value = preg_replace('/(\w+)\/\/(\w+)/m', '$1/$2', $value); + $value = preg_replace('/(\w+)\/\+(\w+)/m', '$1/$2', $value); + + //make sure inline comments are detected and converted correctly + $value = preg_replace('/(<\w+)\/+(\w+=?)/m', '$1/$2', $value); + $value = preg_replace('/[^\\\:]\/\/(.*)$/m', '/**/$1', $value); + + return $value; + } + + /** + * Strip newlines + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromNewLines($value) + { + //check for inline linebreaks + $search = array('\r', '\n', '\f', '\t', '\v'); + $value = str_replace($search, ';', $value); + + //convert real linebreaks + return preg_replace('/(?:\n|\r|\v)/m', ' ', $value); + } + + /** + * Checks for common charcode pattern and decodes them + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromJSCharcode($value) + { + $matches = array(); + + // check if value matches typical charCode pattern + if (preg_match_all('/(?:[\d+-=\/\* ]+(?:\s?,\s?[\d+-=\/\* ]+)){4,}/ms', + $value, $matches)) { + + $converted = ''; + $string = implode(',', $matches[0]); + $string = preg_replace('/\s/', '', $string); + $string = preg_replace('/\w+=/', '', $string); + $charcode = explode(',', $string); + + foreach ($charcode as $char) { + $char = preg_replace('/\W0/s', '', $char); + + if (preg_match_all('/\d*[+-\/\* ]\d+/', $char, $matches)) { + $match = preg_split('/(\W?\d+)/', + (implode('', $matches[0])), + null, + PREG_SPLIT_DELIM_CAPTURE); + + if (array_sum($match) >= 20 && array_sum($match) <= 127) { + $converted .= chr(array_sum($match)); + } + + } elseif (!empty($char) && $char >= 20 && $char <= 127) { + $converted .= chr($char); + } + } + + $value .= "\n" . $converted; + } + + // check for octal charcode pattern + if (preg_match_all('/(?:(?:[\\\]+\d+[ \t]*){8,})/ims', $value, $matches)) { + + $converted = ''; + $charcode = explode('\\', preg_replace('/\s/', '', implode(',', + $matches[0]))); + + foreach ($charcode as $char) { + if (!empty($char)) { + if (octdec($char) >= 20 && octdec($char) <= 127) { + $converted .= chr(octdec($char)); + } + } + } + $value .= "\n" . $converted; + } + + // check for hexadecimal charcode pattern + if (preg_match_all('/(?:(?:[\\\]+\w+\s*){8,})/ims', $value, $matches)) { + + $converted = ''; + $charcode = explode('\\', preg_replace('/[ux]/', '', implode(',', + $matches[0]))); + + foreach ($charcode as $char) { + if (!empty($char)) { + if (hexdec($char) >= 20 && hexdec($char) <= 127) { + $converted .= chr(hexdec($char)); + } + } + } + $value .= "\n" . $converted; + } + + return $value; + } + + /** + * Eliminate JS regex modifiers + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertJSRegexModifiers($value) + { + $value = preg_replace('/\/[gim]/', '/', $value); + + return $value; + } + + /** + * Converts from hex/dec entities + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertEntities($value) + { + $converted = null; + + //deal with double encoded payload + $value = preg_replace('/&/', '&', $value); + + if (preg_match('/&#x?[\w]+/ms', $value)) { + $converted = preg_replace('/(&#x?[\w]{2}\d?);?/ms', '$1;', $value); + $converted = html_entity_decode($converted, ENT_QUOTES, 'UTF-8'); + $value .= "\n" . str_replace(';;', ';', $converted); + } + + return $value; + } + + /** + * Normalize quotes + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertQuotes($value) + { + // normalize different quotes to " + $pattern = array('\'', '`', '´', '’', '‘'); + $value = str_replace($pattern, '"', $value); + + return $value; + } + + /** + * Converts SQLHEX to plain text + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromSQLHex($value) + { + $matches = array(); + if(preg_match_all('/(?:0x[a-f\d]{2,}[a-f\d]*)+/im', $value, $matches)) { + foreach($matches[0] as $match) { + $converted = ''; + foreach(str_split($match, 2) as $hex_index) { + if(preg_match('/[a-f\d]{2,3}/i', $hex_index)) { + $converted .= chr(hexdec($hex_index)); + } + } + $value = str_replace($match, $converted, $value); + } + } + // take care of hex encoded ctrl chars + $value = preg_replace('/0x\d+/m', 1, $value); + + return $value; + } + + /** + * Converts basic SQL keywords and obfuscations + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromSQLKeywords($value) + { + $pattern = array('/(?:IS\s+null)|(LIKE\s+null)|' . + '(?:(?:^|\W)IN[+\s]*\([\s\d"]+[^()]*\))/ims'); + $value = preg_replace($pattern, '"=0', $value); + $value = preg_replace('/null[,\s]/ims', ',0', $value); + $value = preg_replace('/,null/ims', ',0', $value); + $value = preg_replace('/(?:between|mod)/ims', 'or', $value); + $value = preg_replace('/(?:and\s+\d+\.?\d*)/ims', '', $value); + $value = preg_replace('/(?:\s+and\s+)/ims', ' or ', $value); + $pattern = array('/[^\w,(]NULL|\\\N|TRUE|FALSE|UTC_TIME|' . + 'LOCALTIME(?:STAMP)?|CURRENT_\w+|BINARY|' . + '(?:(?:ASCII|SOUNDEX|' . + 'MD5|R?LIKE)[+\s]*\([^()]+\))|(?:-+\d)/ims'); + $value = preg_replace($pattern, 0, $value); + $pattern = array('/(?:NOT\s+BETWEEN)|(?:IS\s+NOT)|(?:NOT\s+IN)|' . + '(?:XOR|\WDIV\W|\WNOT\W|<>|RLIKE(?:\s+BINARY)?)|' . + '(?:REGEXP\s+BINARY)|' . + '(?:SOUNDS\s+LIKE)/ims'); + $value = preg_replace($pattern, '!', $value); + $value = preg_replace('/"\s+\d/', '"', $value); + $value = preg_replace('/\/(?:\d+|null)/', null, $value); + + return $value; + } + + /** + * Detects nullbytes and controls chars via ord() + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromControlChars($value) + { + // critical ctrl values + $search = array(chr(0), chr(1), chr(2), + chr(3), chr(4), chr(5), + chr(6), chr(7), chr(8), + chr(11), chr(12), chr(14), + chr(15), chr(16), chr(17), + chr(18), chr(19)); + $value = str_replace($search, '%00', $value); + $urlencoded = urlencode($value); + + //take care for malicious unicode characters + $value = urldecode(preg_replace('/(?:%E(?:2|3)%8(?:0|1)%(?:A|8|9)' . + '\w|%EF%BB%BF|%EF%BF%BD)|(?:&#(?:65|8)\d{3};?)/i', null, + $urlencoded)); + + $value = preg_replace('/(?:&[#x]*(200|820|200|820|zwn?j|lrm|rlm)\w?;?)/i', null, + $value); + + $value = preg_replace('/(?:&#(?:65|8)\d{3};?)|' . + '(?:&#(?:56|7)3\d{2};?)|' . + '(?:&#x(?:fe|20)\w{2};?)|' . + '(?:&#x(?:d[c-f])\w{2};?)/i', null, + $value); + + return $value; + } + + /** + * This method matches and translates base64 strings and fragments + * used in data URIs + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromNestedBase64($value) + { + $matches = array(); + preg_match_all('/(?:^|[,&?])\s*([a-z0-9]{30,}=*)(?:\W|$)/im', + $value, + $matches); + + foreach ($matches[1] as $item) { + if (isset($item) && !preg_match('/[a-f0-9]{32}/i', $item)) { + $value = str_replace($item, base64_decode($item), $value); + } + } + + return $value; + } + + /** + * Detects nullbytes and controls chars via ord() + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromOutOfRangeChars($value) + { + $values = str_split($value); + foreach ($values as $item) { + if (ord($item) >= 127) { + $value = str_replace($item, 'U', $value); + } + } + + return $value; + } + + /** + * Strip XML patterns + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromXML($value) + { + $converted = strip_tags($value); + + if ($converted && ($converted != $value)) { + return $value . "\n" . $converted; + } + return $value; + } + + /** + * This method converts JS unicode code points to + * regular characters + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromJSUnicode($value) + { + $matches = array(); + + preg_match_all('/\\\u[0-9a-f]{4}/ims', $value, $matches); + + if (!empty($matches[0])) { + foreach ($matches[0] as $match) { + $value = str_replace($match, + chr(hexdec(substr($match, 2, 4))), + $value); + } + $value .= "\n\u0001"; + } + + return $value; + } + + + /** + * Converts relevant UTF-7 tags to UTF-8 + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromUTF7($value) + { + if(preg_match('/\+A\w+-/m', $value)) { + if (function_exists('mb_convert_encoding')) { + if(version_compare(PHP_VERSION, '5.2.8', '<')) { + $tmp_chars = str_split($value); + $value = ''; + foreach($tmp_chars as $char) { + if(ord($char) <= 127) { + $value .= $char; + } + } + } + $value .= "\n" . mb_convert_encoding($value, 'UTF-8', 'UTF-7'); + } else { + //list of all critical UTF7 codepoints + $schemes = array( + '+ACI-' => '"', + '+ADw-' => '<', + '+AD4-' => '>', + '+AFs-' => '[', + '+AF0-' => ']', + '+AHs-' => '{', + '+AH0-' => '}', + '+AFw-' => '\\', + '+ADs-' => ';', + '+ACM-' => '#', + '+ACY-' => '&', + '+ACU-' => '%', + '+ACQ-' => '$', + '+AD0-' => '=', + '+AGA-' => '`', + '+ALQ-' => '"', + '+IBg-' => '"', + '+IBk-' => '"', + '+AHw-' => '|', + '+ACo-' => '*', + '+AF4-' => '^', + '+ACIAPg-' => '">', + '+ACIAPgA8-' => '">' + ); + + $value = str_ireplace(array_keys($schemes), + array_values($schemes), $value); + } + } + return $value; + } + + /** + * Converts basic concatenations + * + * @param string $value the value to convert + * + * @static + * @return string + */ + public static function convertFromConcatenated($value) + { + //normalize remaining backslashes + if ($value != preg_replace('/(\w)\\\/', "$1", $value)) { + $value .= preg_replace('/(\w)\\\/', "$1", $value); + } + + $compare = stripslashes($value); + + $pattern = array('/(?:<\/\w+>\+<\w+>)/s', + '/(?:":\d+[^"[]+")/s', + '/(?:"?"\+\w+\+")/s', + '/(?:"\s*;[^"]+")|(?:";[^"]+:\s*")/s', + '/(?:"\s*(?:;|\+).{8,18}:\s*")/s', + '/(?:";\w+=)|(?:!""&&")|(?:~)/s', + '/(?:"?"\+""?\+?"?)|(?:;\w+=")|(?:"[|&]{2,})/s', + '/(?:"\s*\W+")/s', + '/(?:";\w\s*\+=\s*\w?\s*")/s', + '/(?:"[|&;]+\s*[^|&\n]*[|&]+\s*"?)/s', + '/(?:";\s*\w+\W+\w*\s*[|&]*")/s', + '/(?:"\s*"\s*\.)/s', + '/(?:\s*new\s+\w+\s*[+",])/', + '/(?:(?:^|\s+)(?:do|else)\s+)/', + '/(?:[{(]\s*new\s+\w+\s*[)}])/', + '/(?:(this|self)\.)/', + '/(?:undefined)/', + '/(?:in\s+)/'); + + // strip out concatenations + $converted = preg_replace($pattern, null, $compare); + + //strip object traversal + $converted = preg_replace('/\w(\.\w\()/', "$1", $converted); + + // normalize obfuscated method calls + $converted = preg_replace('/\)\s*\+/', ")", $converted); + + //convert JS special numbers + $converted = preg_replace('/(?:\(*[.\d]e[+-]*[^a-z\W]+\)*)' . + '|(?:NaN|Infinity)\W/ms', 1, $converted); + + if ($converted && ($compare != $converted)) { + $value .= "\n" . $converted; + } + + return $value; + } + + /** + * This method collects and decodes proprietary encoding types + * + * @param string $value the value to convert + * @param IDS_Monitor $monitor the monitor object + * + * @static + * @return string + */ + public static function convertFromProprietaryEncodings($value) { + + //Xajax error reportings + $value = preg_replace('//im', '$1', $value); + + //strip false alert triggering apostrophes + $value = preg_replace('/(\w)\"(s)/m', '$1$2', $value); + + //strip quotes within typical search patterns + $value = preg_replace('/^"([^"=\\!><~]+)"$/', '$1', $value); + + //OpenID login tokens + $value = preg_replace('/{[\w-]{8,9}\}(?:\{[\w=]{8}\}){2}/', null, $value); + + //convert Content and \sdo\s to null + $value = preg_replace('/Content|\Wdo\s/', null, $value); + + //strip emoticons + $value = preg_replace( + '/(?:\s[:;]-[)\/PD]+)|(?:\s;[)PD]+)|(?:\s:[)PD]+)|-\.-|\^\^/m', + null, + $value + ); + + //normalize separation char repetion + $value = preg_replace('/([.+~=*_\-])\1{2,}/m', '$1', $value); + + //normalize multiple single quotes + $value = preg_replace('/"{2,}/m', '"', $value); + + //normalize ampersand listings + $value = preg_replace('/(\w\s)&\s(\w)/', '$1$2', $value); + + //normalize JS backspace linebreaks + $value = preg_replace('/^\/|\/$|,\/\n|\/,/', null, $value); + + return $value; + } + + /** + * This method is the centrifuge prototype + * + * @param string $value the value to convert + * @param IDS_Monitor $monitor the monitor object + * + * @static + * @return string + */ + public static function runCentrifuge($value, IDS_Monitor $monitor = null) + { + $threshold = 3.49; + $unserialized = false; + if(preg_match('/^\w:\d+:\{/', $value)) { + $unserialized = @unserialize($value); + } + + if (strlen($value) > 25 && !$unserialized) { + + //strip padding + $tmp_value = preg_replace('/\s{4}/m', null, $value); + $tmp_value = preg_replace( + '/\s{4}|[\p{L}\d\+\-,.%]{8,}/m', + 'aaa', + $tmp_value + ); + + // Check for the attack char ratio + $tmp_value = preg_replace('/([*.!?+-])\1{1,}/m', '$1', $tmp_value); + $tmp_value = preg_replace('/"[\p{L}\d\s]+"/m', null, $tmp_value); + + $stripped_length = strlen(preg_replace('/[\d\s\p{L}.:,%&\/><\-)]+/m', + null, $tmp_value)); + $overall_length = strlen( + preg_replace('/([\d\s\p{L}:,]{3,})+/m', 'aaa', + preg_replace('/\s{2,}/m', null, $tmp_value)) + ); + + if ($stripped_length != 0 + && $overall_length/$stripped_length <= $threshold) { + + $monitor->centrifuge['ratio'] = + $overall_length/$stripped_length; + $monitor->centrifuge['threshold'] = + $threshold; + + $value .= "\n$[!!!]"; + } + } + + if (strlen($value) > 40) { + // Replace all non-special chars + $converted = preg_replace('/[\w\s\p{L},.!]/', null, $value); + + // Split string into an array, unify and sort + $array = str_split($converted); + $array = array_unique($array); + asort($array); + + // Normalize certain tokens + $schemes = array( + '~' => '+', + '^' => '+', + '|' => '+', + '*' => '+', + '%' => '+', + '&' => '+', + '/' => '+' + ); + + $converted = implode($array); + $converted = str_replace(array_keys($schemes), + array_values($schemes), $converted); + $converted = preg_replace('/[+-]\s*\d+/', '+', $converted); + $converted = preg_replace('/[()[\]{}]/', '(', $converted); + $converted = preg_replace('/[!?:=]/', ':', $converted); + $converted = preg_replace('/[^:(+]/', null, stripslashes($converted)); + + // Sort again and implode + $array = str_split($converted); + asort($array); + + $converted = implode($array); + + if (preg_match('/(?:\({2,}\+{2,}:{2,})|(?:\({2,}\+{2,}:+)|' . + '(?:\({3,}\++:{2,})/', $converted)) { + + $monitor->centrifuge['converted'] = $converted; + + return $value . "\n" . $converted; + } + } + + return $value; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Event.php b/dvwa/external/phpids/0.6/lib/IDS/Event.php new file mode 100644 index 0000000..701a24f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Event.php @@ -0,0 +1,235 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +/** + * PHPIDS event object + * + * This class represents a certain event that occured while applying the filters + * to the supplied data. It aggregates a bunch of IDS_Filter implementations and + * is a assembled in IDS_Report. + * + * Note that this class implements both Countable and IteratorAggregate + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Event.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + */ +class IDS_Event implements Countable, IteratorAggregate +{ + + /** + * Event name + * + * @var scalar + */ + protected $name = null; + + /** + * Value of the event + * + * @var scalar + */ + protected $value = null; + + /** + * List of filter objects + * + * Filter objects in this array are those that matched the events value + * + * @var array + */ + protected $filters = array(); + + /** + * Calculated impact + * + * Total impact of the event + * + * @var integer + */ + protected $impact = 0; + + /** + * Affecte tags + * + * @var array + */ + protected $tags = array(); + + /** + * Constructor + * + * Fills event properties + * + * @param scalar $name the event name + * @param scalar $value the event value + * @param array $filters the corresponding filters + * + * @return void + */ + public function __construct($name, $value, Array $filters) + { + if (!is_scalar($name)) { + throw new InvalidArgumentException( + 'Expected $name to be a scalar,' . gettype($name) . ' given' + ); + } + + if (!is_scalar($value)) { + throw new InvalidArgumentException(' + Expected $value to be a scalar,' . gettype($value) . ' given' + ); + } + + $this->name = $name; + $this->value = $value; + + foreach ($filters as $filter) { + if (!$filter instanceof IDS_Filter) { + throw new InvalidArgumentException( + 'Filter must be derived from IDS_Filter' + ); + } + + $this->filters[] = $filter; + } + } + + /** + * Returns event name + * + * The name of the event usually is the key of the variable that was + * considered to be malicious + * + * @return scalar + */ + public function getName() + { + return $this->name; + } + + /** + * Returns event value + * + * @return scalar + */ + public function getValue() + { + return $this->value; + } + + /** + * Returns calculated impact + * + * @return integer + */ + public function getImpact() + { + if (!$this->impact) { + $this->impact = 0; + foreach ($this->filters as $filter) { + $this->impact += $filter->getImpact(); + } + } + + return $this->impact; + } + + /** + * Returns affected tags + * + * @return array + */ + public function getTags() + { + $filters = $this->getFilters(); + + foreach ($filters as $filter) { + $this->tags = array_merge($this->tags, + $filter->getTags()); + } + + $this->tags = array_values(array_unique($this->tags)); + + return $this->tags; + } + + /** + * Returns list of filter objects + * + * @return array + */ + public function getFilters() + { + return $this->filters; + } + + /** + * Returns number of filters + * + * To implement interface Countable this returns the number of filters + * appended. + * + * @return integer + */ + public function count() + { + return count($this->getFilters()); + } + + /** + * IteratorAggregate iterator getter + * + * Returns an iterator to iterate over the appended filters. + * + * @return Iterator|IteratorAggregate + */ + public function getIterator() + { + return new ArrayObject($this->getFilters()); + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Filter.php b/dvwa/external/phpids/0.6/lib/IDS/Filter.php new file mode 100644 index 0000000..f7e96e0 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Filter.php @@ -0,0 +1,186 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +/** + * PHPIDS Filter object + * + * Each object of this class serves as a container for a specific filter. The + * object provides methods to get information about this particular filter and + * also to match an arbitrary string against it. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Filter.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + * @since Version 0.4 + */ +class IDS_Filter +{ + + /** + * Filter rule + * + * @var string + */ + protected $rule; + + /** + * List of tags of the filter + * + * @var array + */ + protected $tags = array(); + + /** + * Filter impact level + * + * @var integer + */ + protected $impact = 0; + + /** + * Filter description + * + * @var string + */ + protected $description = null; + + /** + * Constructor + * + * @param mixed $rule filter rule + * @param string $description filter description + * @param array $tags list of tags + * @param integer $impact filter impact level + * + * @return void + */ + public function __construct($id, $rule, $description, array $tags, $impact) + { + $this->id = $id; + $this->rule = $rule; + $this->tags = $tags; + $this->impact = $impact; + $this->description = $description; + } + + /** + * Matches a string against current filter + * + * Matches given string against the filter rule the specific object of this + * class represents + * + * @param string $string the string to match + * + * @throws InvalidArgumentException if argument is no string + * @return boolean + */ + public function match($string) + { + if (!is_string($string)) { + throw new InvalidArgumentException(' + Invalid argument. Expected a string, received ' . gettype($string) + ); + } + + return (bool) preg_match( + '/' . $this->getRule() . '/ms', strtolower($string) + ); + } + + /** + * Returns filter description + * + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Return list of affected tags + * + * Each filter rule is concerned with a certain kind of attack vectors. + * This method returns those affected kinds. + * + * @return array + */ + public function getTags() + { + return $this->tags; + } + + /** + * Returns filter rule + * + * @return string + */ + public function getRule() + { + return $this->rule; + } + + /** + * Get filter impact level + * + * @return integer + */ + public function getImpact() + { + return $this->impact; + } + + /** + * Get filter ID + * + * @return integer + */ + public function getId() + { + return $this->id; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Filter/Storage.php b/dvwa/external/phpids/0.6/lib/IDS/Filter/Storage.php new file mode 100644 index 0000000..d1bff41 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Filter/Storage.php @@ -0,0 +1,381 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +/** + * Filter Storage + * + * This class provides various default functions for gathering filter patterns + * to be used later on by the detection mechanism. You might extend this class + * to your requirements. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Storage.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + */ +class IDS_Filter_Storage +{ + + /** + * Filter source file + * + * @var string + */ + protected $source = null; + + /** + * Holds caching settings + * + * @var array + */ + protected $cacheSettings = null; + + /** + * Cache container + * + * @var object IDS_Caching wrapper + */ + protected $cache = null; + + /** + * Filter container + * + * @var array + */ + protected $filterSet = array(); + + /** + * Constructor + * + * Loads filters based on provided IDS_Init settings. + * + * @param object $init IDS_Init instance + * + * @throws Exception if unsupported filter type is given + * @return void + */ + public final function __construct(IDS_Init $init) + { + if ($init->config) { + + $caching = isset($init->config['Caching']['caching']) ? + $init->config['Caching']['caching'] : 'none'; + + $type = $init->config['General']['filter_type']; + $this->source = $init->getBasePath() + . $init->config['General']['filter_path']; + + if ($caching && $caching != 'none') { + $this->cacheSettings = $init->config['Caching']; + include_once 'IDS/Caching/Factory.php'; + $this->cache = IDS_Caching::factory($init, 'storage'); + } + + switch ($type) { + case 'xml' : + $this->getFilterFromXML(); + break; + case 'json' : + $this->getFilterFromJson(); + break; + default : + throw new Exception('Unsupported filter type.'); + } + } + } + + /** + * Sets the filter array + * + * @param array $filterSet array containing multiple IDS_Filter instances + * + * @return object $this + */ + public final function setFilterSet($filterSet) + { + foreach ($filterSet as $filter) { + $this->addFilter($filter); + } + + return $this; + } + + /** + * Returns registered filters + * + * @return array + */ + public final function getFilterSet() + { + return $this->filterSet; + } + + /** + * Adds a filter + * + * @param object $filter IDS_Filter instance + * + * @return object $this + */ + public final function addFilter(IDS_Filter $filter) + { + $this->filterSet[] = $filter; + return $this; + } + + /** + * Checks if any filters are cached + * + * @return mixed $filters cached filters or false + */ + private function _isCached() + { + $filters = false; + + if ($this->cacheSettings) { + + if ($this->cache) { + $filters = $this->cache->getCache(); + } + } + + return $filters; + } + + /** + * Loads filters from XML using SimpleXML + * + * This function parses the provided source file and stores the result. + * If caching mode is enabled the result will be cached to increase + * the performance. + * + * @throws Exception if problems with fetching the XML data occur + * @return object $this + */ + public function getFilterFromXML() + { + + if (extension_loaded('SimpleXML')) { + + /* + * See if filters are already available in the cache + */ + $filters = $this->_isCached(); + + /* + * If they aren't, parse the source file + */ + if (!$filters) { + if (file_exists($this->source)) { + if (LIBXML_VERSION >= 20621) { + $filters = simplexml_load_file($this->source, + null, + LIBXML_COMPACT); + } else { + $filters = simplexml_load_file($this->source); + } + } + } + + /* + * In case we still don't have any filters loaded and exception + * will be thrown + */ + if (empty($filters)) { + throw new Exception( + 'XML data could not be loaded.' . + ' Make sure you specified the correct path.' + ); + } + + /* + * Now the storage will be filled with IDS_Filter objects + */ + $data = array(); + $nocache = $filters instanceof SimpleXMLElement; + $filters = $nocache ? $filters->filter : $filters; + + include_once 'IDS/Filter.php'; + + foreach ($filters as $filter) { + + $id = $nocache ? (string) $filter->id : + $filter['id']; + $rule = $nocache ? (string) $filter->rule : + $filter['rule']; + $impact = $nocache ? (string) $filter->impact : + $filter['impact']; + $tags = $nocache ? array_values((array) $filter->tags) : + $filter['tags']; + $description = $nocache ? (string) $filter->description : + $filter['description']; + + $this->addFilter(new IDS_Filter($id, + $rule, + $description, + (array) $tags[0], + (int) $impact)); + + $data[] = array( + 'id' => $id, + 'rule' => $rule, + 'impact' => $impact, + 'tags' => $tags, + 'description' => $description + ); + } + + /* + * If caching is enabled, the fetched data will be cached + */ + if ($this->cacheSettings) { + + $this->cache->setCache($data); + } + + } else { + throw new Exception( + 'SimpleXML not loaded.' + ); + } + + return $this; + } + + /** + * Loads filters from Json file using ext/Json + * + * This function parses the provided source file and stores the result. + * If caching mode is enabled the result will be cached to increase + * the performance. + * + * @throws Exception if problems with fetching the JSON data occur + * @return object $this + */ + public function getFilterFromJson() + { + + if (extension_loaded('Json')) { + + /* + * See if filters are already available in the cache + */ + $filters = $this->_isCached(); + + /* + * If they aren't, parse the source file + */ + if (!$filters) { + if (file_exists($this->source)) { + $filters = json_decode(file_get_contents($this->source)); + } else { + throw new Exception( + 'JSON data could not be loaded.' . + ' Make sure you specified the correct path.' + ); + } + } + + if (!$filters) { + throw new Exception( + 'JSON data could not be loaded.' . + ' Make sure you specified the correct path.' + ); + } + + /* + * Now the storage will be filled with IDS_Filter objects + */ + $data = array(); + $nocache = !is_array($filters); + $filters = $nocache ? $filters->filters->filter : $filters; + + include_once 'IDS/Filter.php'; + + foreach ($filters as $filter) { + + $id = $nocache ? (string) $filter->id : + $filter['id']; + $rule = $nocache ? (string) $filter->rule : + $filter['rule']; + $impact = $nocache ? (string) $filter->impact : + $filter['impact']; + $tags = $nocache ? array_values((array) $filter->tags) : + $filter['tags']; + $description = $nocache ? (string) $filter->description : + $filter['description']; + + $this->addFilter(new IDS_Filter($id, + $rule, + $description, + (array) $tags[0], + (int) $impact)); + + $data[] = array( + 'id' => $id, + 'rule' => $rule, + 'impact' => $impact, + 'tags' => $tags, + 'description' => $description + ); + } + + /* + * If caching is enabled, the fetched data will be cached + */ + if ($this->cacheSettings) { + $this->cache->setCache($data); + } + + } else { + throw new Exception( + 'ext/json not loaded.' + ); + } + + return $this; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Init.php b/dvwa/external/phpids/0.6/lib/IDS/Init.php new file mode 100644 index 0000000..17895c6 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Init.php @@ -0,0 +1,232 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +/** + * Framework initiation + * + * This class is used for the purpose to initiate the framework and inhabits + * functionality to parse the needed configuration file. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Groupup + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Init.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + * @since Version 0.4 + */ +class IDS_Init +{ + + /** + * Holds config settings + * + * @var array + */ + public $config = array(); + + /** + * Instance of this class depending on the supplied config file + * + * @var array + * @static + */ + private static $instances = array(); + + /** + * Path to the config file + * + * @var string + */ + private $configPath = null; + + /** + * Constructor + * + * Includes needed classes and parses the configuration file + * + * @param string $configPath the path to the config file + * + * @return object $this + */ + private function __construct($configPath = null) + { + include_once 'IDS/Monitor.php'; + include_once 'IDS/Filter/Storage.php'; + + if ($configPath) { + $this->setConfigPath($configPath); + $this->config = parse_ini_file($this->configPath, true); + } + } + + /** + * Permitting to clone this object + * + * For the sake of correctness of a singleton pattern, this is necessary + * + * @return void + */ + public final function __clone() + { + } + + /** + * Returns an instance of this class. Also a PHP version check + * is being performed to avoid compatibility problems with PHP < 5.1.6 + * + * @param string $configPath the path to the config file + * + * @return object + */ + public static function init($configPath = null) + { + if (!isset(self::$instances[$configPath])) { + self::$instances[$configPath] = new IDS_Init($configPath); + } + + return self::$instances[$configPath]; + } + + /** + * Sets the path to the configuration file + * + * @param string $path the path to the config + * + * @throws Exception if file not found + * @return void + */ + public function setConfigPath($path) + { + if (file_exists($path)) { + $this->configPath = $path; + } else { + throw new Exception( + 'Configuration file could not be found at ' . + htmlspecialchars($path, ENT_QUOTES, 'UTF-8') + ); + } + } + + /** + * Returns path to configuration file + * + * @return string the config path + */ + public function getConfigPath() + { + return $this->configPath; + } + + /** + * This method checks if a base path is given and usage is set to true. + * If all that tests succeed the base path will be returned as a string - + * else null will be returned. + * + * @return string the base path or null + */ + public function getBasePath() { + + return ((isset($this->config['General']['base_path']) + && $this->config['General']['base_path'] + && isset($this->config['General']['use_base_path']) + && $this->config['General']['use_base_path']) + ? $this->config['General']['base_path'] : null); + } + + /** + * Merges new settings into the exsiting ones or overwrites them + * + * @param array $config the config array + * @param boolean $overwrite config overwrite flag + * + * @return void + */ + public function setConfig(array $config, $overwrite = false) + { + if ($overwrite) { + $this->config = $this->_mergeConfig($this->config, $config); + } else { + $this->config = $this->_mergeConfig($config, $this->config); + } + } + + /** + * Merge config hashes recursivly + * + * The algorithm merges configuration arrays recursively. If an element is + * an array in both, the values will be appended. If it is a scalar in both, + * the value will be replaced. + * + * @param array $current The legacy hash + * @param array $successor The hash which values count more when in doubt + * @return array Merged hash + */ + protected function _mergeConfig($current, $successor) + { + if (is_array($current) and is_array($successor)) { + foreach ($successor as $key => $value) { + if (isset($current[$key]) + and is_array($value) + and is_array($current[$key])) { + + $current[$key] = $this->_mergeConfig($current[$key], $value); + } else { + $current[$key] = $successor[$key]; + } + } + } + return $current; + } + + /** + * Returns the config array + * + * @return array the config array + */ + public function getConfig() + { + return $this->config; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Log/Composite.php b/dvwa/external/phpids/0.6/lib/IDS/Log/Composite.php new file mode 100644 index 0000000..6f9335a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Log/Composite.php @@ -0,0 +1,136 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +require_once 'IDS/Log/Interface.php'; + +/** + * Log Composite + * + * This class implements the composite pattern to allow to work with multiple + * logging wrappers at once. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Composite.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + */ +class IDS_Log_Composite +{ + + /** + * Holds registered logging wrapper + * + * @var array + */ + public $loggers = array(); + + /** + * Iterates through registered loggers and executes them + * + * @param object $data IDS_Report object + * + * @return void + */ + public function execute(IDS_Report $data) + { + // make sure request uri is set right on IIS + if (!isset($_SERVER['REQUEST_URI'])) { + $_SERVER['REQUEST_URI'] = substr($_SERVER['PHP_SELF'], 1); + if (isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING']) { + $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; + } + } + + // make sure server address is set right on IIS + if (isset($_SERVER['LOCAL_ADDR'])) { + $_SERVER['SERVER_ADDR'] = $_SERVER['LOCAL_ADDR']; + } + + foreach ($this->loggers as $logger) { + $logger->execute($data); + } + } + + /** + * Registers a new logging wrapper + * + * Only valid IDS_Log_Interface instances passed to this function will be + * registered + * + * @return void + */ + public function addLogger() + { + + $args = func_get_args(); + + foreach ($args as $class) { + if (!in_array($class, $this->loggers) && + ($class instanceof IDS_Log_Interface)) { + $this->loggers[] = $class; + } + } + } + + /** + * Removes a logger + * + * @param object $logger IDS_Log_Interface object + * + * @return boolean + */ + public function removeLogger(IDS_Log_Interface $logger) + { + $key = array_search($logger, $this->loggers); + + if (isset($this->loggers[$key])) { + unset($this->loggers[$key]); + return true; + } + + return false; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Log/Database.php b/dvwa/external/phpids/0.6/lib/IDS/Log/Database.php new file mode 100644 index 0000000..542d402 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Log/Database.php @@ -0,0 +1,285 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +require_once 'IDS/Log/Interface.php'; + +/* + * Needed SQL: + * + CREATE DATABASE IF NOT EXISTS `phpids` DEFAULT CHARACTER + SET utf8 COLLATE utf8_general_ci; + DROP TABLE IF EXISTS `intrusions`; + CREATE TABLE IF NOT EXISTS `intrusions` ( + `id` int(11) unsigned NOT null auto_increment, + `name` varchar(128) NOT null, + `value` text NOT null, + `page` varchar(255) NOT null, + `ip` varchar(15) NOT null, + `impact` int(11) unsigned NOT null, + `origin` varchar(15) NOT null, + `created` datetime NOT null, + PRIMARY KEY (`id`) + ) ENGINE=MyISAM ; + * + * + * + */ + +/** + * Database logging wrapper + * + * The database wrapper is designed to store reports into an sql database. It + * implements the singleton pattern and is based in PDO, supporting + * different database types. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Database.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + */ +class IDS_Log_Database implements IDS_Log_Interface +{ + + /** + * Database wrapper + * + * @var string + */ + private $wrapper = null; + + /** + * Database user + * + * @var string + */ + private $user = null; + + /** + * Database password + * + * @var string + */ + private $password = null; + + /** + * Database table + * + * @var string + */ + private $table = null; + + /** + * Database handle + * + * @var object PDO instance + */ + private $handle = null; + + /** + * Prepared SQL statement + * + * @var string + */ + private $statement = null; + + /** + * Holds current remote address + * + * @var string + */ + private $ip = 'local/unknown'; + + /** + * Instance container + * + * Due to the singleton pattern this class allows to initiate only one instance + * for each database wrapper. + * + * @var array + */ + private static $instances = array(); + + /** + * Constructor + * + * Prepares the SQL statement + * + * @param mixed $config IDS_Init instance | array + * + * @return void + */ + protected function __construct($config) + { + + if ($config instanceof IDS_Init) { + $this->wrapper = $config->config['Logging']['wrapper']; + $this->user = $config->config['Logging']['user']; + $this->password = $config->config['Logging']['password']; + $this->table = $config->config['Logging']['table']; + + } elseif (is_array($config)) { + $this->wrapper = $config['wrapper']; + $this->user = $config['user']; + $this->password = $config['password']; + $this->table = $config['table']; + } + + // determine correct IP address + if ($_SERVER['REMOTE_ADDR'] != '127.0.0.1') { + $this->ip = $_SERVER['REMOTE_ADDR']; + } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { + $this->ip = $_SERVER['HTTP_X_FORWARDED_FOR']; + } + + try { + $this->handle = new PDO( + $this->wrapper, + $this->user, + $this->password + ); + + $this->statement = $this->handle->prepare(' + INSERT INTO ' . $this->table . ' ( + name, + value, + page, + ip, + impact, + origin, + created + ) + VALUES ( + :name, + :value, + :page, + :ip, + :impact, + :origin, + now() + ) + '); + + } catch (PDOException $e) { + die('PDOException: ' . $e->getMessage()); + } + } + + /** + * Returns an instance of this class + * + * This method allows the passed argument to be either an instance of IDS_Init or + * an array. + * + * @param mixed $config IDS_Init | array + * + * @return object $this + */ + public static function getInstance($config) + { + if ($config instanceof IDS_Init) { + $wrapper = $config->config['Logging']['wrapper']; + } elseif (is_array($config)) { + $wrapper = $config['wrapper']; + } + + if (!isset(self::$instances[$wrapper])) { + self::$instances[$wrapper] = new IDS_Log_Database($config); + } + + return self::$instances[$wrapper]; + } + + /** + * Permitting to clone this object + * + * For the sake of correctness of a singleton pattern, this is necessary + * + * @return void + */ + private function __clone() + { + } + + /** + * Stores given data into the database + * + * @param object $data IDS_Report instance + * + * @throws Exception if db error occurred + * @return boolean + */ + public function execute(IDS_Report $data) + { + if (!isset($_SERVER['REQUEST_URI'])) { + $_SERVER['REQUEST_URI'] = substr($_SERVER['PHP_SELF'], 1); + if (isset($_SERVER['QUERY_STRING']) && $_SERVER['QUERY_STRING']) { + $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; + } + } + + foreach ($data as $event) { + $page = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; + $ip = $this->ip; + + $this->statement->bindParam('name', $event->getName()); + $this->statement->bindParam('value', $event->getValue()); + $this->statement->bindParam('page', $page); + $this->statement->bindParam('ip', $ip); + $this->statement->bindParam('impact', $data->getImpact()); + $this->statement->bindParam('origin', $_SERVER['SERVER_ADDR']); + + if (!$this->statement->execute()) { + + $info = $this->statement->errorInfo(); + throw new Exception( + $this->statement->errorCode() . ', ' . $info[1] . ', ' . $info[2] + ); + } + } + + return true; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Log/Email.php b/dvwa/external/phpids/0.6/lib/IDS/Log/Email.php new file mode 100644 index 0000000..357e132 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Log/Email.php @@ -0,0 +1,401 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +require_once 'IDS/Log/Interface.php'; + +/** + * Email logging wrapper + * + * The Email wrapper is designed to send reports via email. It implements the + * singleton pattern. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Email.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + */ +class IDS_Log_Email implements IDS_Log_Interface +{ + + /** + * Recipient container + * + * @var array + */ + private $recipients = array(); + + /** + * Mail subject + * + * @var string + */ + private $subject = null; + + /** + * Additional mail headers + * + * @var string + */ + private $headers = null; + + /** + * Safemode switch + * + * Using this switch it is possible to enable safemode, which is a spam + * protection based on the alert frequency. + * + * @var boolean + */ + private $safemode = true; + + /** + * Urlencode for result strings + * + * This switch is true by default. Setting it to false removes + * the 'better safe than sorry' urlencoding for the result string in + * the report mails. Enhances readability but maybe XSSes email clients. + * + * @var boolean + */ + private $urlencode = true; + + /** + * Send rate + * + * If safemode is enabled, this property defines how often reports will be + * sent out. Default value is 15, which means that a mail will be sent on + * condition that the last email has not been sent earlier than 15 seconds ago. + * + * @var integer + */ + private $allowed_rate = 15; + + /** + * PHPIDS temp directory + * + * When safemod is enabled, a path to a temp directory is needed to + * store some information. Default is IDS/tmp/ + * + * @var string + */ + private $tmp_path = 'IDS/tmp/'; + + /** + * File prefix for tmp files + * + * @var string + */ + private $file_prefix = 'PHPIDS_Log_Email_'; + + /** + * Holds current remote address + * + * @var string + */ + private $ip = 'local/unknown'; + + /** + * Instance container + * + * @var array + */ + private static $instance = array(); + + /** + * Constructor + * + * @param mixed $config IDS_Init instance | array + * + * @return void + */ + protected function __construct($config) + { + + if ($config instanceof IDS_Init) { + $this->recipients = $config->config['Logging']['recipients']; + $this->subject = $config->config['Logging']['subject']; + $this->headers = $config->config['Logging']['header']; + $this->envelope = $config->config['Logging']['envelope']; + $this->safemode = $config->config['Logging']['safemode']; + $this->urlencode = $config->config['Logging']['urlencode']; + $this->allowed_rate = $config->config['Logging']['allowed_rate']; + $this->tmp_path = $config->getBasePath() + . $config->config['General']['tmp_path']; + + } elseif (is_array($config)) { + $this->recipients[] = $config['recipients']; + $this->subject = $config['subject']; + $this->additionalHeaders = $config['header']; + } + + // determine correct IP address and concat them if necessary + $this->ip = $_SERVER['REMOTE_ADDR'] . + (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? + ' (' . $_SERVER['HTTP_X_FORWARDED_FOR'] . ')' : ''); + } + + /** + * Returns an instance of this class + * + * This method allows the passed argument to be either an instance of + * IDS_Init or an array. + * + * @param mixed $config IDS_Init | array + * + * @return object $this + */ + public static function getInstance($config) + { + if (!self::$instance) { + self::$instance = new IDS_Log_Email($config); + } + + return self::$instance; + } + + /** + * Permitting to clone this object + * + * For the sake of correctness of a singleton pattern, this is necessary + * + * @return void + */ + private function __clone() + { + } + + /** + * Detects spam attempts + * + * To avoid mail spam through this logging class this function is used + * to detect such attempts based on the alert frequency. + * + * @return boolean + */ + protected function isSpamAttempt() + { + + /* + * loop through all files in the tmp directory and + * delete garbage files + */ + $dir = $this->tmp_path; + $numPrefixChars = strlen($this->file_prefix); + $files = scandir($dir); + foreach ($files as $file) { + if (is_file($dir . $file)) { + if (substr($file, 0, $numPrefixChars) == $this->file_prefix) { + $lastModified = filemtime($dir . $file); + + if (( + time() - $lastModified) > 3600) { + unlink($dir . $file); + } + } + } + } + + /* + * end deleting garbage files + */ + $remoteAddr = $this->ip; + $userAgent = $_SERVER['HTTP_USER_AGENT']; + $filename = $this->file_prefix . md5($remoteAddr.$userAgent) . '.tmp'; + $file = $dir . DIRECTORY_SEPARATOR . $filename; + + if (!file_exists($file)) { + $handle = fopen($file, 'w'); + fwrite($handle, time()); + fclose($handle); + + return false; + } + + $lastAttack = file_get_contents($file); + $difference = time() - $lastAttack; + if ($difference > $this->allowed_rate) { + unlink($file); + } else { + return true; + } + + return false; + } + + /** + * Prepares data + * + * Converts given data into a format that can be read in an email. + * You might edit this method to your requirements. + * + * @param mixed $data the report data + * + * @return string + */ + protected function prepareData($data) + { + + $format = "The following attack has been detected by PHPIDS\n\n"; + $format .= "IP: %s \n"; + $format .= "Date: %s \n"; + $format .= "Impact: %d \n"; + $format .= "Affected tags: %s \n"; + + $attackedParameters = ''; + foreach ($data as $event) { + $attackedParameters .= $event->getName() . '=' . + ((!isset($this->urlencode) ||$this->urlencode) + ? urlencode($event->getValue()) + : $event->getValue()) . ", "; + } + + $format .= "Affected parameters: %s \n"; + $format .= "Request URI: %s \n"; + $format .= "Origin: %s \n"; + + return sprintf($format, + $this->ip, + date('c'), + $data->getImpact(), + join(' ', $data->getTags()), + trim($attackedParameters), + urlencode($_SERVER['REQUEST_URI']), + $_SERVER['SERVER_ADDR']); + } + + /** + * Sends the report to registered recipients + * + * @param object $data IDS_Report instance + * + * @throws Exception if data is no string + * @return boolean + */ + public function execute(IDS_Report $data) + { + + if ($this->safemode) { + if ($this->isSpamAttempt()) { + return false; + } + } + + /* + * In case the data has been modified before it might + * be necessary to convert it to string since it's pretty + * senseless to send array or object via e-mail + */ + $data = $this->prepareData($data); + + if (is_string($data)) { + $data = trim($data); + + // if headers are passed as array, we need to make a string of it + if (is_array($this->headers)) { + $headers = ""; + foreach ($this->headers as $header) { + $headers .= $header . "\r\n"; + } + } else { + $headers = $this->headers; + } + + if (!empty($this->recipients)) { + if (is_array($this->recipients)) { + foreach ($this->recipients as $address) { + $this->send( + $address, + $data, + $headers, + $this->envelope + ); + } + } else { + $this->send( + $this->recipients, + $data, + $headers, + $this->envelope + ); + } + } + + } else { + throw new Exception( + 'Please make sure that data returned by + IDS_Log_Email::prepareData() is a string.' + ); + } + + return true; + } + + /** + * Sends an email + * + * @param string $address email address + * @param string $data the report data + * @param string $headers the mail headers + * @param string $envelope the optional envelope string + * + * @return boolean + */ + protected function send($address, $data, $headers, $envelope = null) + { + if (!$envelope || strpos(ini_get('sendmail_path'),' -f') !== false) { + return mail($address, + $this->subject, + $data, + $headers); + } else { + return mail($address, + $this->subject, + $data, + $headers, + '-f' . $envelope); + } + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Log/File.php b/dvwa/external/phpids/0.6/lib/IDS/Log/File.php new file mode 100644 index 0000000..4ab13d4 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Log/File.php @@ -0,0 +1,229 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +require_once 'IDS/Log/Interface.php'; + +/** + * File logging wrapper + * + * The file wrapper is designed to store data into a flatfile. It implements the + * singleton pattern. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:File.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + */ +class IDS_Log_File implements IDS_Log_Interface +{ + + /** + * Path to the log file + * + * @var string + */ + private $logfile = null; + + /** + * Instance container + * + * Due to the singleton pattern this class allows to initiate only one + * instance for each file. + * + * @var array + */ + private static $instances = array(); + + /** + * Holds current remote address + * + * @var string + */ + private $ip = 'local/unknown'; + + /** + * Constructor + * + * @param string $logfile path to the log file + * + * @return void + */ + protected function __construct($logfile) + { + + // determine correct IP address + if ($_SERVER['REMOTE_ADDR'] != '127.0.0.1') { + $this->ip = $_SERVER['REMOTE_ADDR']; + } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { + $this->ip = $_SERVER['HTTP_X_FORWARDED_FOR']; + } + + $this->logfile = $logfile; + } + + /** + * Returns an instance of this class + * + * This method allows the passed argument to be either an instance of + * IDS_Init or a path to a log file. Due to the singleton pattern only one + * instance for each file can be initiated. + * + * @param mixed $config IDS_Init or path to a file + * + * @return object $this + */ + public static function getInstance($config) + { + if ($config instanceof IDS_Init) { + $logfile = $config->getBasePath() . $config->config['Logging']['path']; + } elseif (is_string($config)) { + $logfile = $config; + } + + if (!isset(self::$instances[$logfile])) { + self::$instances[$logfile] = new IDS_Log_File($logfile); + } + + return self::$instances[$logfile]; + } + + /** + * Permitting to clone this object + * + * For the sake of correctness of a singleton pattern, this is necessary + * + * @return void + */ + private function __clone() + { + } + + /** + * Prepares data + * + * Converts given data into a format that can be stored into a file. + * You might edit this method to your requirements. + * + * @param mixed $data incoming report data + * + * @return string + */ + protected function prepareData($data) + { + + $format = '"%s",%s,%d,"%s","%s","%s","%s"'; + + $attackedParameters = ''; + foreach ($data as $event) { + $attackedParameters .= $event->getName() . '=' . + rawurlencode($event->getValue()) . ' '; + } + + $dataString = sprintf($format, + $this->ip, + date('c'), + $data->getImpact(), + join(' ', $data->getTags()), + trim($attackedParameters), + urlencode($_SERVER['REQUEST_URI']), + $_SERVER['SERVER_ADDR']); + + return $dataString; + } + + /** + * Stores given data into a file + * + * @param object $data IDS_Report + * + * @throws Exception if the logfile isn't writeable + * @return mixed + */ + public function execute(IDS_Report $data) + { + + /* + * In case the data has been modified before it might be necessary + * to convert it to string since we can't store array or object + * into a file + */ + $data = $this->prepareData($data); + + if (is_string($data)) { + + if (file_exists($this->logfile)) { + $data = trim($data); + + if (!empty($data)) { + if (is_writable($this->logfile)) { + + $handle = fopen($this->logfile, 'a'); + fwrite($handle, trim($data) . "\n"); + fclose($handle); + + } else { + throw new Exception( + 'Please make sure that ' . $this->logfile . + ' is writeable.' + ); + } + } + } else { + throw new Exception( + 'Given file does not exist. Please make sure the + logfile is present in the given directory.' + ); + } + } else { + throw new Exception( + 'Please make sure that data returned by + IDS_Log_File::prepareData() is a string.' + ); + } + + return true; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Log/Interface.php b/dvwa/external/phpids/0.6/lib/IDS/Log/Interface.php new file mode 100644 index 0000000..63c4672 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Log/Interface.php @@ -0,0 +1,65 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +/** + * Interface for logging wrappers + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @version Release: $Id:Interface.php 517 2007-09-15 15:04:13Z mario $ + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ +interface IDS_Log_Interface +{ + /** + * Interface method + * + * @param IDS_Report $data the report data + * + * @return void + */ + public function execute(IDS_Report $data); +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Monitor.php b/dvwa/external/phpids/0.6/lib/IDS/Monitor.php new file mode 100644 index 0000000..e28e524 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Monitor.php @@ -0,0 +1,681 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +/** + * Monitoring engine + * + * This class represents the core of the frameworks attack detection mechanism + * and provides functions to scan incoming data for malicious appearing script + * fragments. + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Monitor.php 949 2008-06-28 01:26:03Z christ1an $ + * @link http://php-ids.org/ + */ +class IDS_Monitor +{ + + /** + * Tags to define what to search for + * + * Accepted values are xss, csrf, sqli, dt, id, lfi, rfe, spam, dos + * + * @var array + */ + private $tags = null; + + /** + * Request array + * + * Array containing raw data to search in + * + * @var array + */ + private $request = null; + + /** + * Container for filter rules + * + * Holds an instance of IDS_Filter_Storage + * + * @var object + */ + private $storage = null; + + /** + * Results + * + * Holds an instance of IDS_Report which itself provides an API to + * access the detected results + * + * @var object + */ + private $report = null; + + /** + * Scan keys switch + * + * Enabling this property will cause the monitor to scan both the key and + * the value of variables + * + * @var boolean + */ + public $scanKeys = false; + + /** + * Exception container + * + * Using this array it is possible to define variables that must not be + * scanned. Per default, utmz google analytics parameters are permitted. + * + * @var array + */ + private $exceptions = array(); + + /** + * Html container + * + * Using this array it is possible to define variables that legally + * contain html and have to be prepared before hitting the rules to + * avoid too many false alerts + * + * @var array + */ + private $html = array(); + + /** + * JSON container + * + * Using this array it is possible to define variables that contain + * JSON data - and should be treated as such + * + * @var array + */ + private $json = array(); + + /** + * Holds HTMLPurifier object + * + * @var object + */ + private $htmlpurifier = NULL; + + /** + * Path to HTMLPurifier source + * + * This path might be changed in case one wishes to make use of a + * different HTMLPurifier source file e.g. if already used in the + * application PHPIDS is protecting + * + * @var string + */ + private $pathToHTMLPurifier = ''; + + /** + * HTMLPurifier cache directory + * + * @var string + */ + private $HTMLPurifierCache = ''; + + /** + * This property holds the tmp JSON string from the + * _jsonDecodeValues() callback + * + * @var string + */ + private $tmpJsonString = ''; + + + /** + * Constructor + * + * @param array $request array to scan + * @param object $init instance of IDS_Init + * @param array $tags list of tags to which filters should be applied + * + * @return void + */ + public function __construct(array $request, IDS_Init $init, array $tags = null) + { + $version = isset($init->config['General']['min_php_version']) + ? $init->config['General']['min_php_version'] : '5.1.6'; + + if (version_compare(PHP_VERSION, $version, '<')) { + throw new Exception( + 'PHP version has to be equal or higher than ' . $version . ' or + PHP version couldn\'t be determined' + ); + } + + + if (!empty($request)) { + $this->storage = new IDS_Filter_Storage($init); + $this->request = $request; + $this->tags = $tags; + + $this->scanKeys = $init->config['General']['scan_keys']; + + $this->exceptions = isset($init->config['General']['exceptions']) + ? $init->config['General']['exceptions'] : false; + + $this->html = isset($init->config['General']['html']) + ? $init->config['General']['html'] : false; + + $this->json = isset($init->config['General']['json']) + ? $init->config['General']['json'] : false; + + if(isset($init->config['General']['HTML_Purifier_Path']) + && isset($init->config['General']['HTML_Purifier_Cache'])) { + $this->pathToHTMLPurifier = + $init->config['General']['HTML_Purifier_Path']; + $this->HTMLPurifierCache = + $init->config['General']['HTML_Purifier_Cache']; + } + + } + + if (!is_writeable($init->getBasePath() + . $init->config['General']['tmp_path'])) { + throw new Exception( + 'Please make sure the ' . + htmlspecialchars($init->getBasePath() . + $init->config['General']['tmp_path'], ENT_QUOTES, 'UTF-8') . + ' folder is writable' + ); + } + + include_once 'IDS/Report.php'; + $this->report = new IDS_Report; + } + + /** + * Starts the scan mechanism + * + * @return object IDS_Report + */ + public function run() + { + if (!empty($this->request)) { + foreach ($this->request as $key => $value) { + $this->_iterate($key, $value); + } + } + + return $this->getReport(); + } + + /** + * Iterates through given data and delegates it to IDS_Monitor::_detect() in + * order to check for malicious appearing fragments + * + * @param mixed $key the former array key + * @param mixed $value the former array value + * + * @return void + */ + private function _iterate($key, $value) + { + + if (!is_array($value)) { + if (is_string($value)) { + + if ($filter = $this->_detect($key, $value)) { + include_once 'IDS/Event.php'; + $this->report->addEvent( + new IDS_Event( + $key, + $value, + $filter + ) + ); + } + } + } else { + foreach ($value as $subKey => $subValue) { + $this->_iterate($key . '.' . $subKey, $subValue); + } + } + } + + /** + * Checks whether given value matches any of the supplied filter patterns + * + * @param mixed $key the key of the value to scan + * @param mixed $value the value to scan + * + * @return bool|array false or array of filter(s) that matched the value + */ + private function _detect($key, $value) + { + + // to increase performance, only start detection if value + // isn't alphanumeric + if (!$value || !preg_match('/[^\w\s\/@!?,\.]+|(?:\.\/)|(?:@@\w+)/', $value)) { + return false; + } + + // check if this field is part of the exceptions + if (is_array($this->exceptions) + && in_array($key, $this->exceptions, true)) { + return false; + } + + // check for magic quotes and remove them if necessary + if (function_exists('get_magic_quotes_gpc') + && get_magic_quotes_gpc()) { + $value = stripslashes($value); + } + + // if html monitoring is enabled for this field - then do it! + if (is_array($this->html) && in_array($key, $this->html, true)) { + list($key, $value) = $this->_purifyValues($key, $value); + } + + // check if json monitoring is enabled for this field + if (is_array($this->json) && in_array($key, $this->json, true)) { + list($key, $value) = $this->_jsonDecodeValues($key, $value); + } + + // use the converter + include_once 'IDS/Converter.php'; + $value = IDS_Converter::runAll($value); + $value = IDS_Converter::runCentrifuge($value, $this); + + // scan keys if activated via config + $key = $this->scanKeys ? IDS_Converter::runAll($key) + : $key; + $key = $this->scanKeys ? IDS_Converter::runCentrifuge($key, $this) + : $key; + + $filters = array(); + $filterSet = $this->storage->getFilterSet(); + foreach ($filterSet as $filter) { + + /* + * in case we have a tag array specified the IDS will only + * use those filters that are meant to detect any of the + * defined tags + */ + if (is_array($this->tags)) { + if (array_intersect($this->tags, $filter->getTags())) { + if ($this->_match($key, $value, $filter)) { + $filters[] = $filter; + } + } + } else { + if ($this->_match($key, $value, $filter)) { + $filters[] = $filter; + } + } + } + + return empty($filters) ? false : $filters; + } + + + /** + * Purifies given key and value variables using HTMLPurifier + * + * This function is needed whenever there is variables for which HTML + * might be allowed like e.g. WYSIWYG post bodies. It will dectect malicious + * code fragments and leaves harmless parts untouched. + * + * @param mixed $key + * @param mixed $value + * @since 0.5 + * + * @return array + */ + private function _purifyValues($key, $value) { + + include_once $this->pathToHTMLPurifier; + + if (!is_writeable($this->HTMLPurifierCache)) { + throw new Exception( + $this->HTMLPurifierCache . ' must be writeable'); + } + + if (class_exists('HTMLPurifier')) { + $config = HTMLPurifier_Config::createDefault(); + $config->set('Attr', 'EnableID', true); + $config->set('Cache', 'SerializerPath', $this->HTMLPurifierCache); + $config->set('Output', 'Newline', "\n"); + $this->htmlpurifier = new HTMLPurifier($config); + } else { + throw new Exception( + 'HTMLPurifier class could not be found - ' . + 'make sure the purifier files are valid and' . + ' the path is correct' + ); + } + + $purified_value = $this->htmlpurifier->purify($value); + $purified_key = $this->htmlpurifier->purify($key); + + $redux_value = strip_tags($value); + $redux_key = strip_tags($key); + + if ($value != $purified_value || $redux_value) { + $value = $this->_diff($value, $purified_value, $redux_value); + } else { + $value = NULL; + } + if ($key != $purified_key) { + $key = $this->_diff($key, $purified_key, $redux_key); + } else { + $key = NULL; + } + + return array($key, $value); + } + + /** + * This method calculates the difference between the original + * and the purified markup strings. + * + * @param string $original the original markup + * @param string $purified the purified markup + * @param string $redux the string without html + * @since 0.5 + * + * @return string the difference between the strings + */ + private function _diff($original, $purified, $redux) + { + /* + * deal with over-sensitive alt-attribute addition of the purifier + * and other common html formatting problems + */ + $purified = preg_replace('/\s+alt="[^"]*"/m', null, $purified); + $purified = preg_replace('/=?\s*"\s*"/m', null, $purified); + + $original = preg_replace('/=?\s*"\s*"/m', null, $original); + $original = preg_replace('/\s+alt=?/m', null, $original); + + // check which string is longer + $length = (strlen($original) - strlen($purified)); + /* + * Calculate the difference between the original html input + * and the purified string. + */ + if ($length > 0) { + $array_2 = str_split($original); + $array_1 = str_split($purified); + } else { + $array_1 = str_split($original); + $array_2 = str_split($purified); + } + foreach ($array_2 as $key => $value) { + if ($value !== $array_1[$key]) { + $array_1 = array_reverse($array_1); + $array_1[] = $value; + $array_1 = array_reverse($array_1); + } + } + + // return the diff - ready to hit the converter and the rules + $diff = trim(join('', array_reverse( + (array_slice($array_1, 0, $length))))); + + // clean up spaces between tag delimiters + $diff = preg_replace('/>\s*<', $diff); + + // correct over-sensitively stripped bad html elements + $diff = preg_replace('/[^<](iframe|script|embed|object' . + '|applet|base|img|style)/m', '<$1', $diff); + + if ($original == $purified && !$redux) { + return null; + } + + return $diff . $redux; + } + + /** + * This method prepares incoming JSON data for the PHPIDS detection + * process. It utilizes _jsonConcatContents() as callback and returns a + * string version of the JSON data structures. + * + * @param mixed $key + * @param mixed $value + * @since 0.5.3 + * + * @return array + */ + private function _jsonDecodeValues($key, $value) { + + $tmp_key = json_decode($key); + $tmp_value = json_decode($value); + + if($tmp_value && is_array($tmp_value) || is_object($tmp_value)) { + array_walk_recursive($tmp_value, array($this, '_jsonConcatContents')); + $value = $this->tmpJsonString; + } + + if($tmp_key && is_array($tmp_key) || is_object($tmp_key)) { + array_walk_recursive($tmp_key, array($this, '_jsonConcatContents')); + $key = $this->tmpJsonString; + } + + return array($key, $value); + } + + /** + * This is the callback used in _jsonDecodeValues(). The method + * concatenates key and value and stores them in $this->tmpJsonString. + * + * @param mixed $key + * @param mixed $value + * @since 0.5.3 + * + * @return void + */ + private function _jsonConcatContents($key, $value) { + + $this->tmpJsonString .= $key . " " . $value . "\n"; + } + + /** + * Matches given value and/or key against given filter + * + * @param mixed $key the key to optionally scan + * @param mixed $value the value to scan + * @param object $filter the filter object + * + * @return boolean + */ + private function _match($key, $value, $filter) + { + if ($this->scanKeys) { + if ($filter->match($key)) { + return true; + } + } + + if ($filter->match($value)) { + return true; + } + + return false; + } + + /** + * Sets exception array + * + * @param mixed $exceptions the thrown exceptions + * + * @return void + */ + public function setExceptions($exceptions) + { + if (!is_array($exceptions)) { + $exceptions = array($exceptions); + } + + $this->exceptions = $exceptions; + } + + /** + * Returns exception array + * + * @return array + */ + public function getExceptions() + { + return $this->exceptions; + } + + /** + * Sets html array + * + * @param mixed $html the fields containing html + * @since 0.5 + * + * @return void + */ + public function setHtml($html) + { + if (!is_array($html)) { + $html = array($html); + } + + $this->html = $html; + } + + /** + * Adds a value to the html array + * + * @since 0.5 + * + * @return void + */ + public function addHtml($value) + { + $this->html[] = $value; + } + + /** + * Returns html array + * + * @since 0.5 + * + * @return array the fields that contain allowed html + */ + public function getHtml() + { + return $this->html; + } + + /** + * Sets json array + * + * @param mixed $json the fields containing json + * @since 0.5.3 + * + * @return void + */ + public function setJson($json) + { + if (!is_array($json)) { + $json = array($json); + } + + $this->json = $json; + } + + /** + * Adds a value to the json array + * + * @since 0.5.3 + * + * @return void + */ + public function addJson($value) + { + $this->json[] = $value; + } + + /** + * Returns json array + * + * @since 0.5.3 + * + * @return array the fields that contain json + */ + public function getJson() + { + return $this->json; + } + + /** + * Returns storage container + * + * @return array + */ + public function getStorage() + { + return $this->storage; + } + + /** + * Returns report object providing various functions to work with + * detected results. Also the centrifuge data is being set as property + * of the report object. + * + * @return object IDS_Report + */ + public function getReport() + { + if (isset($this->centrifuge) && $this->centrifuge) { + $this->report->setCentrifuge($this->centrifuge); + } + + return $this->report; + } + +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/Report.php b/dvwa/external/phpids/0.6/lib/IDS/Report.php new file mode 100644 index 0000000..42e34b3 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/Report.php @@ -0,0 +1,341 @@ +. + * + * PHP version 5.1.6+ + * + * @category Security + * @package PHPIDS + * @author Mario Heiderich + * @author Christian Matthies + * @author Lars Strojny + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @link http://php-ids.org/ + */ + +/** + * PHPIDS report object + * + * The report objects collects a number of events and thereby presents the + * detected results. It provides a convenient API to work with the results. + * + * Note that this class implements Countable, IteratorAggregate and + * a __toString() method + * + * @category Security + * @package PHPIDS + * @author Christian Matthies + * @author Mario Heiderich + * @author Lars Strojny + * @copyright 2007 The PHPIDS Group + * @license http://www.gnu.org/licenses/lgpl.html LGPL + * @version Release: $Id:Report.php 517 2007-09-15 15:04:13Z mario $ + * @link http://php-ids.org/ + */ +class IDS_Report implements Countable, IteratorAggregate +{ + + /** + * Event container + * + * @var array + */ + protected $events = array(); + + /** + * List of affected tags + * + * This list of tags is collected from the collected event objects on + * demand when IDS_Report->getTags() is called + * + * @var array + */ + protected $tags = array(); + + /** + * Impact level + * + * The impact level is calculated on demand by adding the results of the + * event objects on IDS_Report->getImpact() + * + * @var integer + */ + protected $impact = 0; + + /** + * Centrifuge data + * + * This variable - initiated as an empty array - carries all information + * about the centrifuge data if available + * + * @var array + */ + protected $centrifuge = array(); + + /** + * Constructor + * + * @param array $events the events the report should include + * + * @return void + */ + public function __construct(array $events = null) + { + if ($events) { + foreach ($events as $event) { + $this->addEvent($event); + } + } + } + + /** + * Adds an IDS_Event object to the report + * + * @param object $event IDS_Event + * + * @return object $this + */ + public function addEvent(IDS_Event $event) + { + $this->clear(); + $this->events[$event->getName()] = $event; + + return $this; + } + + /** + * Get event by name + * + * In most cases an event is identified by the key of the variable that + * contained maliciously appearing content + * + * @param scalar $name the event name + * + * @throws InvalidArgumentException if argument is invalid + * @return mixed IDS_Event object or false if the event does not exist + */ + public function getEvent($name) + { + if (!is_scalar($name)) { + throw new InvalidArgumentException( + 'Invalid argument type given' + ); + } + + if ($this->hasEvent($name)) { + return $this->events[$name]; + } + + return false; + } + + /** + * Returns list of affected tags + * + * @return array + */ + public function getTags() + { + if (!$this->tags) { + $this->tags = array(); + + foreach ($this->events as $event) { + $this->tags = array_merge($this->tags, + $event->getTags()); + } + + $this->tags = array_values(array_unique($this->tags)); + } + + return $this->tags; + } + + /** + * Returns total impact + * + * Each stored IDS_Event object and its IDS_Filter sub-object are called + * to calculate the overall impact level of this request + * + * @return integer + */ + public function getImpact() + { + if (!$this->impact) { + $this->impact = 0; + foreach ($this->events as $event) { + $this->impact += $event->getImpact(); + } + } + + return $this->impact; + } + + /** + * Checks if a specific event with given name exists + * + * @param scalar $name the event name + * + * @throws InvalidArgumentException if argument is illegal + * + * @return boolean + */ + public function hasEvent($name) + { + if (!is_scalar($name)) { + throw new InvalidArgumentException('Invalid argument given'); + } + + return isset($this->events[$name]); + } + + /** + * Returns total amount of events + * + * @return integer + */ + public function count() + { + return count($this->events); + } + + /** + * Return iterator object + * + * In order to provide the possibility to directly iterate over the + * IDS_Event object the IteratorAggregate is implemented. One can easily + * use foreach() to iterate through all stored IDS_Event objects. + * + * @return Iterator + */ + public function getIterator() + { + return new ArrayObject($this->events); + } + + /** + * Checks if any events are registered + * + * @return boolean + */ + public function isEmpty() + { + return empty($this->events); + } + + /** + * Clears calculated/collected values + * + * @return void + */ + protected function clear() + { + $this->impact = 0; + $this->tags = array(); + } + + /** + * This method returns the centrifuge property or null if not + * filled with data + * + * @return array/null + */ + public function getCentrifuge() + { + return ($this->centrifuge && count($this->centrifuge) > 0) + ? $this->centrifuge : null; + } + + /** + * This method sets the centrifuge property + * + * @param array $centrifuge the centrifuge data + * + * @throws InvalidArgumentException if argument is illegal + * + * @return boolean true is arguments were valid + */ + public function setCentrifuge($centrifuge = array()) + { + if (is_array($centrifuge) && $centrifuge) { + $this->centrifuge = $centrifuge; + return true; + } + throw new InvalidArgumentException('Invalid argument given'); + } + + /** + * Directly outputs all available information + * + * @return string + */ + public function __toString() + { + if (!$this->isEmpty()) { + $output = ''; + $output .= 'Total impact: ' . $this->getImpact() . "
    \n"; + $output .= 'Affected tags: ' . join(', ', $this->getTags()) . + "
    \n"; + + foreach ($this->events as $event) { + $output .= "
    \nVariable: " . + htmlspecialchars($event->getName()) . ' | Value: ' . + htmlspecialchars($event->getValue()) . "
    \n"; + $output .= 'Impact: ' . $event->getImpact() . ' | Tags: ' . + join(', ', $event->getTags()) . "
    \n"; + + foreach ($event as $filter) { + $output .= 'Description: ' . $filter->getDescription() . + ' | '; + $output .= 'Tags: ' . join(', ', $filter->getTags()) . + ' | '; + $output .= 'ID: ' . $filter->getId() . + "
    \n"; + } + } + + $output .= '
    '; + + if ($centrifuge = $this->getCentrifuge()) { + $output .= 'Centrifuge detection data'; + $output .= '
    Threshold: ' . + ((isset($centrifuge['threshold'])&&$centrifuge['threshold']) ? + $centrifuge['threshold'] : '---'); + $output .= '
    Ratio: ' . + ((isset($centrifuge['ratio'])&&$centrifuge['ratio']) ? + $centrifuge['ratio'] : '---'); + if(isset($centrifuge['converted'])) { + $output .= '
    Converted: ' . $centrifuge['converted']; + } + $output .= "

    \n"; + } + } + + return isset($output) ? $output : ''; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/lib/IDS/default_filter.json b/dvwa/external/phpids/0.6/lib/IDS/default_filter.json new file mode 100644 index 0000000..62cc476 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/default_filter.json @@ -0,0 +1 @@ +{"filters":{"filter":[{"id":"1","rule":"(?:\"+.*[^-]?>)|(?:[^\\w\\s]\\s*\\\/>)|(?:>\")","description":"finds html breaking injections including whitespace attacks","tags":{"tag":["xss","csrf"]},"impact":"4"},{"id":"2","rule":"(?:\"+.*[<=]\\s*\"[^\"]+\")|(?:\"\\w+\\s*=)|(?:>\\w=\\\/)|(?:#.+\\)[\"\\s]*>)|(?:\"\\s*(?:src|style|on\\w+)\\s*=\\s*\")","description":"finds attribute breaking injections including whitespace attacks","tags":{"tag":["xss","csrf"]},"impact":"4"},{"id":"2","rule":"(?:[\\s\\\/]+(?:on\\w+|style)=[\"\\w])","description":"finds malicious attribute injection attempts","tags":{"tag":["xss","csrf"]},"impact":"6"},{"id":"3","rule":"(?:^>[\\w\\s]*<\\\/?\\w{2,}>)","description":"finds unquoted attribute breaking injections","tags":{"tag":["xss","csrf"]},"impact":"2"},{"id":"4","rule":"(?:;\\W*url\\s*=)|(?:[^\\w\\s\\\/?:>]\\s*(?:location|referrer|name)\\s*[^\\\/\\w\\s-])","description":"Detects url-, name-, JSON, and referrer-contained payload attacks","tags":{"tag":["xss","csrf"]},"impact":"5"},{"id":"5","rule":"(?:\\W\\s*hash\\s*[^\\w\\s-])|(?:\\w+=\\W*[^,]*,[^\\s(]\\s*\\()|(?:\\?\"[^\\s\"]\":)|(?:(?\\-\\|])(\\s*return\\s*)?(?:create(?:element|attribute|textnode)|[a-z]+Events?|getelement\\w+|appendchild|createrange|createcontextualfragment|removenode|parentnode|decodeuricomponent|\\wettimeout|useragent)(?(1)[^\\w%\"]|(?:\\s*[^@\\s\\w%\",.+-]))","description":"Detects JavaScript DOM\/miscellaneous properties and methods","tags":{"tag":["xss","csrf","id","rfe"]},"impact":"6"},{"id":"16","rule":"([^*\\s\\w,.\\\/?+-]\\s*)?(?\\-\\|])(\\s*return\\s*)?(?:alert|showmodaldialog|infinity|isnan|isnull|msgbox|expression|prompt|write(?:ln)?|confirm|dialog|urn|(?:un)?eval|exec|execscript|tostring|execute|window|unescape|navigate)(?(1)[^\\w%\"]|(?:\\s*[^@\\s\\w%\",.\\\/+-]))","description":"Detects possible includes and typical script methods","tags":{"tag":["xss","csrf","id","rfe"]},"impact":"5"},{"id":"17","rule":"([^*:\\s\\w,.\\\/?+-]\\s*)?(?\\-\\|])(\\s*return\\s*)?(?:hash|name|href|navigateandfind|source|pathname|close|constructor|port|protocol|assign|replace|back|forward|document|window|self|parent|frames|_?content|date|cookie|innerhtml|innertext|csstext+?|outerhtml|print|moveby|resizeto|createstylesheet|stylesheets)(?(1)[^\\w%\"]|(?:\\s*[^@\\\/\\s\\w%\",.+-]))","description":"Detects JavaScript object properties and methods","tags":{"tag":["xss","csrf","id","rfe"]},"impact":"4"},{"id":"18","rule":"([^*:\\s\\w,.\\\/?+-]\\s*)?(?\\-\\|])(\\s*return\\s*)?(?:join|pop|push|reverse|shift|sp?lice|sort|unshift)(?(1)[^\\w%\"]|(?:\\s*[^@\\s\\w%\",.+-]))","description":"Detects JavaScript array properties and methods","tags":{"tag":["xss","csrf","id","rfe"]},"impact":"4"},{"id":"19","rule":"([^*:\\s\\w,.\\\/?+-]\\s*)?(?\\-\\|])(\\s*return\\s*)?(?:atob|btoa|charat|charcodeat|charset|concat|crypto|frames|fromcharcode|indexof|lastindexof|match|navigator|toolbar|menubar|replace|regexp|slice|split|substr|substring|escape|\\w+codeuri\\w*)(?(1)[^\\w%\"]|(?:\\s*[^@\\s\\w%\",.+-]))","description":"Detects JavaScript string properties and methods","tags":{"tag":["xss","csrf","id","rfe"]},"impact":"4"},{"id":"20","rule":"([^*:\\s\\w,.\\\/?+-]\\s*)?(?\\-\\|])(\\s*return\\s*)?(?:globalstorage|sessionstorage|postmessage|callee|constructor|content|domain|prototype|try|catch|top|call|apply|url|function|object|array|string|math|if|elseif|case|switch|regex|boolean|location|settimeout|setinterval|void|setexpression|namespace|while)(?(1)[^\\w%\"]|(?:\\s*[^@\\s\\w%\",.+-]))","description":"Detects JavaScript language constructs","tags":{"tag":["xss","csrf","id","rfe"]},"impact":"4"},{"id":"21","rule":"(?:,\\s*(?:alert|showmodaldialog|eval)\\s*,)|(?::\\s*eval\\s*[^\\s])|([^:\\s\\w,.\\\/?+-]\\s*)?(?]*)t(?!rong))|(?:\\)|(?:\\\/\\*|\\*\\\/)|(?:(?:[\\W\\d]#|--|{)$)|(?:\\\/{3,}.*$)|(?:)","description":"Detects common comment types","tags":{"tag":["xss","csrf","id"]},"impact":"3"},{"id":"36","rule":"(?:--.*[^-]>)|(?:opera\\s*\\.\\s*\\w+\\s*\\()","description":"Detects comments to exploit firefox' faulty rendering and proprietary opera attacks","tags":{"tag":["xss","csrf","id"]},"impact":"3"},{"id":"37","rule":"(?:\\%+-][\\w-]+[^\\w\\s]+\"[^,])","description":"Detects classic SQL injection probings 2\/2","tags":{"tag":["sqli","id","lfi"]},"impact":"6"},{"id":"44","rule":"(?:^admin\\s*\"|(\\\/\\*)+\"+\\s?(?:--|#|\\\/\\*|{)?)|(?:\"\\s*or[\\w\\s-]+\\s*[+<>=(),-]\\s*[\\d\"])|(?:\"\\s*[^\\w\\s]?=\\s*\")|(?:\"\\W*[+=]+\\W*\")|(?:\"\\s*[!=|][\\d\\s!=+-]+.*[\"(].*$)|(?:\"\\s*[!=|][\\d\\s!=]+.*\\d+$)|(?:\"\\s*like[+=\\s\\.-]+[\\d\"(])|(?:\\sis\\s*0\\W)|(?:where\\s[\\s\\w\\.,-]+\\s=)|(?:\"[<>~]+\")","description":"Detects basic SQL authentication bypass attempts 1\/3","tags":{"tag":["sqli","id","lfi"]},"impact":"7"},{"id":"45","rule":"(?:union\\s*(?:all|distinct)?\\s*[([]\\s*select)|(?:\\w+\\s+like\\s+\\\")|(?:like\\s*\"\\%)|(?:\"\\s*like\\W*[\"\\d])|(?:\"\\s*(?:n?and|x?or|not |\\|\\||\\&\\&)\\s+[\\s\\w]+=\\s*\\w+\\s*having)|(?:\"\\s*\\*\\s*\\w+\\W+\")|(?:\"\\s*[^?\\w\\s=.,;\\\/)(]+\\s*[(@]*\\s*\\w+\\W+\\w)|(?:select\\s*[\\[\\]()\\s\\w\\.,-]+from)","description":"Detects basic SQL authentication bypass attempts 2\/3","tags":{"tag":["sqli","id","lfi"]},"impact":"7"},{"id":"46","rule":"(?:(?:n?and|x?or|not |\\|\\||\\&\\&)\\s+[\\s\\w+]+(?:regexp\\s*\\(|sounds\\s+like\\s*\"|[=\\d]+x))|(\"\\s*\\d\\s*(?:--|#))|(?:\"[%&<>^=]+\\d\\s*(=|or))|(?:\"\\W+[\\w+-]+\\s*=\\s*\\d\\W+\")|(?:\"\\s*is\\s*\\d.+\"?\\w)|(?:\"\\|?[\\w-]{3,}[^\\w\\s.]+\")|(?:\"\\s*is\\s*[\\d.]+\\s*\\W.*\")","description":"Detects basic SQL authentication bypass attempts 3\/3","tags":{"tag":["sqli","id","lfi"]},"impact":"7"},{"id":"47","rule":"(?:^\\s*[;>\"]\\s*(?:union|select|create|rename|truncate|load|alter|delete|update|insert|desc))|(?:(?:select|create|rename|truncate|load|alter|delete|update|insert|desc)\\s+(?:concat|char|load_file)\\s?\\(?)|(?:end\\s*\\);)|(\"\\s+regexp\\W)","description":"Detects concatenated basic SQL injection and SQLLFI attempts","tags":{"tag":["sqli","id","lfi"]},"impact":"5"},{"id":"48","rule":"(?:\\d\\s+group\\s+by.+\\()|(?:(?:;|#|--)\\s*(?:drop|alter))|(?:(?:;|#|--)\\s*(?:update|insert)\\s*\\w{2,})|(?:[^\\w]SET\\s*@\\w+)|(?:(?:n?and|x?or|not |\\|\\||\\&\\&)\\s+\\w+[!=+]+[\\s\\d]*[\"=(])","description":"Detects chained SQL injection attempts 1\/2","tags":{"tag":["sqli","id"]},"impact":"6"},{"id":"49","rule":"(?:\\*\\\/from)|(?:\\+\\s*\\d+\\s*\\+\\s*@)|(?:\\w\"\\s*(?:[-+=|@]+\\s*)+[\\d(])|(?:coalesce\\s*\\(|@@\\w+\\s*[^\\w\\s])|(?:\\W!+\"\\w)|(?:\";\\s*(?:if|while|begin))|(?:\"[\\s\\d]+=\\s*\\d)|(?:order\\s+by\\s+if\\w*\\s*\\()","description":"Detects chained SQL injection attempts 2\/2","tags":{"tag":["sqli","id"]},"impact":"6"},{"id":"50","rule":"(?:(select|;)\\s+(?:benchmark|if|sleep)\\s?\\(\\s?\\(?\\s?\\w+)","description":"Detects SQL benchmark and sleep injection attempts including conditional queries","tags":{"tag":["sqli","id"]},"impact":"4"},{"id":"51","rule":"(?:create\\s+function\\s+\\w+\\s+returns)|(?:;\\s*(?:select|create|rename|truncate|load|alter|delete|update|insert|desc)\\s*[\\[(]?\\w{2,})","description":"Detects MySQL UDF injection and other data\/structure manipulation attempts","tags":{"tag":["sqli","id"]},"impact":"6"},{"id":"52","rule":"(?:alter\\s*\\w+.*character\\s+set\\s+\\w+)|(\";\\s*waitfor\\s+time\\s+\")|(?:\";.*:\\s*goto)","description":"Detects MySQL charset switch and MSSQL DoS attempts","tags":{"tag":["sqli","id"]},"impact":"6"},{"id":"53","rule":"(?:procedure\\s+analyse\\s*\\()|(?:;\\s*(declare|open)\\s+[\\w-]+)|(?:create\\s+(procedure|function)\\s*\\w+\\s*\\(\\s*\\)\\s*-)|(?:declare[^\\w]+[@#]\\s*\\w+)|(exec\\s*\\(\\s*@)","description":"Detects MySQL and PostgreSQL stored procedure\/function injections","tags":{"tag":["sqli","id"]},"impact":"7"},{"id":"54","rule":"(?:select\\s*pg_sleep)|(?:waitfor\\s*delay\\s?\"+\\s?\\d)|(?:;\\s*shutdown\\s*(?:;|--|#|\\\/\\*|{))","description":"Detects Postgres pg_sleep injection, waitfor delay attacks and database shutdown attempts","tags":{"tag":["sqli","id"]},"impact":"5"},{"id":"55","rule":"(?:\\wiif\\s*\\()|(?:exec\\s+master\\.)|(?:union select @)|(?:union\\s*\\w*\\s*select)|(?:select.*\\w?user\\()|(?:into[\\s+]+(?:dump|out)file\\s*\")","description":"Detects MSSQL code execution and information gathering attempts","tags":{"tag":["sqli","id"]},"impact":"5"},{"id":"56","rule":"(?:merge.*using\\s*\\()|(execute\\s*immediate\\s*\")|(?:\\W+\\d*\\s+having\\s+\\d)|(?:match\\s*[\\w(),+-]+\\s*against\\s*\\()","description":"Detects MATCH AGAINST, MERGE, EXECUTE IMMEDIATE and HAVING injections","tags":{"tag":["sqli","id"]},"impact":"5"},{"id":"57","rule":"(?:select\\s*\\*\\s*from)|((?:select|create|rename|truncate|load|alter|delete|update|insert|desc)\\s*\\(\\s*space\\s*\\()","description":"Detects MySQL comment-\/space-obfuscated injections","tags":{"tag":["sqli","id"]},"impact":"5"},{"id":"58","rule":"(?:@[\\w-]+\\s*\\()|(?:]\\s*\\(\\s*[\"!]\\s*\\w)|(?:<[?%](?:php)?.*(?:[?%]>)?)|(?:;[\\s\\w|]*\\$\\w+\\s*=)|(?:\\$\\w+\\s*=(?:(?:\\s*\\$?\\w+\\s*[(;])|\\s*\".*\"))|(?:;\\s*\\{\\W*\\w+\\s*\\()","description":"Detects code injection attempts 1\/3","tags":{"tag":["id","rfe","lfi"]},"impact":"7"},{"id":"59","rule":"(?:(?:[;]+|(<[?%](?:php)?)).*(?:define|eval|file_get_contents|include|require|require_once|set|shell_exec|phpinfo|system|passthru|preg_\\w+|execute)\\s*[\"(@])","description":"Detects code injection attempts 2\/3","tags":{"tag":["id","rfe","lfi"]},"impact":"7"},{"id":"60","rule":"(?:(?:[;]+|(<[?%](?:php)?)).*[^\\w](?:echo|print|print_r|var_dump|[fp]open))|(?:;\\s*rm\\s+-\\w+\\s+)|(?:;.*{.*\\$\\w+\\s*=)|(?:\\$\\w+\\s*\\[\\]\\s*=\\s*)","description":"Detects code injection attempts 3\/3","tags":{"tag":["id","rfe","lfi"]},"impact":"7"},{"id":"61","rule":"(?:\\w+]?(?))","description":"finds attribute breaking injections including obfuscated attributes","tags":{"tag":["xss","csrf"]},"impact":"4"}]}} \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/lib/IDS/default_filter.xml b/dvwa/external/phpids/0.6/lib/IDS/default_filter.xml new file mode 100644 index 0000000..2988b25 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/default_filter.xml @@ -0,0 +1,732 @@ + + + 1 + )|(?:[^\w\s]\s*\/>)|(?:>")]]> + finds html breaking injections including whitespace attacks + + xss + csrf + + 4 + + + 2 + \w=\/)|(?:#.+\)["\s]*>)|(?:"\s*(?:src|style|on\w+)\s*=\s*")]]> + finds attribute breaking injections including whitespace attacks + + xss + csrf + + 4 + + + 69 + + finds malicious attribute injection attempts + + xss + csrf + + 6 + + + 3 + [\w\s]*<\/?\w{2,}>)]]> + finds unquoted attribute breaking injections + + xss + csrf + + 2 + + + 4 + ]\s*(?:location|referrer|name)\s*[^\/\w\s-])]]> + Detects url-, name-, JSON, and referrer-contained payload attacks + + xss + csrf + + 5 + + + 5 + + Detects hash-contained xss payload attacks, setter usage and property overloading + + xss + csrf + + 5 + + + 6 + + Detects self contained xss via with(), common loops and regex to string conversion + + xss + csrf + + 5 + + + 7 + + Detects JavaScript with(), ternary operators and XML predicate attacks + + xss + csrf + + 5 + + + 8 + + Detects self-executing JavaScript functions + + xss + csrf + + 5 + + + 9 + + Detects the IE octal, hex and unicode entities + + xss + csrf + + 2 + + + 10 + + Detects basic directory traversal + + dt + id + lfi + + 5 + + + 11 + + Detects specific directory and path traversal + + dt + id + lfi + + 5 + + + 12 + + Detects etc/passwd inclusion attempts + + dt + id + lfi + + 5 + + + 13 + + Detects halfwidth/fullwidth encoded unicode HTML breaking attempts + + xss + csrf + + 3 + + + 14 + + Detects possible includes and packed functions + + xss + csrf + id + rfe + + 5 + + + 15 + \-\|])(\s*return\s*)?(?:create(?:element|attribute|textnode)|[a-z]+Events?|getelement\w+|appendchild|createrange|createcontextualfragment|removenode|parentnode|decodeuricomponent|\wettimeout|useragent)(?(1)[^\w%"]|(?:\s*[^@\s\w%",.+\-]))]]> + Detects JavaScript DOM/miscellaneous properties and methods + + xss + csrf + id + rfe + + 6 + + + 16 + \-\|])(\s*return\s*)?(?:alert|showmodaldialog|infinity|isnan|isnull|msgbox|expression|prompt|write(?:ln)?|confirm|dialog|urn|(?:un)?eval|exec|execscript|tostring|status|execute|window|unescape|navigate)(?(1)[^\w%"]|(?:\s*[^@\s\w%",.:\/+\-]))]]> + Detects possible includes and typical script methods + + xss + csrf + id + rfe + + 5 + + + 17 + \-\|])(\s*return\s*)?(?:hash|name|href|navigateandfind|source|pathname|close|constructor|port|protocol|assign|replace|back|forward|document|window|self|parent|frames|_?content|date|cookie|innerhtml|innertext|csstext+?|outerhtml|print|moveby|resizeto|createstylesheet|stylesheets)(?(1)[^\w%"]|(?:\s*[^@\/\s\w%",.+\-]))]]> + Detects JavaScript object properties and methods + + xss + csrf + id + rfe + + 4 + + + 18 + \-\|])(\s*return\s*)?(?:join|pop|push|reverse|shift|sp?lice|sort|unshift)(?(1)[^\w%"]|(?:\s*[^@\s\w%",.+\-]))]]> + Detects JavaScript array properties and methods + + xss + csrf + id + rfe + + 4 + + + 19 + \-\|])(\s*return\s*)?(?:atob|btoa|charat|charcodeat|charset|concat|crypto|frames|fromcharcode|indexof|lastindexof|match|navigator|toolbar|menubar|replace|regexp|slice|split|substr|substring|escape|\w+codeuri\w*)(?(1)[^\w%"]|(?:\s*[^@\s\w%",.+\-]))]]> + Detects JavaScript string properties and methods + + xss + csrf + id + rfe + + 4 + + + 20 + \-\|])(\s*return\s*)?(?:globalstorage|sessionstorage|postmessage|callee|constructor|content|domain|prototype|try|catch|top|call|apply|url|function|object|array|string|math|if|elseif|case|switch|regex|boolean|location|settimeout|setinterval|void|setexpression|namespace|while)(?(1)[^\w%"]|(?:\s*[^@\s\w%",.+\-]))]]> + Detects JavaScript language constructs + + xss + csrf + id + rfe + + 4 + + + 21 + + Detects very basic XSS probings + + xss + csrf + id + rfe + + 3 + + + 22 + + Detects advanced XSS probings via Script(), RexExp, constructors and XML namespaces + + xss + csrf + id + rfe + + 5 + + + 23 + + Detects JavaScript location/document property access and window access obfuscation + + xss + csrf + + 5 + + + 24 + + Detects basic obfuscated JavaScript script injections + + xss + csrf + + 5 + + + 25 + + Detects obfuscated JavaScript script injections + + xss + csrf + + 5 + + + 26 + + Detects JavaScript cookie stealing and redirection attempts + + xss + csrf + + 4 + + + 27 + + Detects data: URL injections and common URI schemes + + xss + rfe + + 5 + + + 28 + + Detects IE firefoxurl injections, cache poisoning attempts and local file inclusion/execution + + xss + rfe + lfi + csrf + + 5 + + + 29 + + Detects bindings and behavior injections + + xss + csrf + rfe + + 4 + + + 30 + + Detects common XSS concatenation patterns 1/2 + + xss + csrf + id + rfe + + 4 + + + 31 + + Detects common XSS concatenation patterns 2/2 + + xss + csrf + id + rfe + + 4 + + + 32 + + Detects possible event handlers + + xss + csrf + + 4 + + + 33 + ]*)t(?!rong))|(?:\ + Detects obfuscated script tags and XML wrapped HTML + + xss + + 4 + + + 34 + + Detects attributes in closing tags and conditional compilation tokens + + xss + csrf + + 4 + + + 35 + )|(?:\/\*|\*\/)|(?:(?:[\W\d]#|--|{)$)|(?:\/{3,}.*$)|(?:)]]> + Detects common comment types + + xss + csrf + id + + 3 + + + 36 + )|(?:opera\s*\.\s*\w+\s*\()]]> + Detects comments to exploit firefox' faulty rendering and proprietary opera attacks + + xss + csrf + id + + 3 + + + 37 + + Detects base href injections and XML entity injections + + xss + csrf + id + + 5 + + + 38 + + Detects possibly malicious html elements including some attributes + + xss + csrf + id + rfe + lfi + + 4 + + + 39 + + Detects nullbytes and HTTP response splitting + + id + rfe + xss + + 5 + + + 40 + + Detects MySQL comments, conditions and ch(a)r injections + + sqli + id + lfi + + 6 + + + 41 + ~])|(?:if\s?\([\d\w]\s*[=<>~])]]> + Detects conditional SQL injection attempts + + sqli + id + lfi + + 4 + + + 42 + + Detects classic SQL injection probings 1/2 + + sqli + id + lfi + + 6 + + + 43 + %+-][\w-]+[^\w\s]+"[^,])]]> + Detects classic SQL injection probings 2/2 + + sqli + id + lfi + + 6 + + + 44 + =(),-]\s*[\d"])|(?:"\s*[^\w\s]?=\s*")|(?:"\W*[+=]+\W*")|(?:"\s*[!=|][\d\s!=+-]+.*["(].*$)|(?:"\s*[!=|][\d\s!=]+.*\d+$)|(?:"\s*like\W+[\w"(])|(?:\sis\s*0\W)|(?:where\s[\s\w\.,-]+\s=)|(?:"[<>~]+")]]> + Detects basic SQL authentication bypass attempts 1/3 + + sqli + id + lfi + + 7 + + + 45 + + Detects basic SQL authentication bypass attempts 2/3 + + sqli + id + lfi + + 7 + + + 46 + ^=]+\d\s*(=|or))|(?:"\W+[\w+-]+\s*=\s*\d\W+")|(?:"\s*is\s*\d.+"?\w)|(?:"\|?[\w-]{3,}[^\w\s.,]+")|(?:"\s*is\s*[\d.]+\s*\W.*")]]> + Detects basic SQL authentication bypass attempts 3/3 + + sqli + id + lfi + + 7 + + + 47 + "]\s*(?:union|select|create|rename|truncate|load|alter|delete|update|insert|desc))|(?:(?:select|create|rename|truncate|load|alter|delete|update|insert|desc)\s+(?:concat|char|load_file)\s?\(?)|(?:end\s*\);)|("\s+regexp\W)]]> + Detects concatenated basic SQL injection and SQLLFI attempts + + sqli + id + lfi + + 5 + + + 48 + + Detects chained SQL injection attempts 1/2 + + sqli + id + + 6 + + + 49 + + Detects chained SQL injection attempts 2/2 + + sqli + id + + 6 + + + 50 + + Detects SQL benchmark and sleep injection attempts including conditional queries + + sqli + id + + 4 + + + 51 + + Detects MySQL UDF injection and other data/structure manipulation attempts + + sqli + id + + 6 + + + 52 + + Detects MySQL charset switch and MSSQL DoS attempts + + sqli + id + + 6 + + + 53 + + Detects MySQL and PostgreSQL stored procedure/function injections + + sqli + id + + 7 + + + 54 + + Detects Postgres pg_sleep injection, waitfor delay attacks and database shutdown attempts + + sqli + id + + 5 + + + 55 + + Detects MSSQL code execution and information gathering attempts + + sqli + id + + 5 + + + 56 + + Detects MATCH AGAINST, MERGE, EXECUTE IMMEDIATE and HAVING injections + + sqli + id + + 5 + + + 57 + + Detects MySQL comment-/space-obfuscated injections + + sqli + id + + 5 + + + 58 + )?)|(?:;[\s\w|]*\$\w+\s*=)|(?:\$\w+\s*=(?:(?:\s*\$?\w+\s*[(;])|\s*".*"))|(?:;\s*\{\W*\w+\s*\()]]> + Detects code injection attempts 1/3 + + id + rfe + lfi + + 7 + + + 59 + + Detects code injection attempts 2/3 + + id + rfe + lfi + + 7 + + + 60 + + Detects code injection attempts 3/3 + + id + rfe + lfi + + 7 + + + 61 + + Detects url injections and RFE attempts + + id + rfe + lfi + + 5 + + + 62 + + Detects common function declarations and special JS operators + + id + rfe + lfi + + 5 + + + 63 + + Detects common mail header injections + + id + spam + + 5 + + + 64 + + Detects perl echo shellcode injection and LDAP vectors + + lfi + rfe + + 5 + + + 65 + + Detects basic XSS DoS attempts + + rfe + dos + + 5 + + + 67 + + Detects unknown attack vectors based on PHPIDS Centrifuge detection + + xss + csrf + id + rfe + lfi + + 7 + + + 68 + ))]]> + finds attribute breaking injections including obfuscated attributes + + xss + csrf + + 4 + + \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt b/dvwa/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt new file mode 100644 index 0000000..d01f907 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt @@ -0,0 +1 @@ +"local/unknown",2010-03-15T23:07:01+00:00,72,"xss csrf id rfe lfi sqli","REQUEST.test=%22%3E%3Cscript%3Eeval%28window.name%29%3C%2Fscript%3E GET.test=%22%3E%3Cscript%3Eeval%28window.name%29%3C%2Fscript%3E","%2Fdvwa%2Fsecurity.php%3Ftest%3D%2522%253E%253Cscript%253Eeval%28window.name%29%253C%2Fscript%253E","127.0.0.1" diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.auto.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.auto.php new file mode 100644 index 0000000..2d2493a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.auto.php @@ -0,0 +1,9 @@ +purify($html, $config); +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.includes.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.includes.php new file mode 100644 index 0000000..97084e8 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.includes.php @@ -0,0 +1,204 @@ + $attributes) { + $allowed_elements[$element] = true; + foreach ($attributes as $attribute => $x) { + $allowed_attributes["$element.$attribute"] = true; + } + } + $config->set('HTML', 'AllowedElements', $allowed_elements); + $config->set('HTML', 'AllowedAttributes', $allowed_attributes); + $allowed_schemes = array(); + if ($allowed_protocols !== null) { + $config->set('URI', 'AllowedSchemes', $allowed_protocols); + } + $purifier = new HTMLPurifier($config); + return $purifier->purify($string); +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.path.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.path.php new file mode 100644 index 0000000..01d4633 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.path.php @@ -0,0 +1,9 @@ +config = HTMLPurifier_Config::create($config); + + $this->strategy = new HTMLPurifier_Strategy_Core(); + + } + + /** + * Adds a filter to process the output. First come first serve + * @param $filter HTMLPurifier_Filter object + */ + public function addFilter($filter) { + trigger_error('HTMLPurifier->addFilter() is deprecated, use configuration directives in the Filter namespace or Filter.Custom', E_USER_WARNING); + $this->filters[] = $filter; + } + + /** + * Filters an HTML snippet/document to be XSS-free and standards-compliant. + * + * @param $html String of HTML to purify + * @param $config HTMLPurifier_Config object for this operation, if omitted, + * defaults to the config object specified during this + * object's construction. The parameter can also be any type + * that HTMLPurifier_Config::create() supports. + * @return Purified HTML + */ + public function purify($html, $config = null) { + + // :TODO: make the config merge in, instead of replace + $config = $config ? HTMLPurifier_Config::create($config) : $this->config; + + // implementation is partially environment dependant, partially + // configuration dependant + $lexer = HTMLPurifier_Lexer::create($config); + + $context = new HTMLPurifier_Context(); + + // setup HTML generator + $this->generator = new HTMLPurifier_Generator($config, $context); + $context->register('Generator', $this->generator); + + // set up global context variables + if ($config->get('Core', 'CollectErrors')) { + // may get moved out if other facilities use it + $language_factory = HTMLPurifier_LanguageFactory::instance(); + $language = $language_factory->create($config, $context); + $context->register('Locale', $language); + + $error_collector = new HTMLPurifier_ErrorCollector($context); + $context->register('ErrorCollector', $error_collector); + } + + // setup id_accumulator context, necessary due to the fact that + // AttrValidator can be called from many places + $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); + $context->register('IDAccumulator', $id_accumulator); + + $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context); + + // setup filters + $filter_flags = $config->getBatch('Filter'); + $custom_filters = $filter_flags['Custom']; + unset($filter_flags['Custom']); + $filters = array(); + foreach ($filter_flags as $filter => $flag) { + if (!$flag) continue; + $class = "HTMLPurifier_Filter_$filter"; + $filters[] = new $class; + } + foreach ($custom_filters as $filter) { + // maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat + $filters[] = $filter; + } + $filters = array_merge($filters, $this->filters); + // maybe prepare(), but later + + for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) { + $html = $filters[$i]->preFilter($html, $config, $context); + } + + // purified HTML + $html = + $this->generator->generateFromTokens( + // list of tokens + $this->strategy->execute( + // list of un-purified tokens + $lexer->tokenizeHTML( + // un-purified HTML + $html, $config, $context + ), + $config, $context + ) + ); + + for ($i = $filter_size - 1; $i >= 0; $i--) { + $html = $filters[$i]->postFilter($html, $config, $context); + } + + $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context); + $this->context =& $context; + return $html; + } + + /** + * Filters an array of HTML snippets + * @param $config Optional HTMLPurifier_Config object for this operation. + * See HTMLPurifier::purify() for more details. + * @return Array of purified HTML + */ + public function purifyArray($array_of_html, $config = null) { + $context_array = array(); + foreach ($array_of_html as $key => $html) { + $array_of_html[$key] = $this->purify($html, $config); + $context_array[$key] = $this->context; + } + $this->context = $context_array; + return $array_of_html; + } + + /** + * Singleton for enforcing just one HTML Purifier in your system + * @param $prototype Optional prototype HTMLPurifier instance to + * overload singleton with, or HTMLPurifier_Config + * instance to configure the generated version with. + */ + public static function instance($prototype = null) { + if (!self::$instance || $prototype) { + if ($prototype instanceof HTMLPurifier) { + self::$instance = $prototype; + } elseif ($prototype) { + self::$instance = new HTMLPurifier($prototype); + } else { + self::$instance = new HTMLPurifier(); + } + } + return self::$instance; + } + + /** + * @note Backwards compatibility, see instance() + */ + public static function getInstance($prototype = null) { + return HTMLPurifier::instance($prototype); + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.safe-includes.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.safe-includes.php new file mode 100644 index 0000000..e6a8547 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier.safe-includes.php @@ -0,0 +1,198 @@ +attr_collections as $coll_i => $coll) { + if (!isset($this->info[$coll_i])) { + $this->info[$coll_i] = array(); + } + foreach ($coll as $attr_i => $attr) { + if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) { + // merge in includes + $this->info[$coll_i][$attr_i] = array_merge( + $this->info[$coll_i][$attr_i], $attr); + continue; + } + $this->info[$coll_i][$attr_i] = $attr; + } + } + } + // perform internal expansions and inclusions + foreach ($this->info as $name => $attr) { + // merge attribute collections that include others + $this->performInclusions($this->info[$name]); + // replace string identifiers with actual attribute objects + $this->expandIdentifiers($this->info[$name], $attr_types); + } + } + + /** + * Takes a reference to an attribute associative array and performs + * all inclusions specified by the zero index. + * @param &$attr Reference to attribute array + */ + public function performInclusions(&$attr) { + if (!isset($attr[0])) return; + $merge = $attr[0]; + $seen = array(); // recursion guard + // loop through all the inclusions + for ($i = 0; isset($merge[$i]); $i++) { + if (isset($seen[$merge[$i]])) continue; + $seen[$merge[$i]] = true; + // foreach attribute of the inclusion, copy it over + if (!isset($this->info[$merge[$i]])) continue; + foreach ($this->info[$merge[$i]] as $key => $value) { + if (isset($attr[$key])) continue; // also catches more inclusions + $attr[$key] = $value; + } + if (isset($this->info[$merge[$i]][0])) { + // recursion + $merge = array_merge($merge, $this->info[$merge[$i]][0]); + } + } + unset($attr[0]); + } + + /** + * Expands all string identifiers in an attribute array by replacing + * them with the appropriate values inside HTMLPurifier_AttrTypes + * @param &$attr Reference to attribute array + * @param $attr_types HTMLPurifier_AttrTypes instance + */ + public function expandIdentifiers(&$attr, $attr_types) { + + // because foreach will process new elements we add, make sure we + // skip duplicates + $processed = array(); + + foreach ($attr as $def_i => $def) { + // skip inclusions + if ($def_i === 0) continue; + + if (isset($processed[$def_i])) continue; + + // determine whether or not attribute is required + if ($required = (strpos($def_i, '*') !== false)) { + // rename the definition + unset($attr[$def_i]); + $def_i = trim($def_i, '*'); + $attr[$def_i] = $def; + } + + $processed[$def_i] = true; + + // if we've already got a literal object, move on + if (is_object($def)) { + // preserve previous required + $attr[$def_i]->required = ($required || $attr[$def_i]->required); + continue; + } + + if ($def === false) { + unset($attr[$def_i]); + continue; + } + + if ($t = $attr_types->get($def)) { + $attr[$def_i] = $t; + $attr[$def_i]->required = $required; + } else { + unset($attr[$def_i]); + } + } + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef.php new file mode 100644 index 0000000..a5f66f7 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef.php @@ -0,0 +1,86 @@ + by removing + * leading and trailing whitespace, ignoring line feeds, and replacing + * carriage returns and tabs with spaces. While most useful for HTML + * attributes specified as CDATA, it can also be applied to most CSS + * values. + * + * @note This method is not entirely standards compliant, as trim() removes + * more types of whitespace than specified in the spec. In practice, + * this is rarely a problem, as those extra characters usually have + * already been removed by HTMLPurifier_Encoder. + * + * @warning This processing is inconsistent with XML's whitespace handling + * as specified by section 3.3.3 and referenced XHTML 1.0 section + * 4.7. However, note that we are NOT necessarily + * parsing XML, thus, this behavior may still be correct. We + * assume that newlines have been normalized. + */ + public function parseCDATA($string) { + $string = trim($string); + $string = str_replace(array("\n", "\t", "\r"), ' ', $string); + return $string; + } + + /** + * Factory method for creating this class from a string. + * @param $string String construction info + * @return Created AttrDef object corresponding to $string + */ + public function make($string) { + // default implementation, return a flyweight of this object. + // If $string has an effect on the returned object (i.e. you + // need to overload this method), it is best + // to clone or instantiate new copies. (Instantiation is safer.) + return $this; + } + + /** + * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work + * properly. THIS IS A HACK! + */ + protected function mungeRgb($string) { + return preg_replace('/rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)/', 'rgb(\1,\2,\3)', $string); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS.php new file mode 100644 index 0000000..381aaed --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS.php @@ -0,0 +1,86 @@ +parseCDATA($css); + + $definition = $config->getCSSDefinition(); + + // we're going to break the spec and explode by semicolons. + // This is because semicolon rarely appears in escaped form + // Doing this is generally flaky but fast + // IT MIGHT APPEAR IN URIs, see HTMLPurifier_AttrDef_CSSURI + // for details + + $declarations = explode(';', $css); + $propvalues = array(); + + /** + * Name of the current CSS property being validated. + */ + $property = false; + $context->register('CurrentCSSProperty', $property); + + foreach ($declarations as $declaration) { + if (!$declaration) continue; + if (!strpos($declaration, ':')) continue; + list($property, $value) = explode(':', $declaration, 2); + $property = trim($property); + $value = trim($value); + $ok = false; + do { + if (isset($definition->info[$property])) { + $ok = true; + break; + } + if (ctype_lower($property)) break; + $property = strtolower($property); + if (isset($definition->info[$property])) { + $ok = true; + break; + } + } while(0); + if (!$ok) continue; + // inefficient call, since the validator will do this again + if (strtolower(trim($value)) !== 'inherit') { + // inherit works for everything (but only on the base property) + $result = $definition->info[$property]->validate( + $value, $config, $context ); + } else { + $result = 'inherit'; + } + if ($result === false) continue; + $propvalues[$property] = $result; + } + + $context->destroy('CurrentCSSProperty'); + + // procedure does not write the new CSS simultaneously, so it's + // slightly inefficient, but it's the only way of getting rid of + // duplicates. Perhaps config to optimize it, but not now. + + $new_declarations = ''; + foreach ($propvalues as $prop => $value) { + $new_declarations .= "$prop:$value;"; + } + + return $new_declarations ? $new_declarations : false; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php new file mode 100644 index 0000000..2bbecc0 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php @@ -0,0 +1,19 @@ + 1.0) $result = '1'; + return $result; + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Background.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Background.php new file mode 100644 index 0000000..762448d --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Background.php @@ -0,0 +1,86 @@ +getCSSDefinition(); + $this->info['background-color'] = $def->info['background-color']; + $this->info['background-image'] = $def->info['background-image']; + $this->info['background-repeat'] = $def->info['background-repeat']; + $this->info['background-attachment'] = $def->info['background-attachment']; + $this->info['background-position'] = $def->info['background-position']; + } + + public function validate($string, $config, $context) { + + // regular pre-processing + $string = $this->parseCDATA($string); + if ($string === '') return false; + + // munge rgb() decl if necessary + $string = $this->mungeRgb($string); + + // assumes URI doesn't have spaces in it + $bits = explode(' ', strtolower($string)); // bits to process + + $caught = array(); + $caught['color'] = false; + $caught['image'] = false; + $caught['repeat'] = false; + $caught['attachment'] = false; + $caught['position'] = false; + + $i = 0; // number of catches + $none = false; + + foreach ($bits as $bit) { + if ($bit === '') continue; + foreach ($caught as $key => $status) { + if ($key != 'position') { + if ($status !== false) continue; + $r = $this->info['background-' . $key]->validate($bit, $config, $context); + } else { + $r = $bit; + } + if ($r === false) continue; + if ($key == 'position') { + if ($caught[$key] === false) $caught[$key] = ''; + $caught[$key] .= $r . ' '; + } else { + $caught[$key] = $r; + } + $i++; + break; + } + } + + if (!$i) return false; + if ($caught['position'] !== false) { + $caught['position'] = $this->info['background-position']-> + validate($caught['position'], $config, $context); + } + + $ret = array(); + foreach ($caught as $value) { + if ($value === false) continue; + $ret[] = $value; + } + + if (empty($ret)) return false; + return implode(' ', $ret); + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php new file mode 100644 index 0000000..795d7c3 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php @@ -0,0 +1,125 @@ + | | left | center | right + ] + [ + | | top | center | bottom + ]? + ] | + [ // this signifies that the vertical and horizontal adjectives + // can be arbitrarily ordered, however, there can only be two, + // one of each, or none at all + [ + left | center | right + ] || + [ + top | center | bottom + ] + ] + top, left = 0% + center, (none) = 50% + bottom, right = 100% +*/ + +/* QuirksMode says: + keyword + length/percentage must be ordered correctly, as per W3C + + Internet Explorer and Opera, however, support arbitrary ordering. We + should fix it up. + + Minor issue though, not strictly necessary. +*/ + +// control freaks may appreciate the ability to convert these to +// percentages or something, but it's not necessary + +/** + * Validates the value of background-position. + */ +class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef +{ + + protected $length; + protected $percentage; + + public function __construct() { + $this->length = new HTMLPurifier_AttrDef_CSS_Length(); + $this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage(); + } + + public function validate($string, $config, $context) { + $string = $this->parseCDATA($string); + $bits = explode(' ', $string); + + $keywords = array(); + $keywords['h'] = false; // left, right + $keywords['v'] = false; // top, bottom + $keywords['c'] = false; // center + $measures = array(); + + $i = 0; + + $lookup = array( + 'top' => 'v', + 'bottom' => 'v', + 'left' => 'h', + 'right' => 'h', + 'center' => 'c' + ); + + foreach ($bits as $bit) { + if ($bit === '') continue; + + // test for keyword + $lbit = ctype_lower($bit) ? $bit : strtolower($bit); + if (isset($lookup[$lbit])) { + $status = $lookup[$lbit]; + $keywords[$status] = $lbit; + $i++; + } + + // test for length + $r = $this->length->validate($bit, $config, $context); + if ($r !== false) { + $measures[] = $r; + $i++; + } + + // test for percentage + $r = $this->percentage->validate($bit, $config, $context); + if ($r !== false) { + $measures[] = $r; + $i++; + } + + } + + if (!$i) return false; // no valid values were caught + + + $ret = array(); + + // first keyword + if ($keywords['h']) $ret[] = $keywords['h']; + elseif (count($measures)) $ret[] = array_shift($measures); + elseif ($keywords['c']) { + $ret[] = $keywords['c']; + $keywords['c'] = false; // prevent re-use: center = center center + } + + if ($keywords['v']) $ret[] = $keywords['v']; + elseif (count($measures)) $ret[] = array_shift($measures); + elseif ($keywords['c']) $ret[] = $keywords['c']; + + if (empty($ret)) return false; + return implode(' ', $ret); + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Border.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Border.php new file mode 100644 index 0000000..940f436 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Border.php @@ -0,0 +1,42 @@ +getCSSDefinition(); + $this->info['border-width'] = $def->info['border-width']; + $this->info['border-style'] = $def->info['border-style']; + $this->info['border-top-color'] = $def->info['border-top-color']; + } + + public function validate($string, $config, $context) { + $string = $this->parseCDATA($string); + $string = $this->mungeRgb($string); + $bits = explode(' ', $string); + $done = array(); // segments we've finished + $ret = ''; // return value + foreach ($bits as $bit) { + foreach ($this->info as $propname => $validator) { + if (isset($done[$propname])) continue; + $r = $validator->validate($bit, $config, $context); + if ($r !== false) { + $ret .= $r . ' '; + $done[$propname] = true; + break; + } + } + } + return rtrim($ret); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Color.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Color.php new file mode 100644 index 0000000..d114b27 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Color.php @@ -0,0 +1,77 @@ +get('Core', 'ColorKeywords'); + + $color = trim($color); + if ($color === '') return false; + + $lower = strtolower($color); + if (isset($colors[$lower])) return $colors[$lower]; + + if (strpos($color, 'rgb(') !== false) { + // rgb literal handling + $length = strlen($color); + if (strpos($color, ')') !== $length - 1) return false; + $triad = substr($color, 4, $length - 4 - 1); + $parts = explode(',', $triad); + if (count($parts) !== 3) return false; + $type = false; // to ensure that they're all the same type + $new_parts = array(); + foreach ($parts as $part) { + $part = trim($part); + if ($part === '') return false; + $length = strlen($part); + if ($part[$length - 1] === '%') { + // handle percents + if (!$type) { + $type = 'percentage'; + } elseif ($type !== 'percentage') { + return false; + } + $num = (float) substr($part, 0, $length - 1); + if ($num < 0) $num = 0; + if ($num > 100) $num = 100; + $new_parts[] = "$num%"; + } else { + // handle integers + if (!$type) { + $type = 'integer'; + } elseif ($type !== 'integer') { + return false; + } + $num = (int) $part; + if ($num < 0) $num = 0; + if ($num > 255) $num = 255; + $new_parts[] = (string) $num; + } + } + $new_triad = implode(',', $new_parts); + $color = "rgb($new_triad)"; + } else { + // hexadecimal handling + if ($color[0] === '#') { + $hex = substr($color, 1); + } else { + $hex = $color; + $color = '#' . $color; + } + $length = strlen($hex); + if ($length !== 3 && $length !== 6) return false; + if (!ctype_xdigit($hex)) return false; + } + + return $color; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Composite.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Composite.php new file mode 100644 index 0000000..7d51b1e --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Composite.php @@ -0,0 +1,37 @@ +defs = $defs; + } + + public function validate($string, $config, $context) { + foreach ($this->defs as $i => $def) { + $result = $this->defs[$i]->validate($string, $config, $context); + if ($result !== false) return $result; + } + return false; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php new file mode 100644 index 0000000..994aef2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php @@ -0,0 +1,26 @@ +def = $def; + $this->element = $element; + } + /** + * Checks if CurrentToken is set and equal to $this->element + */ + public function validate($string, $config, $context) { + $token = $context->get('CurrentToken', true); + if ($token && $token->name == $this->element) return false; + return $this->def->validate($string, $config, $context); + } +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Filter.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Filter.php new file mode 100644 index 0000000..03fa055 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Filter.php @@ -0,0 +1,52 @@ +intValidator = new HTMLPurifier_AttrDef_Integer(); + } + + public function validate($value, $config, $context) { + $value = $this->parseCDATA($value); + if ($value === 'none') return $value; + // if we looped this we could support multiple filters + $function_length = strcspn($value, '('); + $function = trim(substr($value, 0, $function_length)); + if ($function !== 'alpha' && + $function !== 'Alpha' && + $function !== 'progid:DXImageTransform.Microsoft.Alpha' + ) return false; + $cursor = $function_length + 1; + $parameters_length = strcspn($value, ')', $cursor); + $parameters = substr($value, $cursor, $parameters_length); + $params = explode(',', $parameters); + $ret_params = array(); + $lookup = array(); + foreach ($params as $param) { + list($key, $value) = explode('=', $param); + $key = trim($key); + $value = trim($value); + if (isset($lookup[$key])) continue; + if ($key !== 'opacity') continue; + $value = $this->intValidator->validate($value, $config, $context); + if ($value === false) continue; + $int = (int) $value; + if ($int > 100) $value = '100'; + if ($int < 0) $value = '0'; + $ret_params[] = "$key=$value"; + $lookup[$key] = true; + } + $ret_parameters = implode(',', $ret_params); + $ret_function = "$function($ret_parameters)"; + return $ret_function; + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Font.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Font.php new file mode 100644 index 0000000..449ffc2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Font.php @@ -0,0 +1,148 @@ +getCSSDefinition(); + $this->info['font-style'] = $def->info['font-style']; + $this->info['font-variant'] = $def->info['font-variant']; + $this->info['font-weight'] = $def->info['font-weight']; + $this->info['font-size'] = $def->info['font-size']; + $this->info['line-height'] = $def->info['line-height']; + $this->info['font-family'] = $def->info['font-family']; + } + + public function validate($string, $config, $context) { + + static $system_fonts = array( + 'caption' => true, + 'icon' => true, + 'menu' => true, + 'message-box' => true, + 'small-caption' => true, + 'status-bar' => true + ); + + // regular pre-processing + $string = $this->parseCDATA($string); + if ($string === '') return false; + + // check if it's one of the keywords + $lowercase_string = strtolower($string); + if (isset($system_fonts[$lowercase_string])) { + return $lowercase_string; + } + + $bits = explode(' ', $string); // bits to process + $stage = 0; // this indicates what we're looking for + $caught = array(); // which stage 0 properties have we caught? + $stage_1 = array('font-style', 'font-variant', 'font-weight'); + $final = ''; // output + + for ($i = 0, $size = count($bits); $i < $size; $i++) { + if ($bits[$i] === '') continue; + switch ($stage) { + + // attempting to catch font-style, font-variant or font-weight + case 0: + foreach ($stage_1 as $validator_name) { + if (isset($caught[$validator_name])) continue; + $r = $this->info[$validator_name]->validate( + $bits[$i], $config, $context); + if ($r !== false) { + $final .= $r . ' '; + $caught[$validator_name] = true; + break; + } + } + // all three caught, continue on + if (count($caught) >= 3) $stage = 1; + if ($r !== false) break; + + // attempting to catch font-size and perhaps line-height + case 1: + $found_slash = false; + if (strpos($bits[$i], '/') !== false) { + list($font_size, $line_height) = + explode('/', $bits[$i]); + if ($line_height === '') { + // ooh, there's a space after the slash! + $line_height = false; + $found_slash = true; + } + } else { + $font_size = $bits[$i]; + $line_height = false; + } + $r = $this->info['font-size']->validate( + $font_size, $config, $context); + if ($r !== false) { + $final .= $r; + // attempt to catch line-height + if ($line_height === false) { + // we need to scroll forward + for ($j = $i + 1; $j < $size; $j++) { + if ($bits[$j] === '') continue; + if ($bits[$j] === '/') { + if ($found_slash) { + return false; + } else { + $found_slash = true; + continue; + } + } + $line_height = $bits[$j]; + break; + } + } else { + // slash already found + $found_slash = true; + $j = $i; + } + if ($found_slash) { + $i = $j; + $r = $this->info['line-height']->validate( + $line_height, $config, $context); + if ($r !== false) { + $final .= '/' . $r; + } + } + $final .= ' '; + $stage = 2; + break; + } + return false; + + // attempting to catch font-family + case 2: + $font_family = + implode(' ', array_slice($bits, $i, $size - $i)); + $r = $this->info['font-family']->validate( + $font_family, $config, $context); + if ($r !== false) { + $final .= $r . ' '; + // processing completed successfully + return rtrim($final); + } + return false; + } + } + return false; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php new file mode 100644 index 0000000..304f963 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php @@ -0,0 +1,89 @@ + true, + 'sans-serif' => true, + 'monospace' => true, + 'fantasy' => true, + 'cursive' => true + ); + + // assume that no font names contain commas in them + $fonts = explode(',', $string); + $final = ''; + foreach($fonts as $font) { + $font = trim($font); + if ($font === '') continue; + // match a generic name + if (isset($generic_names[$font])) { + $final .= $font . ', '; + continue; + } + // match a quoted name + if ($font[0] === '"' || $font[0] === "'") { + $length = strlen($font); + if ($length <= 2) continue; + $quote = $font[0]; + if ($font[$length - 1] !== $quote) continue; + $font = substr($font, 1, $length - 2); + + $new_font = ''; + for ($i = 0, $c = strlen($font); $i < $c; $i++) { + if ($font[$i] === '\\') { + $i++; + if ($i >= $c) { + $new_font .= '\\'; + break; + } + if (ctype_xdigit($font[$i])) { + $code = $font[$i]; + for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) { + if (!ctype_xdigit($font[$i])) break; + $code .= $font[$i]; + } + // We have to be extremely careful when adding + // new characters, to make sure we're not breaking + // the encoding. + $char = HTMLPurifier_Encoder::unichr(hexdec($code)); + if (HTMLPurifier_Encoder::cleanUTF8($char) === '') continue; + $new_font .= $char; + if ($i < $c && trim($font[$i]) !== '') $i--; + continue; + } + if ($font[$i] === "\n") continue; + } + $new_font .= $font[$i]; + } + + $font = $new_font; + } + // $font is a pure representation of the font name + + if (ctype_alnum($font) && $font !== '') { + // very simple font, allow it in unharmed + $final .= $font . ', '; + continue; + } + + // complicated font, requires quoting + + // armor single quotes and new lines + $font = str_replace("\\", "\\\\", $font); + $font = str_replace("'", "\\'", $font); + $final .= "'$font', "; + } + $final = rtrim($final, ', '); + if ($final === '') return false; + return $final; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php new file mode 100644 index 0000000..d89fb8f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php @@ -0,0 +1,38 @@ +def = $def; + $this->allow = $allow; + } + /** + * Intercepts and removes !important if necessary + */ + public function validate($string, $config, $context) { + // test for ! and important tokens + $string = trim($string); + $is_important = false; + // :TODO: optimization: test directly for !important and ! important + if (strlen($string) >= 9 && substr($string, -9) === 'important') { + $temp = rtrim(substr($string, 0, -9)); + // use a temp, because we might want to restore important + if (strlen($temp) >= 1 && substr($temp, -1) === '!') { + $string = rtrim(substr($temp, 0, -1)); + $is_important = true; + } + } + $string = $this->def->validate($string, $config, $context); + if ($this->allow && $is_important) $string .= ' !important'; + return $string; + } +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Length.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Length.php new file mode 100644 index 0000000..6f221b3 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Length.php @@ -0,0 +1,46 @@ +min = $min !== null ? HTMLPurifier_Length::make($min) : null; + $this->max = $max !== null ? HTMLPurifier_Length::make($max) : null; + } + + public function validate($string, $config, $context) { + $string = $this->parseCDATA($string); + + // Optimizations + if ($string === '') return false; + if ($string === '0') return '0'; + if (strlen($string) === 1) return false; + + $length = HTMLPurifier_Length::make($string); + if (!$length->isValid()) return false; + + if ($this->min) { + $c = $length->compareTo($this->min); + if ($c === false) return false; + if ($c < 0) return false; + } + if ($this->max) { + $c = $length->compareTo($this->max); + if ($c === false) return false; + if ($c > 0) return false; + } + + return $length->toString(); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php new file mode 100644 index 0000000..253a7a5 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php @@ -0,0 +1,77 @@ +getCSSDefinition(); + $this->info['list-style-type'] = $def->info['list-style-type']; + $this->info['list-style-position'] = $def->info['list-style-position']; + $this->info['list-style-image'] = $def->info['list-style-image']; + } + + public function validate($string, $config, $context) { + + // regular pre-processing + $string = $this->parseCDATA($string); + if ($string === '') return false; + + // assumes URI doesn't have spaces in it + $bits = explode(' ', strtolower($string)); // bits to process + + $caught = array(); + $caught['type'] = false; + $caught['position'] = false; + $caught['image'] = false; + + $i = 0; // number of catches + $none = false; + + foreach ($bits as $bit) { + if ($i >= 3) return; // optimization bit + if ($bit === '') continue; + foreach ($caught as $key => $status) { + if ($status !== false) continue; + $r = $this->info['list-style-' . $key]->validate($bit, $config, $context); + if ($r === false) continue; + if ($r === 'none') { + if ($none) continue; + else $none = true; + if ($key == 'image') continue; + } + $caught[$key] = $r; + $i++; + break; + } + } + + if (!$i) return false; + + $ret = array(); + + // construct type + if ($caught['type']) $ret[] = $caught['type']; + + // construct image + if ($caught['image']) $ret[] = $caught['image']; + + // construct position + if ($caught['position']) $ret[] = $caught['position']; + + if (empty($ret)) return false; + return implode(' ', $ret); + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Multiple.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Multiple.php new file mode 100644 index 0000000..63b2fa1 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Multiple.php @@ -0,0 +1,57 @@ +single = $single; + $this->max = $max; + } + + public function validate($string, $config, $context) { + $string = $this->parseCDATA($string); + if ($string === '') return false; + $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n + $length = count($parts); + $final = ''; + for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) { + if (ctype_space($parts[$i])) continue; + $result = $this->single->validate($parts[$i], $config, $context); + if ($result !== false) { + $final .= $result . ' '; + $num++; + } + } + if ($final === '') return false; + return rtrim($final); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Number.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Number.php new file mode 100644 index 0000000..d471141 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Number.php @@ -0,0 +1,68 @@ +non_negative = $non_negative; + } + + /** + * @warning Some contexts do not pass $config, $context. These + * variables should not be used without checking HTMLPurifier_Length + */ + public function validate($number, $config, $context) { + + $number = $this->parseCDATA($number); + + if ($number === '') return false; + if ($number === '0') return '0'; + + $sign = ''; + switch ($number[0]) { + case '-': + if ($this->non_negative) return false; + $sign = '-'; + case '+': + $number = substr($number, 1); + } + + if (ctype_digit($number)) { + $number = ltrim($number, '0'); + return $number ? $sign . $number : '0'; + } + + // Period is the only non-numeric character allowed + if (strpos($number, '.') === false) return false; + + list($left, $right) = explode('.', $number, 2); + + if ($left === '' && $right === '') return false; + if ($left !== '' && !ctype_digit($left)) return false; + + $left = ltrim($left, '0'); + $right = rtrim($right, '0'); + + if ($right === '') { + return $left ? $sign . $left : '0'; + } elseif (!ctype_digit($right)) { + return false; + } + + return $sign . $left . '.' . $right; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Percentage.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Percentage.php new file mode 100644 index 0000000..bd727e1 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/Percentage.php @@ -0,0 +1,39 @@ +number_def = new HTMLPurifier_AttrDef_CSS_Number($non_negative); + } + + public function validate($string, $config, $context) { + + $string = $this->parseCDATA($string); + + if ($string === '') return false; + $length = strlen($string); + if ($length === 1) return false; + if ($string[$length - 1] !== '%') return false; + + $number = substr($string, 0, $length - 1); + $number = $this->number_def->validate($number, $config, $context); + + if ($number === false) return false; + return "$number%"; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php new file mode 100644 index 0000000..1f46c6b --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php @@ -0,0 +1,37 @@ + true, + 'overline' => true, + 'underline' => true, + ); + + $string = strtolower($this->parseCDATA($string)); + + if ($string === 'none') return $string; + + $parts = explode(' ', $string); + $final = ''; + foreach ($parts as $part) { + if (isset($allowed_values[$part])) { + $final .= $part . ' '; + } + } + $final = rtrim($final); + if ($final === '') return false; + return $final; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/URI.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/URI.php new file mode 100644 index 0000000..95f24d0 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/CSS/URI.php @@ -0,0 +1,55 @@ +parseCDATA($uri_string); + if (strpos($uri_string, 'url(') !== 0) return false; + $uri_string = substr($uri_string, 4); + $new_length = strlen($uri_string) - 1; + if ($uri_string[$new_length] != ')') return false; + $uri = trim(substr($uri_string, 0, $new_length)); + + if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) { + $quote = $uri[0]; + $new_length = strlen($uri) - 1; + if ($uri[$new_length] !== $quote) return false; + $uri = substr($uri, 1, $new_length - 1); + } + + $keys = array( '(', ')', ',', ' ', '"', "'"); + $values = array('\\(', '\\)', '\\,', '\\ ', '\\"', "\\'"); + $uri = str_replace($values, $keys, $uri); + + $result = parent::validate($uri, $config, $context); + + if ($result === false) return false; + + // escape necessary characters according to CSS spec + // except for the comma, none of these should appear in the + // URI at all + $result = str_replace($keys, $values, $result); + + return "url($result)"; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Enum.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Enum.php new file mode 100644 index 0000000..7e3b558 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Enum.php @@ -0,0 +1,64 @@ +valid_values = array_flip($valid_values); + $this->case_sensitive = $case_sensitive; + } + + public function validate($string, $config, $context) { + $string = trim($string); + if (!$this->case_sensitive) { + // we may want to do full case-insensitive libraries + $string = ctype_lower($string) ? $string : strtolower($string); + } + $result = isset($this->valid_values[$string]); + + return $result ? $string : false; + } + + /** + * @param $string In form of comma-delimited list of case-insensitive + * valid values. Example: "foo,bar,baz". Prepend "s:" to make + * case sensitive + */ + public function make($string) { + if (strlen($string) > 2 && $string[0] == 's' && $string[1] == ':') { + $string = substr($string, 2); + $sensitive = true; + } else { + $sensitive = false; + } + $values = explode(',', $string); + return new HTMLPurifier_AttrDef_Enum($values, $sensitive); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Bool.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Bool.php new file mode 100644 index 0000000..7194b8a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Bool.php @@ -0,0 +1,27 @@ +name = $name;} + + public function validate($string, $config, $context) { + if (empty($string)) return false; + return $this->name; + } + + /** + * @param $string Name of attribute + */ + public function make($string) { + return new HTMLPurifier_AttrDef_HTML_Bool($string); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Color.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Color.php new file mode 100644 index 0000000..07f6637 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Color.php @@ -0,0 +1,31 @@ +get('Core', 'ColorKeywords'); + + $string = trim($string); + + if (empty($string)) return false; + if (isset($colors[$string])) return $colors[$string]; + if ($string[0] === '#') $hex = substr($string, 1); + else $hex = $string; + + $length = strlen($hex); + if ($length !== 3 && $length !== 6) return false; + if (!ctype_xdigit($hex)) return false; + if ($length === 3) $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2]; + + return "#$hex"; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php new file mode 100644 index 0000000..1f16a87 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php @@ -0,0 +1,20 @@ +valid_values === false) $this->valid_values = $config->get('Attr', 'AllowedFrameTargets'); + return parent::validate($string, $config, $context); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/ID.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/ID.php new file mode 100644 index 0000000..697b2aa --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/ID.php @@ -0,0 +1,69 @@ +get('Attr', 'EnableID')) return false; + + $id = trim($id); // trim it first + + if ($id === '') return false; + + $prefix = $config->get('Attr', 'IDPrefix'); + if ($prefix !== '') { + $prefix .= $config->get('Attr', 'IDPrefixLocal'); + // prevent re-appending the prefix + if (strpos($id, $prefix) !== 0) $id = $prefix . $id; + } elseif ($config->get('Attr', 'IDPrefixLocal') !== '') { + trigger_error('%Attr.IDPrefixLocal cannot be used unless '. + '%Attr.IDPrefix is set', E_USER_WARNING); + } + + //if (!$this->ref) { + $id_accumulator =& $context->get('IDAccumulator'); + if (isset($id_accumulator->ids[$id])) return false; + //} + + // we purposely avoid using regex, hopefully this is faster + + if (ctype_alpha($id)) { + $result = true; + } else { + if (!ctype_alpha(@$id[0])) return false; + $trim = trim( // primitive style of regexps, I suppose + $id, + 'A..Za..z0..9:-._' + ); + $result = ($trim === ''); + } + + $regexp = $config->get('Attr', 'IDBlacklistRegexp'); + if ($regexp && preg_match($regexp, $id)) { + return false; + } + + if (/*!$this->ref && */$result) $id_accumulator->add($id); + + // if no change was made to the ID, return the result + // else, return the new id if stripping whitespace made it + // valid, or return false. + return $result ? $id : false; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Length.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Length.php new file mode 100644 index 0000000..827373a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/Length.php @@ -0,0 +1,40 @@ + 100) return '100%'; + + return ((string) $points) . '%'; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php new file mode 100644 index 0000000..15eec0f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php @@ -0,0 +1,52 @@ + 'AllowedRel', + 'rev' => 'AllowedRev' + ); + if (!isset($configLookup[$name])) { + trigger_error('Unrecognized attribute name for link '. + 'relationship.', E_USER_ERROR); + return; + } + $this->name = $configLookup[$name]; + } + + public function validate($string, $config, $context) { + + $allowed = $config->get('Attr', $this->name); + if (empty($allowed)) return false; + + $string = $this->parseCDATA($string); + $parts = explode(' ', $string); + + // lookup to prevent duplicates + $ret_lookup = array(); + foreach ($parts as $part) { + $part = strtolower(trim($part)); + if (!isset($allowed[$part])) continue; + $ret_lookup[$part] = true; + } + + if (empty($ret_lookup)) return false; + $string = implode(' ', array_keys($ret_lookup)); + + return $string; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php new file mode 100644 index 0000000..acda4da --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php @@ -0,0 +1,40 @@ +max = $max; + } + + public function validate($string, $config, $context) { + + $string = trim($string); + if ($string === '0') return $string; + if ($string === '') return false; + $length = strlen($string); + if (substr($string, $length - 2) == 'px') { + $string = substr($string, 0, $length - 2); + } + if (!is_numeric($string)) return false; + $int = (int) $string; + + if ($int < 0) return '0'; + + // upper-bound value, extremely high values can + // crash operating systems, see + // WARNING, above link WILL crash you if you're using Windows + + if ($this->max !== null && $int > $this->max) return (string) $this->max; + + return (string) $int; + + } + + public function make($string) { + if ($string === '') $max = null; + else $max = (int) $string; + $class = get_class($this); + return new $class($max); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Integer.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Integer.php new file mode 100644 index 0000000..260e444 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Integer.php @@ -0,0 +1,72 @@ +negative = $negative; + $this->zero = $zero; + $this->positive = $positive; + } + + public function validate($integer, $config, $context) { + + $integer = $this->parseCDATA($integer); + if ($integer === '') return false; + + // we could possibly simply typecast it to integer, but there are + // certain fringe cases that must not return an integer. + + // clip leading sign + if ( $this->negative && $integer[0] === '-' ) { + $digits = substr($integer, 1); + if ($digits === '0') $integer = '0'; // rm minus sign for zero + } elseif( $this->positive && $integer[0] === '+' ) { + $digits = $integer = substr($integer, 1); // rm unnecessary plus + } else { + $digits = $integer; + } + + // test if it's numeric + if (!ctype_digit($digits)) return false; + + // perform scope tests + if (!$this->zero && $integer == 0) return false; + if (!$this->positive && $integer > 0) return false; + if (!$this->negative && $integer < 0) return false; + + return $integer; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Lang.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Lang.php new file mode 100644 index 0000000..bc46bfb --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Lang.php @@ -0,0 +1,72 @@ + 8 || !ctype_alnum($subtags[1])) { + return $new_string; + } + if (!ctype_lower($subtags[1])) $subtags[1] = strtolower($subtags[1]); + + $new_string .= '-' . $subtags[1]; + if ($num_subtags == 2) return $new_string; + + // process all other subtags, index 2 and up + for ($i = 2; $i < $num_subtags; $i++) { + $length = strlen($subtags[$i]); + if ($length == 0 || $length > 8 || !ctype_alnum($subtags[$i])) { + return $new_string; + } + if (!ctype_lower($subtags[$i])) { + $subtags[$i] = strtolower($subtags[$i]); + } + $new_string .= '-' . $subtags[$i]; + } + + return $new_string; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Switch.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Switch.php new file mode 100644 index 0000000..b8b41c2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Switch.php @@ -0,0 +1,32 @@ +tag = $tag; + $this->withTag = $with_tag; + $this->withoutTag = $without_tag; + } + + public function validate($string, $config, $context) { + $token = $context->get('CurrentToken', true); + if (!$token || $token->name !== $this->tag) { + return $this->withoutTag->validate($string, $config, $context); + } else { + return $this->withTag->validate($string, $config, $context); + } + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Text.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Text.php new file mode 100644 index 0000000..85b5d90 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/Text.php @@ -0,0 +1,14 @@ +parseCDATA($string); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI.php new file mode 100644 index 0000000..f63b543 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI.php @@ -0,0 +1,77 @@ +parser = new HTMLPurifier_URIParser(); + $this->embedsResource = (bool) $embeds_resource; + } + + public function make($string) { + $embeds = (bool) $string; + return new HTMLPurifier_AttrDef_URI($embeds); + } + + public function validate($uri, $config, $context) { + + if ($config->get('URI', 'Disable')) return false; + + $uri = $this->parseCDATA($uri); + + // parse the URI + $uri = $this->parser->parse($uri); + if ($uri === false) return false; + + // add embedded flag to context for validators + $context->register('EmbeddedURI', $this->embedsResource); + + $ok = false; + do { + + // generic validation + $result = $uri->validate($config, $context); + if (!$result) break; + + // chained filtering + $uri_def = $config->getDefinition('URI'); + $result = $uri_def->filter($uri, $config, $context); + if (!$result) break; + + // scheme-specific validation + $scheme_obj = $uri->getSchemeObj($config, $context); + if (!$scheme_obj) break; + if ($this->embedsResource && !$scheme_obj->browsable) break; + $result = $scheme_obj->validate($uri, $config, $context); + if (!$result) break; + + // Post chained filtering + $result = $uri_def->postFilter($uri, $config, $context); + if (!$result) break; + + // survived gauntlet + $ok = true; + + } while (false); + + $context->destroy('EmbeddedURI'); + if (!$ok) return false; + + // back to string + return $uri->toString(); + + } + +} + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Email.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Email.php new file mode 100644 index 0000000..ecfd51c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Email.php @@ -0,0 +1,15 @@ +" + // that needs more percent encoding to be done + if ($string == '') return false; + $string = trim($string); + $result = preg_match('/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i', $string); + return $result ? $string : false; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Host.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Host.php new file mode 100644 index 0000000..9ffa6db --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/Host.php @@ -0,0 +1,61 @@ +ipv4 = new HTMLPurifier_AttrDef_URI_IPv4(); + $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6(); + } + + public function validate($string, $config, $context) { + $length = strlen($string); + if ($string === '') return ''; + if ($length > 1 && $string[0] === '[' && $string[$length-1] === ']') { + //IPv6 + $ip = substr($string, 1, $length - 2); + $valid = $this->ipv6->validate($ip, $config, $context); + if ($valid === false) return false; + return '['. $valid . ']'; + } + + // need to do checks on unusual encodings too + $ipv4 = $this->ipv4->validate($string, $config, $context); + if ($ipv4 !== false) return $ipv4; + + // A regular domain name. + + // This breaks I18N domain names, but we don't have proper IRI support, + // so force users to insert Punycode. If there's complaining we'll + // try to fix things into an international friendly form. + + // The productions describing this are: + $a = '[a-z]'; // alpha + $an = '[a-z0-9]'; // alphanum + $and = '[a-z0-9-]'; // alphanum | "-" + // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum + $domainlabel = "$an($and*$an)?"; + // toplabel = alpha | alpha *( alphanum | "-" ) alphanum + $toplabel = "$a($and*$an)?"; + // hostname = *( domainlabel "." ) toplabel [ "." ] + $match = preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string); + if (!$match) return false; + + return $string; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/IPv4.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/IPv4.php new file mode 100644 index 0000000..080dc73 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/IPv4.php @@ -0,0 +1,38 @@ +ip4) $this->_loadRegex(); + + if (preg_match('#^' . $this->ip4 . '$#s', $aIP)) + { + return $aIP; + } + + return false; + + } + + /** + * Lazy load function to prevent regex from being stuffed in + * cache. + */ + protected function _loadRegex() { + $oct = '(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])'; // 0-255 + $this->ip4 = "(?:{$oct}\\.{$oct}\\.{$oct}\\.{$oct})"; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/IPv6.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/IPv6.php new file mode 100644 index 0000000..a13f01e --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrDef/URI/IPv6.php @@ -0,0 +1,98 @@ +ip4) $this->_loadRegex(); + + $original = $aIP; + + $hex = '[0-9a-fA-F]'; + $blk = '(?:' . $hex . '{1,4})'; + $pre = '(?:/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))'; // /0 - /128 + + // prefix check + if (strpos($aIP, '/') !== false) + { + if (preg_match('#' . $pre . '$#s', $aIP, $find)) + { + $aIP = substr($aIP, 0, 0-strlen($find[0])); + unset($find); + } + else + { + return false; + } + } + + // IPv4-compatiblity check + if (preg_match('#(?<=:'.')' . $this->ip4 . '$#s', $aIP, $find)) + { + $aIP = substr($aIP, 0, 0-strlen($find[0])); + $ip = explode('.', $find[0]); + $ip = array_map('dechex', $ip); + $aIP .= $ip[0] . $ip[1] . ':' . $ip[2] . $ip[3]; + unset($find, $ip); + } + + // compression check + $aIP = explode('::', $aIP); + $c = count($aIP); + if ($c > 2) + { + return false; + } + elseif ($c == 2) + { + list($first, $second) = $aIP; + $first = explode(':', $first); + $second = explode(':', $second); + + if (count($first) + count($second) > 8) + { + return false; + } + + while(count($first) < 8) + { + array_push($first, '0'); + } + + array_splice($first, 8 - count($second), 8, $second); + $aIP = $first; + unset($first,$second); + } + else + { + $aIP = explode(':', $aIP[0]); + } + $c = count($aIP); + + if ($c != 8) + { + return false; + } + + // All the pieces should be 16-bit hex strings. Are they? + foreach ($aIP as $piece) + { + if (!preg_match('#^[0-9a-fA-F]{4}$#s', sprintf('%04s', $piece))) + { + return false; + } + } + + return $original; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform.php new file mode 100644 index 0000000..b3de9d7 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform.php @@ -0,0 +1,55 @@ +confiscateAttr($attr, 'background'); + // some validation should happen here + + $this->prependCSS($attr, "background-image:url($background);"); + + return $attr; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BdoDir.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BdoDir.php new file mode 100644 index 0000000..a9f8dc2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BdoDir.php @@ -0,0 +1,18 @@ +get('Attr', 'DefaultTextDir'); + return $attr; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BgColor.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BgColor.php new file mode 100644 index 0000000..ce416da --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BgColor.php @@ -0,0 +1,22 @@ +confiscateAttr($attr, 'bgcolor'); + // some validation should happen here + + $this->prependCSS($attr, "background-color:$bgcolor;"); + + return $attr; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BoolToCSS.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BoolToCSS.php new file mode 100644 index 0000000..8f18c88 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/BoolToCSS.php @@ -0,0 +1,35 @@ +attr = $attr; + $this->css = $css; + } + + public function transform($attr, $config, $context) { + if (!isset($attr[$this->attr])) return $attr; + unset($attr[$this->attr]); + $this->prependCSS($attr, $this->css); + return $attr; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Border.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Border.php new file mode 100644 index 0000000..529d185 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Border.php @@ -0,0 +1,17 @@ +confiscateAttr($attr, 'border'); + // some validation should happen here + $this->prependCSS($attr, "border:{$border_width}px solid;"); + return $attr; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/EnumToCSS.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/EnumToCSS.php new file mode 100644 index 0000000..83f55a4 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/EnumToCSS.php @@ -0,0 +1,57 @@ +attr = $attr; + $this->enumToCSS = $enum_to_css; + $this->caseSensitive = (bool) $case_sensitive; + } + + public function transform($attr, $config, $context) { + + if (!isset($attr[$this->attr])) return $attr; + + $value = trim($attr[$this->attr]); + unset($attr[$this->attr]); + + if (!$this->caseSensitive) $value = strtolower($value); + + if (!isset($this->enumToCSS[$value])) { + return $attr; + } + + $this->prependCSS($attr, $this->enumToCSS[$value]); + + return $attr; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ImgRequired.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ImgRequired.php new file mode 100644 index 0000000..dc65037 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ImgRequired.php @@ -0,0 +1,41 @@ +get('Core', 'RemoveInvalidImg')) return $attr; + $attr['src'] = $config->get('Attr', 'DefaultInvalidImage'); + $src = false; + } + + if (!isset($attr['alt'])) { + if ($src) { + $alt = $config->get('Attr', 'DefaultImageAlt'); + if ($alt === null) { + $attr['alt'] = basename($attr['src']); + } else { + $attr['alt'] = $alt; + } + } else { + $attr['alt'] = $config->get('Attr', 'DefaultInvalidImageAlt'); + } + } + + return $attr; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ImgSpace.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ImgSpace.php new file mode 100644 index 0000000..b017b94 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ImgSpace.php @@ -0,0 +1,43 @@ + array('left', 'right'), + 'vspace' => array('top', 'bottom') + ); + + public function __construct($attr) { + $this->attr = $attr; + if (!isset($this->css[$attr])) { + trigger_error(htmlspecialchars($attr) . ' is not valid space attribute'); + } + } + + public function transform($attr, $config, $context) { + + if (!isset($attr[$this->attr])) return $attr; + + $width = $this->confiscateAttr($attr, $this->attr); + // some validation could happen here + + if (!isset($this->css[$this->attr])) return $attr; + + $style = ''; + foreach ($this->css[$this->attr] as $suffix) { + $property = "margin-$suffix"; + $style .= "$property:{$width}px;"; + } + + $this->prependCSS($attr, $style); + + return $attr; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Input.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Input.php new file mode 100644 index 0000000..738d904 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Input.php @@ -0,0 +1,39 @@ +pixels = new HTMLPurifier_AttrDef_HTML_Pixels(); + } + + public function transform($attr, $config, $context) { + if (!isset($attr['type'])) $t = 'text'; + else $t = strtolower($attr['type']); + if (isset($attr['checked']) && $t !== 'radio' && $t !== 'checkbox') { + unset($attr['checked']); + } + if (isset($attr['maxlength']) && $t !== 'text' && $t !== 'password') { + unset($attr['maxlength']); + } + if (isset($attr['size']) && $t !== 'text' && $t !== 'password') { + $result = $this->pixels->validate($attr['size'], $config, $context); + if ($result === false) unset($attr['size']); + else $attr['size'] = $result; + } + if (isset($attr['src']) && $t !== 'image') { + unset($attr['src']); + } + if (!isset($attr['value']) && ($t === 'radio' || $t === 'checkbox')) { + $attr['value'] = ''; + } + return $attr; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Lang.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Lang.php new file mode 100644 index 0000000..683621f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Lang.php @@ -0,0 +1,27 @@ +name = $name; + $this->cssName = $css_name ? $css_name : $name; + } + + public function transform($attr, $config, $context) { + if (!isset($attr[$this->name])) return $attr; + $length = $this->confiscateAttr($attr, $this->name); + if(ctype_digit($length)) $length .= 'px'; + $this->prependCSS($attr, $this->cssName . ":$length;"); + return $attr; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Name.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Name.php new file mode 100644 index 0000000..0fa5701 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Name.php @@ -0,0 +1,18 @@ +confiscateAttr($attr, 'name'); + if ( isset($attr['id'])) return $attr; + $attr['id'] = $id; + return $attr; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/SafeEmbed.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/SafeEmbed.php new file mode 100644 index 0000000..b73f658 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/SafeEmbed.php @@ -0,0 +1,13 @@ +uri = new HTMLPurifier_AttrDef_URI(true); // embedded + } + + public function transform($attr, $config, $context) { + // If we add support for other objects, we'll need to alter the + // transforms. + switch ($attr['name']) { + // application/x-shockwave-flash + // Keep this synchronized with Injector/SafeObject.php + case 'allowScriptAccess': + $attr['value'] = 'never'; + break; + case 'allowNetworking': + $attr['value'] = 'internal'; + break; + case 'wmode': + $attr['value'] = 'window'; + break; + case 'movie': + $attr['value'] = $this->uri->validate($attr['value'], $config, $context); + break; + // add other cases to support other param name/value pairs + default: + $attr['name'] = $attr['value'] = null; + } + return $attr; + } +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ScriptRequired.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ScriptRequired.php new file mode 100644 index 0000000..5bfcc7a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/ScriptRequired.php @@ -0,0 +1,14 @@ + + */ +class HTMLPurifier_AttrTransform_ScriptRequired extends HTMLPurifier_AttrTransform +{ + public function transform($attr, $config, $context) { + if (!isset($attr['type'])) { + $attr['type'] = 'text/javascript'; + } + return $attr; + } +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Textarea.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Textarea.php new file mode 100644 index 0000000..7fe064b --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTransform/Textarea.php @@ -0,0 +1,16 @@ + + */ +class HTMLPurifier_AttrTransform_Textarea extends HTMLPurifier_AttrTransform +{ + + public function transform($attr, $config, $context) { + // Calculated from Firefox + if (!isset($attr['cols'])) $attr['cols'] = '22'; + if (!isset($attr['rows'])) $attr['rows'] = '3'; + return $attr; + } + +} \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTypes.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTypes.php new file mode 100644 index 0000000..62841f0 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrTypes.php @@ -0,0 +1,74 @@ +info['Enum'] = new HTMLPurifier_AttrDef_Enum(); + $this->info['Bool'] = new HTMLPurifier_AttrDef_HTML_Bool(); + + $this->info['CDATA'] = new HTMLPurifier_AttrDef_Text(); + $this->info['ID'] = new HTMLPurifier_AttrDef_HTML_ID(); + $this->info['Length'] = new HTMLPurifier_AttrDef_HTML_Length(); + $this->info['MultiLength'] = new HTMLPurifier_AttrDef_HTML_MultiLength(); + $this->info['NMTOKENS'] = new HTMLPurifier_AttrDef_HTML_Nmtokens(); + $this->info['Pixels'] = new HTMLPurifier_AttrDef_HTML_Pixels(); + $this->info['Text'] = new HTMLPurifier_AttrDef_Text(); + $this->info['URI'] = new HTMLPurifier_AttrDef_URI(); + $this->info['LanguageCode'] = new HTMLPurifier_AttrDef_Lang(); + $this->info['Color'] = new HTMLPurifier_AttrDef_HTML_Color(); + + // unimplemented aliases + $this->info['ContentType'] = new HTMLPurifier_AttrDef_Text(); + $this->info['ContentTypes'] = new HTMLPurifier_AttrDef_Text(); + $this->info['Charsets'] = new HTMLPurifier_AttrDef_Text(); + $this->info['Character'] = new HTMLPurifier_AttrDef_Text(); + + // number is really a positive integer (one or more digits) + // FIXME: ^^ not always, see start and value of list items + $this->info['Number'] = new HTMLPurifier_AttrDef_Integer(false, false, true); + } + + /** + * Retrieves a type + * @param $type String type name + * @return Object AttrDef for type + */ + public function get($type) { + + // determine if there is any extra info tacked on + if (strpos($type, '#') !== false) list($type, $string) = explode('#', $type, 2); + else $string = ''; + + if (!isset($this->info[$type])) { + trigger_error('Cannot retrieve undefined attribute type ' . $type, E_USER_ERROR); + return; + } + + return $this->info[$type]->make($string); + + } + + /** + * Sets a new implementation for a type + * @param $type String type name + * @param $impl Object AttrDef for type + */ + public function set($type, $impl) { + $this->info[$type] = $impl; + } +} + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrValidator.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrValidator.php new file mode 100644 index 0000000..6b165c7 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/AttrValidator.php @@ -0,0 +1,161 @@ +getHTMLDefinition(); + $e =& $context->get('ErrorCollector', true); + + // initialize IDAccumulator if necessary + $ok =& $context->get('IDAccumulator', true); + if (!$ok) { + $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); + $context->register('IDAccumulator', $id_accumulator); + } + + // initialize CurrentToken if necessary + $current_token =& $context->get('CurrentToken', true); + if (!$current_token) $context->register('CurrentToken', $token); + + if ( + !$token instanceof HTMLPurifier_Token_Start && + !$token instanceof HTMLPurifier_Token_Empty + ) return $token; + + // create alias to global definition array, see also $defs + // DEFINITION CALL + $d_defs = $definition->info_global_attr; + + // don't update token until the very end, to ensure an atomic update + $attr = $token->attr; + + // do global transformations (pre) + // nothing currently utilizes this + foreach ($definition->info_attr_transform_pre as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + + // do local transformations only applicable to this element (pre) + // ex.

    to

    + foreach ($definition->info[$token->name]->attr_transform_pre as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + + // create alias to this element's attribute definition array, see + // also $d_defs (global attribute definition array) + // DEFINITION CALL + $defs = $definition->info[$token->name]->attr; + + $attr_key = false; + $context->register('CurrentAttr', $attr_key); + + // iterate through all the attribute keypairs + // Watch out for name collisions: $key has previously been used + foreach ($attr as $attr_key => $value) { + + // call the definition + if ( isset($defs[$attr_key]) ) { + // there is a local definition defined + if ($defs[$attr_key] === false) { + // We've explicitly been told not to allow this element. + // This is usually when there's a global definition + // that must be overridden. + // Theoretically speaking, we could have a + // AttrDef_DenyAll, but this is faster! + $result = false; + } else { + // validate according to the element's definition + $result = $defs[$attr_key]->validate( + $value, $config, $context + ); + } + } elseif ( isset($d_defs[$attr_key]) ) { + // there is a global definition defined, validate according + // to the global definition + $result = $d_defs[$attr_key]->validate( + $value, $config, $context + ); + } else { + // system never heard of the attribute? DELETE! + $result = false; + } + + // put the results into effect + if ($result === false || $result === null) { + // this is a generic error message that should replaced + // with more specific ones when possible + if ($e) $e->send(E_ERROR, 'AttrValidator: Attribute removed'); + + // remove the attribute + unset($attr[$attr_key]); + } elseif (is_string($result)) { + // generally, if a substitution is happening, there + // was some sort of implicit correction going on. We'll + // delegate it to the attribute classes to say exactly what. + + // simple substitution + $attr[$attr_key] = $result; + } else { + // nothing happens + } + + // we'd also want slightly more complicated substitution + // involving an array as the return value, + // although we're not sure how colliding attributes would + // resolve (certain ones would be completely overriden, + // others would prepend themselves). + } + + $context->destroy('CurrentAttr'); + + // post transforms + + // global (error reporting untested) + foreach ($definition->info_attr_transform_post as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + + // local (error reporting untested) + foreach ($definition->info[$token->name]->attr_transform_post as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + + $token->attr = $attr; + + // destroy CurrentToken if we made it ourselves + if (!$current_token) $context->destroy('CurrentToken'); + + } + + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Bootstrap.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Bootstrap.php new file mode 100644 index 0000000..f7c3dab --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Bootstrap.php @@ -0,0 +1,96 @@ + +if (!defined('PHP_EOL')) { + switch (strtoupper(substr(PHP_OS, 0, 3))) { + case 'WIN': + define('PHP_EOL', "\r\n"); + break; + case 'DAR': + define('PHP_EOL', "\r"); + break; + default: + define('PHP_EOL', "\n"); + } +} + +/** + * Bootstrap class that contains meta-functionality for HTML Purifier such as + * the autoload function. + * + * @note + * This class may be used without any other files from HTML Purifier. + */ +class HTMLPurifier_Bootstrap +{ + + /** + * Autoload function for HTML Purifier + * @param $class Class to load + */ + public static function autoload($class) { + $file = HTMLPurifier_Bootstrap::getPath($class); + if (!$file) return false; + require HTMLPURIFIER_PREFIX . '/' . $file; + return true; + } + + /** + * Returns the path for a specific class. + */ + public static function getPath($class) { + if (strncmp('HTMLPurifier', $class, 12) !== 0) return false; + // Custom implementations + if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) { + $code = str_replace('_', '-', substr($class, 22)); + $file = 'HTMLPurifier/Language/classes/' . $code . '.php'; + } else { + $file = str_replace('_', '/', $class) . '.php'; + } + if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) return false; + return $file; + } + + /** + * "Pre-registers" our autoloader on the SPL stack. + */ + public static function registerAutoload() { + $autoload = array('HTMLPurifier_Bootstrap', 'autoload'); + if ( ($funcs = spl_autoload_functions()) === false ) { + spl_autoload_register($autoload); + } elseif (function_exists('spl_autoload_unregister')) { + $compat = version_compare(PHP_VERSION, '5.1.2', '<=') && + version_compare(PHP_VERSION, '5.1.0', '>='); + foreach ($funcs as $func) { + if (is_array($func)) { + // :TRICKY: There are some compatibility issues and some + // places where we need to error out + $reflector = new ReflectionMethod($func[0], $func[1]); + if (!$reflector->isStatic()) { + throw new Exception(' + HTML Purifier autoloader registrar is not compatible + with non-static object methods due to PHP Bug #44144; + Please do not use HTMLPurifier.autoload.php (or any + file that includes this file); instead, place the code: + spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\')) + after your own autoloaders. + '); + } + // Suprisingly, spl_autoload_register supports the + // Class::staticMethod callback format, although call_user_func doesn't + if ($compat) $func = implode('::', $func); + } + spl_autoload_unregister($func); + } + spl_autoload_register($autoload); + foreach ($funcs as $func) spl_autoload_register($func); + } + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/CSSDefinition.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/CSSDefinition.php new file mode 100644 index 0000000..663eacc --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/CSSDefinition.php @@ -0,0 +1,290 @@ +info['text-align'] = new HTMLPurifier_AttrDef_Enum( + array('left', 'right', 'center', 'justify'), false); + + $border_style = + $this->info['border-bottom-style'] = + $this->info['border-right-style'] = + $this->info['border-left-style'] = + $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( + array('none', 'hidden', 'dotted', 'dashed', 'solid', 'double', + 'groove', 'ridge', 'inset', 'outset'), false); + + $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); + + $this->info['clear'] = new HTMLPurifier_AttrDef_Enum( + array('none', 'left', 'right', 'both'), false); + $this->info['float'] = new HTMLPurifier_AttrDef_Enum( + array('none', 'left', 'right'), false); + $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( + array('normal', 'italic', 'oblique'), false); + $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( + array('normal', 'small-caps'), false); + + $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('none')), + new HTMLPurifier_AttrDef_CSS_URI() + ) + ); + + $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( + array('inside', 'outside'), false); + $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( + array('disc', 'circle', 'square', 'decimal', 'lower-roman', + 'upper-roman', 'lower-alpha', 'upper-alpha', 'none'), false); + $this->info['list-style-image'] = $uri_or_none; + + $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); + + $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( + array('capitalize', 'uppercase', 'lowercase', 'none'), false); + $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); + + $this->info['background-image'] = $uri_or_none; + $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( + array('repeat', 'repeat-x', 'repeat-y', 'no-repeat') + ); + $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( + array('scroll', 'fixed') + ); + $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); + + $border_color = + $this->info['border-top-color'] = + $this->info['border-bottom-color'] = + $this->info['border-left-color'] = + $this->info['border-right-color'] = + $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_Enum(array('transparent')), + new HTMLPurifier_AttrDef_CSS_Color() + )); + + $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); + + $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color); + + $border_width = + $this->info['border-top-width'] = + $this->info['border-bottom-width'] = + $this->info['border-left-width'] = + $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')), + new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative + )); + + $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); + + $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_Enum(array('normal')), + new HTMLPurifier_AttrDef_CSS_Length() + )); + + $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_Enum(array('normal')), + new HTMLPurifier_AttrDef_CSS_Length() + )); + + $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_Enum(array('xx-small', 'x-small', + 'small', 'medium', 'large', 'x-large', 'xx-large', + 'larger', 'smaller')), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_CSS_Length() + )); + + $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_Enum(array('normal')), + new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true) + )); + + $margin = + $this->info['margin-top'] = + $this->info['margin-bottom'] = + $this->info['margin-left'] = + $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_Enum(array('auto')) + )); + + $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); + + // non-negative + $padding = + $this->info['padding-top'] = + $this->info['padding-bottom'] = + $this->info['padding-left'] = + $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true) + )); + + $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); + + $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage() + )); + + $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true), + new HTMLPurifier_AttrDef_Enum(array('auto')) + )); + $max = $config->get('CSS', 'MaxImgLength'); + + $this->info['width'] = + $this->info['height'] = + $max === null ? + $trusted_wh : + new HTMLPurifier_AttrDef_Switch('img', + // For img tags: + new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_CSS_Length('0', $max), + new HTMLPurifier_AttrDef_Enum(array('auto')) + )), + // For everyone else: + $trusted_wh + ); + + $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); + + $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); + + // this could use specialized code + $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( + array('normal', 'bold', 'bolder', 'lighter', '100', '200', '300', + '400', '500', '600', '700', '800', '900'), false); + + // MUST be called after other font properties, as it references + // a CSSDefinition object + $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config); + + // same here + $this->info['border'] = + $this->info['border-bottom'] = + $this->info['border-top'] = + $this->info['border-left'] = + $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); + + $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(array( + 'collapse', 'separate')); + + $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(array( + 'top', 'bottom')); + + $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(array( + 'auto', 'fixed')); + + $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(array( + new HTMLPurifier_AttrDef_Enum(array('baseline', 'sub', 'super', + 'top', 'text-top', 'middle', 'bottom', 'text-bottom')), + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage() + )); + + $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); + + // partial support + $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(array('nowrap')); + + if ($config->get('CSS', 'Proprietary')) { + $this->doSetupProprietary($config); + } + + if ($config->get('CSS', 'AllowTricky')) { + $this->doSetupTricky($config); + } + + $allow_important = $config->get('CSS', 'AllowImportant'); + // wrap all attr-defs with decorator that handles !important + foreach ($this->info as $k => $v) { + $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important); + } + + $this->setupConfigStuff($config); + } + + protected function doSetupProprietary($config) { + // Internet Explorer only scrollbar colors + $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + + // technically not proprietary, but CSS3, and no one supports it + $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + + // only opacity, for now + $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter(); + + } + + protected function doSetupTricky($config) { + $this->info['display'] = new HTMLPurifier_AttrDef_Enum(array( + 'inline', 'block', 'list-item', 'run-in', 'compact', + 'marker', 'table', 'inline-table', 'table-row-group', + 'table-header-group', 'table-footer-group', 'table-row', + 'table-column-group', 'table-column', 'table-cell', 'table-caption', 'none' + )); + $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum(array( + 'visible', 'hidden', 'collapse' + )); + } + + + /** + * Performs extra config-based processing. Based off of + * HTMLPurifier_HTMLDefinition. + * @todo Refactor duplicate elements into common class (probably using + * composition, not inheritance). + */ + protected function setupConfigStuff($config) { + + // setup allowed elements + $support = "(for information on implementing this, see the ". + "support forums) "; + $allowed_attributes = $config->get('CSS', 'AllowedProperties'); + if ($allowed_attributes !== null) { + foreach ($this->info as $name => $d) { + if(!isset($allowed_attributes[$name])) unset($this->info[$name]); + unset($allowed_attributes[$name]); + } + // emit errors + foreach ($allowed_attributes as $name => $d) { + // :TODO: Is this htmlspecialchars() call really necessary? + $name = htmlspecialchars($name); + trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING); + } + } + + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef.php new file mode 100644 index 0000000..de0b1b9 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef.php @@ -0,0 +1,48 @@ +elements; + } + + /** + * Validates nodes according to definition and returns modification. + * + * @param $tokens_of_children Array of HTMLPurifier_Token + * @param $config HTMLPurifier_Config object + * @param $context HTMLPurifier_Context object + * @return bool true to leave nodes as is + * @return bool false to remove parent node + * @return array of replacement child tokens + */ + abstract public function validateChildren($tokens_of_children, $config, $context); +} + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Chameleon.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Chameleon.php new file mode 100644 index 0000000..2890ef1 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Chameleon.php @@ -0,0 +1,47 @@ +inline = new HTMLPurifier_ChildDef_Optional($inline); + $this->block = new HTMLPurifier_ChildDef_Optional($block); + $this->elements = $this->block->elements; + } + + public function validateChildren($tokens_of_children, $config, $context) { + if ($context->get('IsInline') === false) { + return $this->block->validateChildren( + $tokens_of_children, $config, $context); + } else { + return $this->inline->validateChildren( + $tokens_of_children, $config, $context); + } + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Custom.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Custom.php new file mode 100644 index 0000000..05c5d0c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Custom.php @@ -0,0 +1,89 @@ +dtd_regex = $dtd_regex; + $this->_compileRegex(); + } + /** + * Compiles the PCRE regex from a DTD regex ($dtd_regex to $_pcre_regex) + */ + protected function _compileRegex() { + $raw = str_replace(' ', '', $this->dtd_regex); + if ($raw{0} != '(') { + $raw = "($raw)"; + } + $el = '[#a-zA-Z0-9_.-]+'; + $reg = $raw; + + // COMPLICATED! AND MIGHT BE BUGGY! I HAVE NO CLUE WHAT I'M + // DOING! Seriously: if there's problems, please report them. + + // collect all elements into the $elements array + preg_match_all("/$el/", $reg, $matches); + foreach ($matches[0] as $match) { + $this->elements[$match] = true; + } + + // setup all elements as parentheticals with leading commas + $reg = preg_replace("/$el/", '(,\\0)', $reg); + + // remove commas when they were not solicited + $reg = preg_replace("/([^,(|]\(+),/", '\\1', $reg); + + // remove all non-paranthetical commas: they are handled by first regex + $reg = preg_replace("/,\(/", '(', $reg); + + $this->_pcre_regex = $reg; + } + public function validateChildren($tokens_of_children, $config, $context) { + $list_of_children = ''; + $nesting = 0; // depth into the nest + foreach ($tokens_of_children as $token) { + if (!empty($token->is_whitespace)) continue; + + $is_child = ($nesting == 0); // direct + + if ($token instanceof HTMLPurifier_Token_Start) { + $nesting++; + } elseif ($token instanceof HTMLPurifier_Token_End) { + $nesting--; + } + + if ($is_child) { + $list_of_children .= $token->name . ','; + } + } + // add leading comma to deal with stray comma declarations + $list_of_children = ',' . rtrim($list_of_children, ','); + $okay = + preg_match( + '/^,?'.$this->_pcre_regex.'$/', + $list_of_children + ); + + return (bool) $okay; + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Empty.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Empty.php new file mode 100644 index 0000000..cbfd750 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Empty.php @@ -0,0 +1,19 @@ + $x) { + $elements[$i] = true; + if (empty($i)) unset($elements[$i]); // remove blank + } + } + $this->elements = $elements; + } + public $allow_empty = false; + public $type = 'required'; + public function validateChildren($tokens_of_children, $config, $context) { + // if there are no tokens, delete parent node + if (empty($tokens_of_children)) return false; + + // the new set of children + $result = array(); + + // current depth into the nest + $nesting = 0; + + // whether or not we're deleting a node + $is_deleting = false; + + // whether or not parsed character data is allowed + // this controls whether or not we silently drop a tag + // or generate escaped HTML from it + $pcdata_allowed = isset($this->elements['#PCDATA']); + + // a little sanity check to make sure it's not ALL whitespace + $all_whitespace = true; + + // some configuration + $escape_invalid_children = $config->get('Core', 'EscapeInvalidChildren'); + + // generator + $gen = new HTMLPurifier_Generator($config, $context); + + foreach ($tokens_of_children as $token) { + if (!empty($token->is_whitespace)) { + $result[] = $token; + continue; + } + $all_whitespace = false; // phew, we're not talking about whitespace + + $is_child = ($nesting == 0); + + if ($token instanceof HTMLPurifier_Token_Start) { + $nesting++; + } elseif ($token instanceof HTMLPurifier_Token_End) { + $nesting--; + } + + if ($is_child) { + $is_deleting = false; + if (!isset($this->elements[$token->name])) { + $is_deleting = true; + if ($pcdata_allowed && $token instanceof HTMLPurifier_Token_Text) { + $result[] = $token; + } elseif ($pcdata_allowed && $escape_invalid_children) { + $result[] = new HTMLPurifier_Token_Text( + $gen->generateFromToken($token) + ); + } + continue; + } + } + if (!$is_deleting || ($pcdata_allowed && $token instanceof HTMLPurifier_Token_Text)) { + $result[] = $token; + } elseif ($pcdata_allowed && $escape_invalid_children) { + $result[] = + new HTMLPurifier_Token_Text( + $gen->generateFromToken($token) + ); + } else { + // drop silently + } + } + if (empty($result)) return false; + if ($all_whitespace) return false; + if ($tokens_of_children == $result) return true; + return $result; + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/StrictBlockquote.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/StrictBlockquote.php new file mode 100644 index 0000000..3ac834c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/StrictBlockquote.php @@ -0,0 +1,87 @@ +init($config); + return $this->fake_elements; + } + + public function validateChildren($tokens_of_children, $config, $context) { + + $this->init($config); + + // trick the parent class into thinking it allows more + $this->elements = $this->fake_elements; + $result = parent::validateChildren($tokens_of_children, $config, $context); + $this->elements = $this->real_elements; + + if ($result === false) return array(); + if ($result === true) $result = $tokens_of_children; + + $def = $config->getHTMLDefinition(); + $block_wrap_start = new HTMLPurifier_Token_Start($def->info_block_wrapper); + $block_wrap_end = new HTMLPurifier_Token_End( $def->info_block_wrapper); + $is_inline = false; + $depth = 0; + $ret = array(); + + // assuming that there are no comment tokens + foreach ($result as $i => $token) { + $token = $result[$i]; + // ifs are nested for readability + if (!$is_inline) { + if (!$depth) { + if ( + ($token instanceof HTMLPurifier_Token_Text && !$token->is_whitespace) || + (!$token instanceof HTMLPurifier_Token_Text && !isset($this->elements[$token->name])) + ) { + $is_inline = true; + $ret[] = $block_wrap_start; + } + } + } else { + if (!$depth) { + // starting tokens have been inline text / empty + if ($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) { + if (isset($this->elements[$token->name])) { + // ended + $ret[] = $block_wrap_end; + $is_inline = false; + } + } + } + } + $ret[] = $token; + if ($token instanceof HTMLPurifier_Token_Start) $depth++; + if ($token instanceof HTMLPurifier_Token_End) $depth--; + } + if ($is_inline) $ret[] = $block_wrap_end; + return $ret; + } + + private function init($config) { + if (!$this->init) { + $def = $config->getHTMLDefinition(); + // allow all inline elements + $this->real_elements = $this->elements; + $this->fake_elements = $def->info_content_sets['Flow']; + $this->fake_elements['#PCDATA'] = true; + $this->init = true; + } + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Table.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Table.php new file mode 100644 index 0000000..50ad115 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ChildDef/Table.php @@ -0,0 +1,141 @@ + true, 'tbody' => true, 'thead' => true, + 'tfoot' => true, 'caption' => true, 'colgroup' => true, 'col' => true); + public function __construct() {} + public function validateChildren($tokens_of_children, $config, $context) { + if (empty($tokens_of_children)) return false; + + // this ensures that the loop gets run one last time before closing + // up. It's a little bit of a hack, but it works! Just make sure you + // get rid of the token later. + $tokens_of_children[] = false; + + // only one of these elements is allowed in a table + $caption = false; + $thead = false; + $tfoot = false; + + // as many of these as you want + $cols = array(); + $content = array(); + + $nesting = 0; // current depth so we can determine nodes + $is_collecting = false; // are we globbing together tokens to package + // into one of the collectors? + $collection = array(); // collected nodes + $tag_index = 0; // the first node might be whitespace, + // so this tells us where the start tag is + + foreach ($tokens_of_children as $token) { + $is_child = ($nesting == 0); + + if ($token === false) { + // terminating sequence started + } elseif ($token instanceof HTMLPurifier_Token_Start) { + $nesting++; + } elseif ($token instanceof HTMLPurifier_Token_End) { + $nesting--; + } + + // handle node collection + if ($is_collecting) { + if ($is_child) { + // okay, let's stash the tokens away + // first token tells us the type of the collection + switch ($collection[$tag_index]->name) { + case 'tr': + case 'tbody': + $content[] = $collection; + break; + case 'caption': + if ($caption !== false) break; + $caption = $collection; + break; + case 'thead': + case 'tfoot': + // access the appropriate variable, $thead or $tfoot + $var = $collection[$tag_index]->name; + if ($$var === false) { + $$var = $collection; + } else { + // transmutate the first and less entries into + // tbody tags, and then put into content + $collection[$tag_index]->name = 'tbody'; + $collection[count($collection)-1]->name = 'tbody'; + $content[] = $collection; + } + break; + case 'colgroup': + $cols[] = $collection; + break; + } + $collection = array(); + $is_collecting = false; + $tag_index = 0; + } else { + // add the node to the collection + $collection[] = $token; + } + } + + // terminate + if ($token === false) break; + + if ($is_child) { + // determine what we're dealing with + if ($token->name == 'col') { + // the only empty tag in the possie, we can handle it + // immediately + $cols[] = array_merge($collection, array($token)); + $collection = array(); + $tag_index = 0; + continue; + } + switch($token->name) { + case 'caption': + case 'colgroup': + case 'thead': + case 'tfoot': + case 'tbody': + case 'tr': + $is_collecting = true; + $collection[] = $token; + continue; + default: + if ($token instanceof HTMLPurifier_Token_Text && $token->is_whitespace) { + $collection[] = $token; + $tag_index++; + } + continue; + } + } + } + + if (empty($content)) return false; + + $ret = array(); + if ($caption !== false) $ret = array_merge($ret, $caption); + if ($cols !== false) foreach ($cols as $token_array) $ret = array_merge($ret, $token_array); + if ($thead !== false) $ret = array_merge($ret, $thead); + if ($tfoot !== false) $ret = array_merge($ret, $tfoot); + foreach ($content as $token_array) $ret = array_merge($ret, $token_array); + if (!empty($collection) && $is_collecting == false){ + // grab the trailing space + $ret = array_merge($ret, $collection); + } + + array_pop($tokens_of_children); // remove phantom token + + return ($ret === $tokens_of_children) ? true : $ret; + + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Config.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Config.php new file mode 100644 index 0000000..d259153 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Config.php @@ -0,0 +1,492 @@ +conf = $definition->defaults; // set up, copy in defaults + $this->def = $definition; // keep a copy around for checking + $this->parser = new HTMLPurifier_VarParser_Flexible(); + } + + /** + * Convenience constructor that creates a config object based on a mixed var + * @param mixed $config Variable that defines the state of the config + * object. Can be: a HTMLPurifier_Config() object, + * an array of directives based on loadArray(), + * or a string filename of an ini file. + * @param HTMLPurifier_ConfigSchema Schema object + * @return Configured HTMLPurifier_Config object + */ + public static function create($config, $schema = null) { + if ($config instanceof HTMLPurifier_Config) { + // pass-through + return $config; + } + if (!$schema) { + $ret = HTMLPurifier_Config::createDefault(); + } else { + $ret = new HTMLPurifier_Config($schema); + } + if (is_string($config)) $ret->loadIni($config); + elseif (is_array($config)) $ret->loadArray($config); + return $ret; + } + + /** + * Convenience constructor that creates a default configuration object. + * @return Default HTMLPurifier_Config object. + */ + public static function createDefault() { + $definition = HTMLPurifier_ConfigSchema::instance(); + $config = new HTMLPurifier_Config($definition); + return $config; + } + + /** + * Retreives a value from the configuration. + * @param $namespace String namespace + * @param $key String key + */ + public function get($namespace, $key) { + if (!$this->finalized && $this->autoFinalize) $this->finalize(); + if (!isset($this->def->info[$namespace][$key])) { + // can't add % due to SimpleTest bug + trigger_error('Cannot retrieve value of undefined directive ' . htmlspecialchars("$namespace.$key"), + E_USER_WARNING); + return; + } + if (isset($this->def->info[$namespace][$key]->isAlias)) { + $d = $this->def->info[$namespace][$key]; + trigger_error('Cannot get value from aliased directive, use real name ' . $d->namespace . '.' . $d->name, + E_USER_ERROR); + return; + } + return $this->conf[$namespace][$key]; + } + + /** + * Retreives an array of directives to values from a given namespace + * @param $namespace String namespace + */ + public function getBatch($namespace) { + if (!$this->finalized && $this->autoFinalize) $this->finalize(); + if (!isset($this->def->info[$namespace])) { + trigger_error('Cannot retrieve undefined namespace ' . htmlspecialchars($namespace), + E_USER_WARNING); + return; + } + return $this->conf[$namespace]; + } + + /** + * Returns a md5 signature of a segment of the configuration object + * that uniquely identifies that particular configuration + * @note Revision is handled specially and is removed from the batch + * before processing! + * @param $namespace Namespace to get serial for + */ + public function getBatchSerial($namespace) { + if (empty($this->serials[$namespace])) { + $batch = $this->getBatch($namespace); + unset($batch['DefinitionRev']); + $this->serials[$namespace] = md5(serialize($batch)); + } + return $this->serials[$namespace]; + } + + /** + * Returns a md5 signature for the entire configuration object + * that uniquely identifies that particular configuration + */ + public function getSerial() { + if (empty($this->serial)) { + $this->serial = md5(serialize($this->getAll())); + } + return $this->serial; + } + + /** + * Retrieves all directives, organized by namespace + */ + public function getAll() { + if (!$this->finalized && $this->autoFinalize) $this->finalize(); + return $this->conf; + } + + /** + * Sets a value to configuration. + * @param $namespace String namespace + * @param $key String key + * @param $value Mixed value + */ + public function set($namespace, $key, $value, $from_alias = false) { + if ($this->isFinalized('Cannot set directive after finalization')) return; + if (!isset($this->def->info[$namespace][$key])) { + trigger_error('Cannot set undefined directive ' . htmlspecialchars("$namespace.$key") . ' to value', + E_USER_WARNING); + return; + } + $def = $this->def->info[$namespace][$key]; + + if (isset($def->isAlias)) { + if ($from_alias) { + trigger_error('Double-aliases not allowed, please fix '. + 'ConfigSchema bug with' . "$namespace.$key", E_USER_ERROR); + return; + } + $this->set($new_ns = $def->namespace, + $new_dir = $def->name, + $value, true); + trigger_error("$namespace.$key is an alias, preferred directive name is $new_ns.$new_dir", E_USER_NOTICE); + return; + } + + // Raw type might be negative when using the fully optimized form + // of stdclass, which indicates allow_null == true + $rtype = is_int($def) ? $def : $def->type; + if ($rtype < 0) { + $type = -$rtype; + $allow_null = true; + } else { + $type = $rtype; + $allow_null = isset($def->allow_null); + } + + try { + $value = $this->parser->parse($value, $type, $allow_null); + } catch (HTMLPurifier_VarParserException $e) { + trigger_error('Value for ' . "$namespace.$key" . ' is of invalid type, should be ' . HTMLPurifier_VarParser::getTypeName($type), E_USER_WARNING); + return; + } + if (is_string($value) && is_object($def)) { + // resolve value alias if defined + if (isset($def->aliases[$value])) { + $value = $def->aliases[$value]; + } + // check to see if the value is allowed + if (isset($def->allowed) && !isset($def->allowed[$value])) { + trigger_error('Value not supported, valid values are: ' . + $this->_listify($def->allowed), E_USER_WARNING); + return; + } + } + $this->conf[$namespace][$key] = $value; + + // reset definitions if the directives they depend on changed + // this is a very costly process, so it's discouraged + // with finalization + if ($namespace == 'HTML' || $namespace == 'CSS') { + $this->definitions[$namespace] = null; + } + + $this->serials[$namespace] = false; + } + + /** + * Convenience function for error reporting + */ + private function _listify($lookup) { + $list = array(); + foreach ($lookup as $name => $b) $list[] = $name; + return implode(', ', $list); + } + + /** + * Retrieves object reference to the HTML definition. + * @param $raw Return a copy that has not been setup yet. Must be + * called before it's been setup, otherwise won't work. + */ + public function getHTMLDefinition($raw = false) { + return $this->getDefinition('HTML', $raw); + } + + /** + * Retrieves object reference to the CSS definition + * @param $raw Return a copy that has not been setup yet. Must be + * called before it's been setup, otherwise won't work. + */ + public function getCSSDefinition($raw = false) { + return $this->getDefinition('CSS', $raw); + } + + /** + * Retrieves a definition + * @param $type Type of definition: HTML, CSS, etc + * @param $raw Whether or not definition should be returned raw + */ + public function getDefinition($type, $raw = false) { + if (!$this->finalized && $this->autoFinalize) $this->finalize(); + $factory = HTMLPurifier_DefinitionCacheFactory::instance(); + $cache = $factory->create($type, $this); + if (!$raw) { + // see if we can quickly supply a definition + if (!empty($this->definitions[$type])) { + if (!$this->definitions[$type]->setup) { + $this->definitions[$type]->setup($this); + $cache->set($this->definitions[$type], $this); + } + return $this->definitions[$type]; + } + // memory check missed, try cache + $this->definitions[$type] = $cache->get($this); + if ($this->definitions[$type]) { + // definition in cache, return it + return $this->definitions[$type]; + } + } elseif ( + !empty($this->definitions[$type]) && + !$this->definitions[$type]->setup + ) { + // raw requested, raw in memory, quick return + return $this->definitions[$type]; + } + // quick checks failed, let's create the object + if ($type == 'HTML') { + $this->definitions[$type] = new HTMLPurifier_HTMLDefinition(); + } elseif ($type == 'CSS') { + $this->definitions[$type] = new HTMLPurifier_CSSDefinition(); + } elseif ($type == 'URI') { + $this->definitions[$type] = new HTMLPurifier_URIDefinition(); + } else { + throw new HTMLPurifier_Exception("Definition of $type type not supported"); + } + // quick abort if raw + if ($raw) { + if (is_null($this->get($type, 'DefinitionID'))) { + // fatally error out if definition ID not set + throw new HTMLPurifier_Exception("Cannot retrieve raw version without specifying %$type.DefinitionID"); + } + return $this->definitions[$type]; + } + // set it up + $this->definitions[$type]->setup($this); + // save in cache + $cache->set($this->definitions[$type], $this); + return $this->definitions[$type]; + } + + /** + * Loads configuration values from an array with the following structure: + * Namespace.Directive => Value + * @param $config_array Configuration associative array + */ + public function loadArray($config_array) { + if ($this->isFinalized('Cannot load directives after finalization')) return; + foreach ($config_array as $key => $value) { + $key = str_replace('_', '.', $key); + if (strpos($key, '.') !== false) { + // condensed form + list($namespace, $directive) = explode('.', $key); + $this->set($namespace, $directive, $value); + } else { + $namespace = $key; + $namespace_values = $value; + foreach ($namespace_values as $directive => $value) { + $this->set($namespace, $directive, $value); + } + } + } + } + + /** + * Returns a list of array(namespace, directive) for all directives + * that are allowed in a web-form context as per an allowed + * namespaces/directives list. + * @param $allowed List of allowed namespaces/directives + */ + public static function getAllowedDirectivesForForm($allowed, $schema = null) { + if (!$schema) { + $schema = HTMLPurifier_ConfigSchema::instance(); + } + if ($allowed !== true) { + if (is_string($allowed)) $allowed = array($allowed); + $allowed_ns = array(); + $allowed_directives = array(); + $blacklisted_directives = array(); + foreach ($allowed as $ns_or_directive) { + if (strpos($ns_or_directive, '.') !== false) { + // directive + if ($ns_or_directive[0] == '-') { + $blacklisted_directives[substr($ns_or_directive, 1)] = true; + } else { + $allowed_directives[$ns_or_directive] = true; + } + } else { + // namespace + $allowed_ns[$ns_or_directive] = true; + } + } + } + $ret = array(); + foreach ($schema->info as $ns => $keypairs) { + foreach ($keypairs as $directive => $def) { + if ($allowed !== true) { + if (isset($blacklisted_directives["$ns.$directive"])) continue; + if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) continue; + } + if (isset($def->isAlias)) continue; + if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') continue; + $ret[] = array($ns, $directive); + } + } + return $ret; + } + + /** + * Loads configuration values from $_GET/$_POST that were posted + * via ConfigForm + * @param $array $_GET or $_POST array to import + * @param $index Index/name that the config variables are in + * @param $allowed List of allowed namespaces/directives + * @param $mq_fix Boolean whether or not to enable magic quotes fix + * @param $schema Instance of HTMLPurifier_ConfigSchema to use, if not global copy + */ + public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) { + $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema); + $config = HTMLPurifier_Config::create($ret, $schema); + return $config; + } + + /** + * Merges in configuration values from $_GET/$_POST to object. NOT STATIC. + * @note Same parameters as loadArrayFromForm + */ + public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true) { + $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def); + $this->loadArray($ret); + } + + /** + * Prepares an array from a form into something usable for the more + * strict parts of HTMLPurifier_Config + */ + public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) { + if ($index !== false) $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array(); + $mq = $mq_fix && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc(); + + $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema); + $ret = array(); + foreach ($allowed as $key) { + list($ns, $directive) = $key; + $skey = "$ns.$directive"; + if (!empty($array["Null_$skey"])) { + $ret[$ns][$directive] = null; + continue; + } + if (!isset($array[$skey])) continue; + $value = $mq ? stripslashes($array[$skey]) : $array[$skey]; + $ret[$ns][$directive] = $value; + } + return $ret; + } + + /** + * Loads configuration values from an ini file + * @param $filename Name of ini file + */ + public function loadIni($filename) { + if ($this->isFinalized('Cannot load directives after finalization')) return; + $array = parse_ini_file($filename, true); + $this->loadArray($array); + } + + /** + * Checks whether or not the configuration object is finalized. + * @param $error String error message, or false for no error + */ + public function isFinalized($error = false) { + if ($this->finalized && $error) { + trigger_error($error, E_USER_ERROR); + } + return $this->finalized; + } + + /** + * Finalizes configuration only if auto finalize is on and not + * already finalized + */ + public function autoFinalize() { + if (!$this->finalized && $this->autoFinalize) $this->finalize(); + } + + /** + * Finalizes a configuration object, prohibiting further change + */ + public function finalize() { + $this->finalized = true; + } + +} + + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef.php new file mode 100644 index 0000000..b632e7c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef.php @@ -0,0 +1,9 @@ +type = $type; + if ( $allow_null !== null) $this->allow_null = $allow_null; + if ( $allowed !== null) $this->allowed = $allowed; + if ( $aliases !== null) $this->aliases = $aliases; + } + + /** + * Allowed type of the directive. Values are: + * - string + * - istring (case insensitive string) + * - int + * - float + * - bool + * - lookup (array of value => true) + * - list (regular numbered index array) + * - hash (array of key => value) + * - mixed (anything goes) + */ + public $type = 'mixed'; + + /** + * Is null allowed? Has no effect for mixed type. + * @bool + */ + public $allow_null = false; + + /** + * Lookup table of allowed values of the element, bool true if all allowed. + */ + public $allowed = true; + + /** + * Hash of value aliases, i.e. values that are equivalent. + */ + public $aliases = array(); + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/DirectiveAlias.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/DirectiveAlias.php new file mode 100644 index 0000000..ccb0d3d --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/DirectiveAlias.php @@ -0,0 +1,24 @@ +namespace = $namespace; + $this->name = $name; + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/Namespace.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/Namespace.php new file mode 100644 index 0000000..155e3e5 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigDef/Namespace.php @@ -0,0 +1,10 @@ + array( + * 'Directive' => new stdclass(), + * ) + * ) + * + * The stdclass may have the following properties: + * + * - If isAlias isn't set: + * - type: Integer type of directive, see HTMLPurifier_VarParser for definitions + * - allow_null: If set, this directive allows null values + * - aliases: If set, an associative array of value aliases to real values + * - allowed: If set, a lookup array of allowed (string) values + * - If isAlias is set: + * - namespace: Namespace this directive aliases to + * - name: Directive name this directive aliases to + * + * In certain degenerate cases, stdclass will actually be an integer. In + * that case, the value is equivalent to an stdclass with the type + * property set to the integer. If the integer is negative, type is + * equal to the absolute value of integer, and allow_null is true. + * + * This class is friendly with HTMLPurifier_Config. If you need introspection + * about the schema, you're better of using the ConfigSchema_Interchange, + * which uses more memory but has much richer information. + */ + public $info = array(); + + /** + * Application-wide singleton + */ + static protected $singleton; + + /** + * Unserializes the default ConfigSchema. + */ + public static function makeFromSerial() { + return unserialize(file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema.ser')); + } + + /** + * Retrieves an instance of the application-wide configuration definition. + */ + public static function instance($prototype = null) { + if ($prototype !== null) { + HTMLPurifier_ConfigSchema::$singleton = $prototype; + } elseif (HTMLPurifier_ConfigSchema::$singleton === null || $prototype === true) { + HTMLPurifier_ConfigSchema::$singleton = HTMLPurifier_ConfigSchema::makeFromSerial(); + } + return HTMLPurifier_ConfigSchema::$singleton; + } + + /** + * Defines a directive for configuration + * @warning Will fail of directive's namespace is defined. + * @warning This method's signature is slightly different from the legacy + * define() static method! Beware! + * @param $namespace Namespace the directive is in + * @param $name Key of directive + * @param $default Default value of directive + * @param $type Allowed type of the directive. See + * HTMLPurifier_DirectiveDef::$type for allowed values + * @param $allow_null Whether or not to allow null values + */ + public function add($namespace, $name, $default, $type, $allow_null) { + $obj = new stdclass(); + $obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type]; + if ($allow_null) $obj->allow_null = true; + $this->info[$namespace][$name] = $obj; + $this->defaults[$namespace][$name] = $default; + } + + /** + * Defines a namespace for directives to be put into. + * @warning This is slightly different from the corresponding static + * method. + * @param $namespace Namespace's name + */ + public function addNamespace($namespace) { + $this->info[$namespace] = array(); + $this->defaults[$namespace] = array(); + } + + /** + * Defines a directive value alias. + * + * Directive value aliases are convenient for developers because it lets + * them set a directive to several values and get the same result. + * @param $namespace Directive's namespace + * @param $name Name of Directive + * @param $aliases Hash of aliased values to the real alias + */ + public function addValueAliases($namespace, $name, $aliases) { + if (!isset($this->info[$namespace][$name]->aliases)) { + $this->info[$namespace][$name]->aliases = array(); + } + foreach ($aliases as $alias => $real) { + $this->info[$namespace][$name]->aliases[$alias] = $real; + } + } + + /** + * Defines a set of allowed values for a directive. + * @warning This is slightly different from the corresponding static + * method definition. + * @param $namespace Namespace of directive + * @param $name Name of directive + * @param $allowed Lookup array of allowed values + */ + public function addAllowedValues($namespace, $name, $allowed) { + $this->info[$namespace][$name]->allowed = $allowed; + } + + /** + * Defines a directive alias for backwards compatibility + * @param $namespace + * @param $name Directive that will be aliased + * @param $new_namespace + * @param $new_name Directive that the alias will be to + */ + public function addAlias($namespace, $name, $new_namespace, $new_name) { + $obj = new stdclass; + $obj->namespace = $new_namespace; + $obj->name = $new_name; + $obj->isAlias = true; + $this->info[$namespace][$name] = $obj; + } + + /** + * Replaces any stdclass that only has the type property with type integer. + */ + public function postProcess() { + foreach ($this->info as $namespace => $info) { + foreach ($info as $directive => $v) { + if (count((array) $v) == 1) { + $this->info[$namespace][$directive] = $v->type; + } elseif (count((array) $v) == 2 && isset($v->allow_null)) { + $this->info[$namespace][$directive] = -$v->type; + } + } + } + } + + // DEPRECATED METHODS + + /** @see HTMLPurifier_ConfigSchema->set() */ + public static function define($namespace, $name, $default, $type, $description) { + HTMLPurifier_ConfigSchema::deprecated(__METHOD__); + $type_values = explode('/', $type, 2); + $type = $type_values[0]; + $modifier = isset($type_values[1]) ? $type_values[1] : false; + $allow_null = ($modifier === 'null'); + $def = HTMLPurifier_ConfigSchema::instance(); + $def->add($namespace, $name, $default, $type, $allow_null); + } + + /** @see HTMLPurifier_ConfigSchema->addNamespace() */ + public static function defineNamespace($namespace, $description) { + HTMLPurifier_ConfigSchema::deprecated(__METHOD__); + $def = HTMLPurifier_ConfigSchema::instance(); + $def->addNamespace($namespace); + } + + /** @see HTMLPurifier_ConfigSchema->addValueAliases() */ + public static function defineValueAliases($namespace, $name, $aliases) { + HTMLPurifier_ConfigSchema::deprecated(__METHOD__); + $def = HTMLPurifier_ConfigSchema::instance(); + $def->addValueAliases($namespace, $name, $aliases); + } + + /** @see HTMLPurifier_ConfigSchema->addAllowedValues() */ + public static function defineAllowedValues($namespace, $name, $allowed_values) { + HTMLPurifier_ConfigSchema::deprecated(__METHOD__); + $allowed = array(); + foreach ($allowed_values as $value) { + $allowed[$value] = true; + } + $def = HTMLPurifier_ConfigSchema::instance(); + $def->addAllowedValues($namespace, $name, $allowed); + } + + /** @see HTMLPurifier_ConfigSchema->addAlias() */ + public static function defineAlias($namespace, $name, $new_namespace, $new_name) { + HTMLPurifier_ConfigSchema::deprecated(__METHOD__); + $def = HTMLPurifier_ConfigSchema::instance(); + $def->addAlias($namespace, $name, $new_namespace, $new_name); + } + + /** @deprecated, use HTMLPurifier_VarParser->parse() */ + public function validate($a, $b, $c = false) { + trigger_error("HTMLPurifier_ConfigSchema->validate deprecated, use HTMLPurifier_VarParser->parse instead", E_USER_NOTICE); + $parser = new HTMLPurifier_VarParser(); + return $parser->parse($a, $b, $c); + } + + /** + * Throws an E_USER_NOTICE stating that a method is deprecated. + */ + private static function deprecated($method) { + trigger_error("Static HTMLPurifier_ConfigSchema::$method deprecated, use add*() method instead", E_USER_NOTICE); + } + +} + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php new file mode 100644 index 0000000..c1423bb --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php @@ -0,0 +1,50 @@ +namespaces as $n) { + $schema->addNamespace($n->namespace); + } + foreach ($interchange->directives as $d) { + $schema->add( + $d->id->namespace, + $d->id->directive, + $d->default, + $d->type, + $d->typeAllowsNull + ); + if ($d->allowed !== null) { + $schema->addAllowedValues( + $d->id->namespace, + $d->id->directive, + $d->allowed + ); + } + foreach ($d->aliases as $alias) { + $schema->addAlias( + $alias->namespace, + $alias->directive, + $d->id->namespace, + $d->id->directive + ); + } + if ($d->valueAliases !== null) { + $schema->addValueAliases( + $d->id->namespace, + $d->id->directive, + $d->valueAliases + ); + } + } + $schema->postProcess(); + return $schema; + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php new file mode 100644 index 0000000..32a724c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php @@ -0,0 +1,106 @@ +startElement('div'); + + $purifier = HTMLPurifier::getInstance(); + $html = $purifier->purify($html); + $this->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); + $this->writeRaw($html); + + $this->endElement(); // div + } + + protected function export($var) { + if ($var === array()) return 'array()'; + return var_export($var, true); + } + + public function build($interchange) { + // global access, only use as last resort + $this->interchange = $interchange; + + $this->setIndent(true); + $this->startDocument('1.0', 'UTF-8'); + $this->startElement('configdoc'); + $this->writeElement('title', $interchange->name); + + foreach ($interchange->namespaces as $namespace) { + $this->buildNamespace($namespace); + } + + $this->endElement(); // configdoc + $this->flush(); + } + + public function buildNamespace($namespace) { + $this->startElement('namespace'); + $this->writeAttribute('id', $namespace->namespace); + + $this->writeElement('name', $namespace->namespace); + $this->startElement('description'); + $this->writeHTMLDiv($namespace->description); + $this->endElement(); // description + + foreach ($this->interchange->directives as $directive) { + if ($directive->id->namespace !== $namespace->namespace) continue; + $this->buildDirective($directive); + } + + $this->endElement(); // namespace + } + + public function buildDirective($directive) { + $this->startElement('directive'); + $this->writeAttribute('id', $directive->id->toString()); + + $this->writeElement('name', $directive->id->directive); + + $this->startElement('aliases'); + foreach ($directive->aliases as $alias) $this->writeElement('alias', $alias->toString()); + $this->endElement(); // aliases + + $this->startElement('constraints'); + if ($directive->version) $this->writeElement('version', $directive->version); + $this->startElement('type'); + if ($directive->typeAllowsNull) $this->writeAttribute('allow-null', 'yes'); + $this->text($directive->type); + $this->endElement(); // type + if ($directive->allowed) { + $this->startElement('allowed'); + foreach ($directive->allowed as $value => $x) $this->writeElement('value', $value); + $this->endElement(); // allowed + } + $this->writeElement('default', $this->export($directive->default)); + $this->writeAttribute('xml:space', 'preserve'); + if ($directive->external) { + $this->startElement('external'); + foreach ($directive->external as $project) $this->writeElement('project', $project); + $this->endElement(); + } + $this->endElement(); // constraints + + if ($directive->deprecatedVersion) { + $this->startElement('deprecated'); + $this->writeElement('version', $directive->deprecatedVersion); + $this->writeElement('use', $directive->deprecatedUse->toString()); + $this->endElement(); // deprecated + } + + $this->startElement('description'); + $this->writeHTMLDiv($directive->description); + $this->endElement(); // description + + $this->endElement(); // directive + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Exception.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Exception.php new file mode 100644 index 0000000..3a34460 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Exception.php @@ -0,0 +1,9 @@ + array(namespace info) + */ + public $namespaces = array(); + + /** + * Array of Directive ID => array(directive info) + */ + public $directives = array(); + + /** + * Adds a namespace array to $namespaces + */ + public function addNamespace($namespace) { + if (isset($this->namespaces[$i = $namespace->namespace])) { + throw new HTMLPurifier_ConfigSchema_Exception("Cannot redefine namespace '$i'"); + } + $this->namespaces[$i] = $namespace; + } + + /** + * Adds a directive array to $directives + */ + public function addDirective($directive) { + if (isset($this->directives[$i = $directive->id->toString()])) { + throw new HTMLPurifier_ConfigSchema_Exception("Cannot redefine directive '$i'"); + } + $this->directives[$i] = $directive; + } + + /** + * Convenience function to perform standard validation. Throws exception + * on failed validation. + */ + public function validate() { + $validator = new HTMLPurifier_ConfigSchema_Validator(); + return $validator->validate($this); + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php new file mode 100644 index 0000000..bbfe8c4 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php @@ -0,0 +1,75 @@ + true). + * Null if all values are allowed. + */ + public $allowed; + + /** + * List of aliases for the directive, + * e.g. array(new HTMLPurifier_ConfigSchema_Interchange_Id('Ns', 'Dir'))). + */ + public $aliases = array(); + + /** + * Hash of value aliases, e.g. array('alt' => 'real'). Null if value + * aliasing is disabled (necessary for non-scalar types). + */ + public $valueAliases; + + /** + * Version of HTML Purifier the directive was introduced, e.g. '1.3.1'. + * Null if the directive has always existed. + */ + public $version; + + /** + * ID of directive that supercedes this old directive, is an instance + * of HTMLPurifier_ConfigSchema_Interchange_Id. Null if not deprecated. + */ + public $deprecatedUse; + + /** + * Version of HTML Purifier this directive was deprecated. Null if not + * deprecated. + */ + public $deprecatedVersion; + + /** + * List of external projects this directive depends on, e.g. array('CSSTidy'). + */ + public $external = array(); + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php new file mode 100644 index 0000000..b4803e7 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php @@ -0,0 +1,29 @@ +namespace = $namespace; + $this->directive = $directive; + } + + /** + * @warning This is NOT magic, to ensure that people don't abuse SPL and + * cause problems for PHP 5.0 support. + */ + public function toString() { + return $this->namespace . '.' . $this->directive; + } + + public static function make($id) { + list($namespace, $directive) = explode('.', $id); + return new HTMLPurifier_ConfigSchema_Interchange_Id($namespace, $directive); + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Namespace.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Namespace.php new file mode 100644 index 0000000..b4fd002 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Interchange/Namespace.php @@ -0,0 +1,19 @@ +varParser = $varParser ? $varParser : new HTMLPurifier_VarParser_Native(); + } + + public static function buildFromDirectory($dir = null) { + $parser = new HTMLPurifier_StringHashParser(); + $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder(); + $interchange = new HTMLPurifier_ConfigSchema_Interchange(); + + if (!$dir) $dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema/'; + $info = parse_ini_file($dir . 'info.ini'); + $interchange->name = $info['name']; + + $files = array(); + $dh = opendir($dir); + while (false !== ($file = readdir($dh))) { + if (!$file || $file[0] == '.' || strrchr($file, '.') !== '.txt') { + continue; + } + $files[] = $file; + } + closedir($dh); + + sort($files); + foreach ($files as $file) { + $builder->build( + $interchange, + new HTMLPurifier_StringHash( $parser->parseFile($dir . $file) ) + ); + } + + return $interchange; + } + + /** + * Builds an interchange object based on a hash. + * @param $interchange HTMLPurifier_ConfigSchema_Interchange object to build + * @param $hash HTMLPurifier_ConfigSchema_StringHash source data + */ + public function build($interchange, $hash) { + if (!$hash instanceof HTMLPurifier_StringHash) { + $hash = new HTMLPurifier_StringHash($hash); + } + if (!isset($hash['ID'])) { + throw new HTMLPurifier_ConfigSchema_Exception('Hash does not have any ID'); + } + if (strpos($hash['ID'], '.') === false) { + $this->buildNamespace($interchange, $hash); + } else { + $this->buildDirective($interchange, $hash); + } + $this->_findUnused($hash); + } + + public function buildNamespace($interchange, $hash) { + $namespace = new HTMLPurifier_ConfigSchema_Interchange_Namespace(); + $namespace->namespace = $hash->offsetGet('ID'); + if (isset($hash['DESCRIPTION'])) { + $namespace->description = $hash->offsetGet('DESCRIPTION'); + } + $interchange->addNamespace($namespace); + } + + public function buildDirective($interchange, $hash) { + $directive = new HTMLPurifier_ConfigSchema_Interchange_Directive(); + + // These are required elements: + $directive->id = $this->id($hash->offsetGet('ID')); + $id = $directive->id->toString(); // convenience + + if (isset($hash['TYPE'])) { + $type = explode('/', $hash->offsetGet('TYPE')); + if (isset($type[1])) $directive->typeAllowsNull = true; + $directive->type = $type[0]; + } else { + throw new HTMLPurifier_ConfigSchema_Exception("TYPE in directive hash '$id' not defined"); + } + + if (isset($hash['DEFAULT'])) { + try { + $directive->default = $this->varParser->parse($hash->offsetGet('DEFAULT'), $directive->type, $directive->typeAllowsNull); + } catch (HTMLPurifier_VarParserException $e) { + throw new HTMLPurifier_ConfigSchema_Exception($e->getMessage() . " in DEFAULT in directive hash '$id'"); + } + } + + if (isset($hash['DESCRIPTION'])) { + $directive->description = $hash->offsetGet('DESCRIPTION'); + } + + if (isset($hash['ALLOWED'])) { + $directive->allowed = $this->lookup($this->evalArray($hash->offsetGet('ALLOWED'))); + } + + if (isset($hash['VALUE-ALIASES'])) { + $directive->valueAliases = $this->evalArray($hash->offsetGet('VALUE-ALIASES')); + } + + if (isset($hash['ALIASES'])) { + $raw_aliases = trim($hash->offsetGet('ALIASES')); + $aliases = preg_split('/\s*,\s*/', $raw_aliases); + foreach ($aliases as $alias) { + $directive->aliases[] = $this->id($alias); + } + } + + if (isset($hash['VERSION'])) { + $directive->version = $hash->offsetGet('VERSION'); + } + + if (isset($hash['DEPRECATED-USE'])) { + $directive->deprecatedUse = $this->id($hash->offsetGet('DEPRECATED-USE')); + } + + if (isset($hash['DEPRECATED-VERSION'])) { + $directive->deprecatedVersion = $hash->offsetGet('DEPRECATED-VERSION'); + } + + if (isset($hash['EXTERNAL'])) { + $directive->external = preg_split('/\s*,\s*/', trim($hash->offsetGet('EXTERNAL'))); + } + + $interchange->addDirective($directive); + } + + /** + * Evaluates an array PHP code string without array() wrapper + */ + protected function evalArray($contents) { + return eval('return array('. $contents .');'); + } + + /** + * Converts an array list into a lookup array. + */ + protected function lookup($array) { + $ret = array(); + foreach ($array as $val) $ret[$val] = true; + return $ret; + } + + /** + * Convenience function that creates an HTMLPurifier_ConfigSchema_Interchange_Id + * object based on a string Id. + */ + protected function id($id) { + return HTMLPurifier_ConfigSchema_Interchange_Id::make($id); + } + + /** + * Triggers errors for any unused keys passed in the hash; such keys + * may indicate typos, missing values, etc. + * @param $hash Instance of ConfigSchema_StringHash to check. + */ + protected function _findUnused($hash) { + $accessed = $hash->getAccessed(); + foreach ($hash as $k => $v) { + if (!isset($accessed[$k])) { + trigger_error("String hash key '$k' not used by builder", E_USER_NOTICE); + } + } + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Validator.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Validator.php new file mode 100644 index 0000000..eff487f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/Validator.php @@ -0,0 +1,223 @@ +parser = new HTMLPurifier_VarParser(); + } + + /** + * Validates a fully-formed interchange object. Throws an + * HTMLPurifier_ConfigSchema_Exception if there's a problem. + */ + public function validate($interchange) { + $this->interchange = $interchange; + $this->aliases = array(); + // PHP is a bit lax with integer <=> string conversions in + // arrays, so we don't use the identical !== comparison + foreach ($interchange->namespaces as $i => $namespace) { + if ($i != $namespace->namespace) $this->error(false, "Integrity violation: key '$i' does not match internal id '{$namespace->namespace}'"); + $this->validateNamespace($namespace); + } + foreach ($interchange->directives as $i => $directive) { + $id = $directive->id->toString(); + if ($i != $id) $this->error(false, "Integrity violation: key '$i' does not match internal id '$id'"); + $this->validateDirective($directive); + } + return true; + } + + /** + * Validates a HTMLPurifier_ConfigSchema_Interchange_Namespace object. + */ + public function validateNamespace($n) { + $this->context[] = "namespace '{$n->namespace}'"; + $this->with($n, 'namespace') + ->assertNotEmpty() + ->assertAlnum(); // implicit assertIsString handled by InterchangeBuilder + $this->with($n, 'description') + ->assertNotEmpty() + ->assertIsString(); // handled by InterchangeBuilder + array_pop($this->context); + } + + /** + * Validates a HTMLPurifier_ConfigSchema_Interchange_Id object. + */ + public function validateId($id) { + $id_string = $id->toString(); + $this->context[] = "id '$id_string'"; + if (!$id instanceof HTMLPurifier_ConfigSchema_Interchange_Id) { + // handled by InterchangeBuilder + $this->error(false, 'is not an instance of HTMLPurifier_ConfigSchema_Interchange_Id'); + } + if (!isset($this->interchange->namespaces[$id->namespace])) { + $this->error('namespace', 'does not exist'); // assumes that the namespace was validated already + } + $this->with($id, 'directive') + ->assertNotEmpty() + ->assertAlnum(); // implicit assertIsString handled by InterchangeBuilder + array_pop($this->context); + } + + /** + * Validates a HTMLPurifier_ConfigSchema_Interchange_Directive object. + */ + public function validateDirective($d) { + $id = $d->id->toString(); + $this->context[] = "directive '$id'"; + $this->validateId($d->id); + + $this->with($d, 'description') + ->assertNotEmpty(); + + // BEGIN - handled by InterchangeBuilder + $this->with($d, 'type') + ->assertNotEmpty(); + $this->with($d, 'typeAllowsNull') + ->assertIsBool(); + try { + // This also tests validity of $d->type + $this->parser->parse($d->default, $d->type, $d->typeAllowsNull); + } catch (HTMLPurifier_VarParserException $e) { + $this->error('default', 'had error: ' . $e->getMessage()); + } + // END - handled by InterchangeBuilder + + if (!is_null($d->allowed) || !empty($d->valueAliases)) { + // allowed and valueAliases require that we be dealing with + // strings, so check for that early. + $d_int = HTMLPurifier_VarParser::$types[$d->type]; + if (!isset(HTMLPurifier_VarParser::$stringTypes[$d_int])) { + $this->error('type', 'must be a string type when used with allowed or value aliases'); + } + } + + $this->validateDirectiveAllowed($d); + $this->validateDirectiveValueAliases($d); + $this->validateDirectiveAliases($d); + + array_pop($this->context); + } + + /** + * Extra validation if $allowed member variable of + * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + */ + public function validateDirectiveAllowed($d) { + if (is_null($d->allowed)) return; + $this->with($d, 'allowed') + ->assertNotEmpty() + ->assertIsLookup(); // handled by InterchangeBuilder + if (is_string($d->default) && !isset($d->allowed[$d->default])) { + $this->error('default', 'must be an allowed value'); + } + $this->context[] = 'allowed'; + foreach ($d->allowed as $val => $x) { + if (!is_string($val)) $this->error("value $val", 'must be a string'); + } + array_pop($this->context); + } + + /** + * Extra validation if $valueAliases member variable of + * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + */ + public function validateDirectiveValueAliases($d) { + if (is_null($d->valueAliases)) return; + $this->with($d, 'valueAliases') + ->assertIsArray(); // handled by InterchangeBuilder + $this->context[] = 'valueAliases'; + foreach ($d->valueAliases as $alias => $real) { + if (!is_string($alias)) $this->error("alias $alias", 'must be a string'); + if (!is_string($real)) $this->error("alias target $real from alias '$alias'", 'must be a string'); + if ($alias === $real) { + $this->error("alias '$alias'", "must not be an alias to itself"); + } + } + if (!is_null($d->allowed)) { + foreach ($d->valueAliases as $alias => $real) { + if (isset($d->allowed[$alias])) { + $this->error("alias '$alias'", 'must not be an allowed value'); + } elseif (!isset($d->allowed[$real])) { + $this->error("alias '$alias'", 'must be an alias to an allowed value'); + } + } + } + array_pop($this->context); + } + + /** + * Extra validation if $aliases member variable of + * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + */ + public function validateDirectiveAliases($d) { + $this->with($d, 'aliases') + ->assertIsArray(); // handled by InterchangeBuilder + $this->context[] = 'aliases'; + foreach ($d->aliases as $alias) { + $this->validateId($alias); + $s = $alias->toString(); + if (isset($this->interchange->directives[$s])) { + $this->error("alias '$s'", 'collides with another directive'); + } + if (isset($this->aliases[$s])) { + $other_directive = $this->aliases[$s]; + $this->error("alias '$s'", "collides with alias for directive '$other_directive'"); + } + $this->aliases[$s] = $d->id->toString(); + } + array_pop($this->context); + } + + // protected helper functions + + /** + * Convenience function for generating HTMLPurifier_ConfigSchema_ValidatorAtom + * for validating simple member variables of objects. + */ + protected function with($obj, $member) { + return new HTMLPurifier_ConfigSchema_ValidatorAtom($this->getFormattedContext(), $obj, $member); + } + + /** + * Emits an error, providing helpful context. + */ + protected function error($target, $msg) { + if ($target !== false) $prefix = ucfirst($target) . ' in ' . $this->getFormattedContext(); + else $prefix = ucfirst($this->getFormattedContext()); + throw new HTMLPurifier_ConfigSchema_Exception(trim($prefix . ' ' . $msg)); + } + + /** + * Returns a formatted context string. + */ + protected function getFormattedContext() { + return implode(' in ', array_reverse($this->context)); + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php new file mode 100644 index 0000000..5d77903 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php @@ -0,0 +1,66 @@ +context = $context; + $this->obj = $obj; + $this->member = $member; + $this->contents =& $obj->$member; + } + + public function assertIsString() { + if (!is_string($this->contents)) $this->error('must be a string'); + return $this; + } + + public function assertIsBool() { + if (!is_bool($this->contents)) $this->error('must be a boolean'); + return $this; + } + + public function assertIsArray() { + if (!is_array($this->contents)) $this->error('must be an array'); + return $this; + } + + public function assertNotNull() { + if ($this->contents === null) $this->error('must not be null'); + return $this; + } + + public function assertAlnum() { + $this->assertIsString(); + if (!ctype_alnum($this->contents)) $this->error('must be alphanumeric'); + return $this; + } + + public function assertNotEmpty() { + if (empty($this->contents)) $this->error('must not be empty'); + return $this; + } + + public function assertIsLookup() { + $this->assertIsArray(); + foreach ($this->contents as $v) { + if ($v !== true) $this->error('must be a lookup array'); + } + return $this; + } + + protected function error($msg) { + throw new HTMLPurifier_ConfigSchema_Exception(ucfirst($this->member) . ' in ' . $this->context . ' ' . $msg); + } + +} + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema.ser b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema.ser new file mode 100644 index 0000000..1ac5ff6 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema.ser @@ -0,0 +1 @@ +O:25:"HTMLPurifier_ConfigSchema":2:{s:8:"defaults";a:12:{s:4:"Attr";a:12:{s:19:"AllowedFrameTargets";a:0:{}s:10:"AllowedRel";a:0:{}s:10:"AllowedRev";a:0:{}s:15:"DefaultImageAlt";N;s:19:"DefaultInvalidImage";s:0:"";s:22:"DefaultInvalidImageAlt";s:13:"Invalid image";s:14:"DefaultTextDir";s:3:"ltr";s:8:"EnableID";b:0;s:11:"IDBlacklist";a:0:{}s:17:"IDBlacklistRegexp";N;s:8:"IDPrefix";s:0:"";s:13:"IDPrefixLocal";s:0:"";}s:10:"AutoFormat";a:6:{s:13:"AutoParagraph";b:0;s:6:"Custom";a:0:{}s:14:"DisplayLinkURI";b:0;s:7:"Linkify";b:0;s:15:"PurifierLinkify";b:0;s:11:"RemoveEmpty";b:0;}s:15:"AutoFormatParam";a:1:{s:21:"PurifierLinkifyDocURL";s:3:"#%s";}s:3:"CSS";a:6:{s:14:"AllowImportant";b:0;s:11:"AllowTricky";b:0;s:17:"AllowedProperties";N;s:13:"DefinitionRev";i:1;s:12:"MaxImgLength";s:6:"1200px";s:11:"Proprietary";b:0;}s:5:"Cache";a:2:{s:14:"DefinitionImpl";s:10:"Serializer";s:14:"SerializerPath";N;}s:4:"Core";a:15:{s:17:"AggressivelyFixLt";b:1;s:13:"CollectErrors";b:0;s:13:"ColorKeywords";a:17:{s:6:"maroon";s:7:"#800000";s:3:"red";s:7:"#FF0000";s:6:"orange";s:7:"#FFA500";s:6:"yellow";s:7:"#FFFF00";s:5:"olive";s:7:"#808000";s:6:"purple";s:7:"#800080";s:7:"fuchsia";s:7:"#FF00FF";s:5:"white";s:7:"#FFFFFF";s:4:"lime";s:7:"#00FF00";s:5:"green";s:7:"#008000";s:4:"navy";s:7:"#000080";s:4:"blue";s:7:"#0000FF";s:4:"aqua";s:7:"#00FFFF";s:4:"teal";s:7:"#008080";s:5:"black";s:7:"#000000";s:6:"silver";s:7:"#C0C0C0";s:4:"gray";s:7:"#808080";}s:25:"ConvertDocumentToFragment";b:1;s:31:"DirectLexLineNumberSyncInterval";i:0;s:8:"Encoding";s:5:"utf-8";s:21:"EscapeInvalidChildren";b:0;s:17:"EscapeInvalidTags";b:0;s:24:"EscapeNonASCIICharacters";b:0;s:14:"HiddenElements";a:2:{s:6:"script";b:1;s:5:"style";b:1;}s:8:"Language";s:2:"en";s:9:"LexerImpl";N;s:19:"MaintainLineNumbers";N;s:16:"RemoveInvalidImg";b:1;s:20:"RemoveScriptContents";N;}s:6:"Filter";a:3:{s:6:"Custom";a:0:{}s:18:"ExtractStyleBlocks";b:0;s:7:"YouTube";b:0;}s:11:"FilterParam";a:3:{s:26:"ExtractStyleBlocksEscaping";b:1;s:23:"ExtractStyleBlocksScope";N;s:26:"ExtractStyleBlocksTidyImpl";N;}s:4:"HTML";a:23:{s:7:"Allowed";N;s:17:"AllowedAttributes";N;s:15:"AllowedElements";N;s:14:"AllowedModules";N;s:12:"BlockWrapper";s:1:"p";s:11:"CoreModules";a:7:{s:9:"Structure";b:1;s:4:"Text";b:1;s:9:"Hypertext";b:1;s:4:"List";b:1;s:22:"NonXMLCommonAttributes";b:1;s:19:"XMLCommonAttributes";b:1;s:16:"CommonAttributes";b:1;}s:13:"CustomDoctype";N;s:12:"DefinitionID";N;s:13:"DefinitionRev";i:1;s:7:"Doctype";N;s:19:"ForbiddenAttributes";a:0:{}s:17:"ForbiddenElements";a:0:{}s:12:"MaxImgLength";i:1200;s:6:"Parent";s:3:"div";s:11:"Proprietary";b:0;s:9:"SafeEmbed";b:0;s:10:"SafeObject";b:0;s:6:"Strict";b:0;s:7:"TidyAdd";a:0:{}s:9:"TidyLevel";s:6:"medium";s:10:"TidyRemove";a:0:{}s:7:"Trusted";b:0;s:5:"XHTML";b:1;}s:6:"Output";a:4:{s:21:"CommentScriptContents";b:1;s:7:"Newline";N;s:8:"SortAttr";b:0;s:10:"TidyFormat";b:0;}s:4:"Test";a:1:{s:12:"ForceNoIconv";b:0;}s:3:"URI";a:16:{s:14:"AllowedSchemes";a:6:{s:4:"http";b:1;s:5:"https";b:1;s:6:"mailto";b:1;s:3:"ftp";b:1;s:4:"nntp";b:1;s:4:"news";b:1;}s:4:"Base";N;s:13:"DefaultScheme";s:4:"http";s:12:"DefinitionID";N;s:13:"DefinitionRev";i:1;s:7:"Disable";b:0;s:15:"DisableExternal";b:0;s:24:"DisableExternalResources";b:0;s:16:"DisableResources";b:0;s:4:"Host";N;s:13:"HostBlacklist";a:0:{}s:12:"MakeAbsolute";b:0;s:5:"Munge";N;s:14:"MungeResources";b:0;s:14:"MungeSecretKey";N;s:22:"OverrideAllowedSchemes";b:1;}}s:4:"info";a:12:{s:4:"Attr";a:13:{s:19:"AllowedFrameTargets";i:8;s:10:"AllowedRel";i:8;s:10:"AllowedRev";i:8;s:15:"DefaultImageAlt";i:-1;s:19:"DefaultInvalidImage";i:1;s:22:"DefaultInvalidImageAlt";i:1;s:14:"DefaultTextDir";O:8:"stdClass":2:{s:4:"type";i:1;s:7:"allowed";a:2:{s:3:"ltr";b:1;s:3:"rtl";b:1;}}s:8:"EnableID";i:7;s:11:"IDBlacklist";i:9;s:17:"IDBlacklistRegexp";i:-1;s:8:"IDPrefix";i:1;s:13:"IDPrefixLocal";i:1;s:10:"DisableURI";O:8:"stdClass":3:{s:9:"namespace";s:3:"URI";s:4:"name";s:7:"Disable";s:7:"isAlias";b:1;}}s:10:"AutoFormat";a:6:{s:13:"AutoParagraph";i:7;s:6:"Custom";i:9;s:14:"DisplayLinkURI";i:7;s:7:"Linkify";i:7;s:15:"PurifierLinkify";i:7;s:11:"RemoveEmpty";i:7;}s:15:"AutoFormatParam";a:1:{s:21:"PurifierLinkifyDocURL";i:1;}s:3:"CSS";a:6:{s:14:"AllowImportant";i:7;s:11:"AllowTricky";i:7;s:17:"AllowedProperties";i:-8;s:13:"DefinitionRev";i:5;s:12:"MaxImgLength";i:-1;s:11:"Proprietary";i:7;}s:5:"Cache";a:2:{s:14:"DefinitionImpl";i:-1;s:14:"SerializerPath";i:-1;}s:4:"Core";a:20:{s:15:"DefinitionCache";O:8:"stdClass":3:{s:9:"namespace";s:5:"Cache";s:4:"name";s:14:"DefinitionImpl";s:7:"isAlias";b:1;}s:17:"AggressivelyFixLt";i:7;s:13:"CollectErrors";i:7;s:13:"ColorKeywords";i:10;s:25:"ConvertDocumentToFragment";i:7;s:19:"AcceptFullDocuments";O:8:"stdClass":3:{s:9:"namespace";s:4:"Core";s:4:"name";s:25:"ConvertDocumentToFragment";s:7:"isAlias";b:1;}s:31:"DirectLexLineNumberSyncInterval";i:5;s:8:"Encoding";i:2;s:21:"EscapeInvalidChildren";i:7;s:17:"EscapeInvalidTags";i:7;s:24:"EscapeNonASCIICharacters";i:7;s:14:"HiddenElements";i:8;s:8:"Language";i:1;s:9:"LexerImpl";i:-11;s:19:"MaintainLineNumbers";i:-7;s:16:"RemoveInvalidImg";i:7;s:20:"RemoveScriptContents";i:-7;s:5:"XHTML";O:8:"stdClass":3:{s:9:"namespace";s:4:"HTML";s:4:"name";s:5:"XHTML";s:7:"isAlias";b:1;}s:21:"CommentScriptContents";O:8:"stdClass":3:{s:9:"namespace";s:6:"Output";s:4:"name";s:21:"CommentScriptContents";s:7:"isAlias";b:1;}s:10:"TidyFormat";O:8:"stdClass":3:{s:9:"namespace";s:6:"Output";s:4:"name";s:10:"TidyFormat";s:7:"isAlias";b:1;}}s:6:"Filter";a:5:{s:6:"Custom";i:9;s:18:"ExtractStyleBlocks";i:7;s:7:"YouTube";i:7;s:26:"ExtractStyleBlocksEscaping";O:8:"stdClass":3:{s:9:"namespace";s:11:"FilterParam";s:4:"name";s:26:"ExtractStyleBlocksEscaping";s:7:"isAlias";b:1;}s:23:"ExtractStyleBlocksScope";O:8:"stdClass":3:{s:9:"namespace";s:11:"FilterParam";s:4:"name";s:23:"ExtractStyleBlocksScope";s:7:"isAlias";b:1;}}s:11:"FilterParam";a:3:{s:26:"ExtractStyleBlocksEscaping";i:7;s:23:"ExtractStyleBlocksScope";i:-1;s:26:"ExtractStyleBlocksTidyImpl";i:-11;}s:4:"HTML";a:24:{s:12:"EnableAttrID";O:8:"stdClass":3:{s:9:"namespace";s:4:"Attr";s:4:"name";s:8:"EnableID";s:7:"isAlias";b:1;}s:7:"Allowed";i:-4;s:17:"AllowedAttributes";i:-8;s:15:"AllowedElements";i:-8;s:14:"AllowedModules";i:-8;s:12:"BlockWrapper";i:1;s:11:"CoreModules";i:8;s:13:"CustomDoctype";i:-1;s:12:"DefinitionID";i:-1;s:13:"DefinitionRev";i:5;s:7:"Doctype";O:8:"stdClass":3:{s:4:"type";i:1;s:10:"allow_null";b:1;s:7:"allowed";a:5:{s:22:"HTML 4.01 Transitional";b:1;s:16:"HTML 4.01 Strict";b:1;s:22:"XHTML 1.0 Transitional";b:1;s:16:"XHTML 1.0 Strict";b:1;s:9:"XHTML 1.1";b:1;}}s:19:"ForbiddenAttributes";i:8;s:17:"ForbiddenElements";i:8;s:12:"MaxImgLength";i:-5;s:6:"Parent";i:1;s:11:"Proprietary";i:7;s:9:"SafeEmbed";i:7;s:10:"SafeObject";i:7;s:6:"Strict";i:7;s:7:"TidyAdd";i:8;s:9:"TidyLevel";O:8:"stdClass":2:{s:4:"type";i:1;s:7:"allowed";a:4:{s:4:"none";b:1;s:5:"light";b:1;s:6:"medium";b:1;s:5:"heavy";b:1;}}s:10:"TidyRemove";i:8;s:7:"Trusted";i:7;s:5:"XHTML";i:7;}s:6:"Output";a:4:{s:21:"CommentScriptContents";i:7;s:7:"Newline";i:-1;s:8:"SortAttr";i:7;s:10:"TidyFormat";i:7;}s:4:"Test";a:1:{s:12:"ForceNoIconv";i:7;}s:3:"URI";a:16:{s:14:"AllowedSchemes";i:8;s:4:"Base";i:-1;s:13:"DefaultScheme";i:1;s:12:"DefinitionID";i:-1;s:13:"DefinitionRev";i:5;s:7:"Disable";i:7;s:15:"DisableExternal";i:7;s:24:"DisableExternalResources";i:7;s:16:"DisableResources";i:7;s:4:"Host";i:-1;s:13:"HostBlacklist";i:9;s:12:"MakeAbsolute";i:7;s:5:"Munge";i:-1;s:14:"MungeResources";i:7;s:14:"MungeSecretKey";i:-1;s:22:"OverrideAllowedSchemes";i:7;}}} \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt new file mode 100644 index 0000000..6cecfa2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt @@ -0,0 +1,11 @@ +Attr.AllowedFrameTargets +TYPE: lookup +DEFAULT: array() +--DESCRIPTION-- +Lookup table of all allowed link frame targets. Some commonly used link +targets include _blank, _self, _parent and _top. Values should be +lowercase, as validation will be done in a case-sensitive manner despite +W3C's recommendation. XHTML 1.0 Strict does not permit the target attribute +so this directive will have no effect in that doctype. XHTML 1.1 does not +enable the Target module by default, you will have to manually enable it +(see the module documentation for more details.) diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt new file mode 100644 index 0000000..26bbc37 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt @@ -0,0 +1,8 @@ +Attr.AllowedRel +TYPE: lookup +VERSION: 1.6.0 +DEFAULT: array() +--DESCRIPTION-- +List of allowed forward document relationships in the rel attribute. Common +values may be nofollow or print. By default, this is empty, meaning that no +document relationships are allowed. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt new file mode 100644 index 0000000..b007bc5 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt @@ -0,0 +1,8 @@ +Attr.AllowedRev +TYPE: lookup +VERSION: 1.6.0 +DEFAULT: array() +--DESCRIPTION-- +List of allowed reverse document relationships in the rev attribute. This +attribute is a bit of an edge-case; if you don't know what it is for, stay +away. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt new file mode 100644 index 0000000..f474a9c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt @@ -0,0 +1,9 @@ +Attr.DefaultImageAlt +TYPE: string/null +DEFAULT: null +--DESCRIPTION-- +This is the content of the alt tag of an image if the user had not +previously specified an alt attribute. This applies to all images without +a valid alt attribute, as opposed to %Attr.DefaultInvalidImageAlt, which +only applies to invalid images, and overrides in the case of an invalid image. +Default behavior with null is to use the basename of the src tag for the alt. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt new file mode 100644 index 0000000..3d5c45d --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt @@ -0,0 +1,8 @@ +Attr.DefaultInvalidImage +TYPE: string +DEFAULT: '' +--DESCRIPTION-- +This is the default image an img tag will be pointed to if it does not have +a valid src attribute. In future versions, we may allow the image tag to +be removed completely, but due to design issues, this is not possible right +now. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt new file mode 100644 index 0000000..cfc9f90 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt @@ -0,0 +1,7 @@ +Attr.DefaultInvalidImageAlt +TYPE: string +DEFAULT: 'Invalid image' +--DESCRIPTION-- +This is the content of the alt tag of an invalid image if the user had not +previously specified an alt attribute. It has no effect when the image is +valid but there was no alt attribute present. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt new file mode 100644 index 0000000..80296fc --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt @@ -0,0 +1,9 @@ +Attr.DefaultTextDir +TYPE: string +DEFAULT: 'ltr' +--DESCRIPTION-- +Defines the default text direction (ltr or rtl) of the document being +parsed. This generally is the same as the value of the dir attribute in +HTML, or ltr if that is not specified. +--ALLOWED-- +'ltr', 'rtl' diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt new file mode 100644 index 0000000..358d6d0 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt @@ -0,0 +1,15 @@ +Attr.EnableID +TYPE: bool +DEFAULT: false +VERSION: 1.2.0 +--DESCRIPTION-- +Allows the ID attribute in HTML. This is disabled by default due to the +fact that without proper configuration user input can easily break the +validation of a webpage by specifying an ID that is already on the +surrounding HTML. If you don't mind throwing caution to the wind, enable +this directive, but I strongly recommend you also consider blacklisting IDs +you use (%Attr.IDBlacklist) or prefixing all user supplied IDs +(%Attr.IDPrefix). When set to true HTML Purifier reverts to the behavior of +pre-1.2.0 versions. +--ALIASES-- +HTML.EnableAttrID diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt new file mode 100644 index 0000000..16fc46e --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt @@ -0,0 +1,4 @@ +Attr.IDBlacklist +TYPE: list +DEFAULT: array() +DESCRIPTION: Array of IDs not allowed in the document. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt new file mode 100644 index 0000000..98f7c5a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt @@ -0,0 +1,8 @@ +Attr.IDBlacklistRegexp +TYPE: string/null +VERSION: 1.6.0 +DEFAULT: NULL +--DESCRIPTION-- +PCRE regular expression to be matched against all IDs. If the expression is +matches, the ID is rejected. Use this with care: may cause significant +degradation. ID matching is done after all other validation. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt new file mode 100644 index 0000000..f996c08 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt @@ -0,0 +1,11 @@ +Attr.IDPrefix +TYPE: string +VERSION: 1.2.0 +DEFAULT: '' +--DESCRIPTION-- +String to prefix to IDs. If you have no idea what IDs your pages may use, +you may opt to simply add a prefix to all user-submitted ID attributes so +that they are still usable, but will not conflict with core page IDs. +Example: setting the directive to 'user_' will result in a user submitted +'foo' to become 'user_foo' Be sure to set %HTML.EnableAttrID to true +before using this. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt new file mode 100644 index 0000000..b403fa9 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt @@ -0,0 +1,13 @@ +Attr.IDPrefixLocal +TYPE: string +VERSION: 1.2.0 +DEFAULT: '' +--DESCRIPTION-- +Temporary prefix for IDs used in conjunction with %Attr.IDPrefix. If you +need to allow multiple sets of user content on web page, you may need to +have a seperate prefix that changes with each iteration. This way, +seperately submitted user content displayed on the same page doesn't +clobber each other. Ideal values are unique identifiers for the content it +represents (i.e. the id of the row in the database). Be sure to add a +seperator (like an underscore) at the end. Warning: this directive will +not work unless %Attr.IDPrefix is set to a non-empty value! diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.txt new file mode 100644 index 0000000..fb18894 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Attr.txt @@ -0,0 +1,2 @@ +Attr +DESCRIPTION: Features regarding attribute validation. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt new file mode 100644 index 0000000..e1f7a47 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt @@ -0,0 +1,30 @@ +AutoFormat.AutoParagraph +TYPE: bool +VERSION: 2.0.1 +DEFAULT: false +--DESCRIPTION-- + +

    + This directive turns on auto-paragraphing, where double newlines are + converted in to paragraphs whenever possible. Auto-paragraphing: +

    +
      +
    • Always applies to inline elements or text in the root node,
    • +
    • Applies to inline elements or text with double newlines in nodes + that allow paragraph tags,
    • +
    • Applies to double newlines in paragraph tags
    • +
    +

    + p tags must be allowed for this directive to take effect. + We do not use br tags for paragraphing, as that is + semantically incorrect. +

    +

    + To prevent auto-paragraphing as a content-producer, refrain from using + double-newlines except to specify a new paragraph or in contexts where + it has special meaning (whitespace usually has no meaning except in + tags like pre, so this should not be difficult.) To prevent + the paragraphing of inline text adjacent to block elements, wrap them + in div tags (the behavior is slightly different outside of + the root node.) +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt new file mode 100644 index 0000000..c5a363b --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt @@ -0,0 +1,12 @@ +AutoFormat.Custom +TYPE: list +VERSION: 2.0.1 +DEFAULT: array() +--DESCRIPTION-- + +

    + This directive can be used to add custom auto-format injectors. + Specify an array of injector names (class name minus the prefix) + or concrete implementations. Injector class must exist. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt new file mode 100644 index 0000000..5d3e9d3 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt @@ -0,0 +1,10 @@ +AutoFormat.DisplayLinkURI +TYPE: bool +VERSION: 3.2.0 +DEFAULT: false +--DESCRIPTION-- +

    + This directive turns on the in-text display of URIs in <a> tags, and disables + those links. For example, example becomes + example (http://example.com). +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt new file mode 100644 index 0000000..554086f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt @@ -0,0 +1,12 @@ +AutoFormat.Linkify +TYPE: bool +VERSION: 2.0.1 +DEFAULT: false +--DESCRIPTION-- + +

    + This directive turns on linkification, auto-linking http, ftp and + https URLs. a tags with the href attribute + must be allowed. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt new file mode 100644 index 0000000..c7bcaf2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt @@ -0,0 +1,12 @@ +AutoFormat.PurifierLinkify +TYPE: bool +VERSION: 2.0.1 +DEFAULT: false +--DESCRIPTION-- + +

    + Internal auto-formatter that converts configuration directives in + syntax %Namespace.Directive to links. a tags + with the href attribute must be allowed. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt new file mode 100644 index 0000000..161dc9a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt @@ -0,0 +1,44 @@ +AutoFormat.RemoveEmpty +TYPE: bool +VERSION: 3.2.0 +DEFAULT: false +--DESCRIPTION-- +

    + When enabled, HTML Purifier will attempt to remove empty elements that + contribute no semantic information to the document. The following types + of nodes will be removed: +

    +
    • + Tags with no attributes and no content, and that are not empty + elements (remove <a></a> but not + <br />), and +
    • +
    • + Tags with no content, except for:
        +
      • The colgroup element, or
      • +
      • + Elements with the id or name attribute, + when those attributes are permitted on those elements. +
      • +
    • +
    +

    + Please be very careful when using this functionality; while it may not + seem that empty elements contain useful information, they can alter the + layout of a document given appropriate styling. This directive is most + useful when you are processing machine-generated HTML, please avoid using + it on regular user HTML. +

    +

    + Elements that contain only whitespace will be treated as empty. Non-breaking + spaces, however, do not count as whitespace. +

    +

    + This algorithm is not perfect; you may still notice some empty tags, + particularly if a node had elements, but those elements were later removed + because they were not permitted in that context, or tags that, after + being auto-closed by another tag, where empty. This is for safety reasons + to prevent clever code from breaking validation. The general rule of thumb: + if a tag looked empty on the way end, it will get removed; if HTML Purifier + made it empty, it will stay. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.txt new file mode 100644 index 0000000..4a7b552 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.txt @@ -0,0 +1,2 @@ +AutoFormat +DESCRIPTION: Configuration for activating auto-formatting functionality (also known as Injectors) diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.PurifierLinkifyDocURL.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.PurifierLinkifyDocURL.txt new file mode 100644 index 0000000..79d3358 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.PurifierLinkifyDocURL.txt @@ -0,0 +1,12 @@ +AutoFormatParam.PurifierLinkifyDocURL +TYPE: string +VERSION: 2.0.1 +DEFAULT: '#%s' +--DESCRIPTION-- + +

    + Location of configuration documentation to link to, let %s substitute + into the configuration's namespace and directive names sans the percent + sign. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.txt new file mode 100644 index 0000000..0ed7884 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.txt @@ -0,0 +1,2 @@ +AutoFormatParam +DESCRIPTION: Configuration for customizing auto-formatting functionality diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt new file mode 100644 index 0000000..68f6990 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt @@ -0,0 +1,7 @@ +CSS.AllowImportant +TYPE: bool +DEFAULT: false +VERSION: 3.1.0 +--DESCRIPTION-- +This parameter determines whether or not !important cascade modifiers should +be allowed in user CSS. If false, !important will stripped. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt new file mode 100644 index 0000000..82ce132 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt @@ -0,0 +1,10 @@ +CSS.AllowTricky +TYPE: bool +DEFAULT: false +VERSION: 3.1.0 +--DESCRIPTION-- +This parameter determines whether or not to allow "tricky" CSS properties and +values. Tricky CSS properties/values can drastically modify page layout or +be used for deceptive practices but do not directly constitute a security risk. +For example, display:none; is considered a tricky property that +will only be allowed if this directive is set to true. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt new file mode 100644 index 0000000..82558f1 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt @@ -0,0 +1,17 @@ +CSS.AllowedProperties +TYPE: lookup/null +VERSION: 3.1.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + If HTML Purifier's style attributes set is unsatisfactory for your needs, + you can overload it with your own list of tags to allow. Note that this + method is subtractive: it does its job by taking away from HTML Purifier + usual feature set, so you cannot add an attribute that HTML Purifier never + supported in the first place. +

    +

    + Warning: If another directive conflicts with the + elements here, that directive will win and override. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt new file mode 100644 index 0000000..e1e5992 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt @@ -0,0 +1,11 @@ +CSS.DefinitionRev +TYPE: int +VERSION: 2.0.0 +DEFAULT: 1 +--DESCRIPTION-- + +

    + Revision identifier for your custom definition. See + %HTML.DefinitionRev for details. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt new file mode 100644 index 0000000..abe08fa --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt @@ -0,0 +1,15 @@ +CSS.MaxImgLength +TYPE: string/null +DEFAULT: '1200px' +VERSION: 3.1.1 +--DESCRIPTION-- +

    + This parameter sets the maximum allowed length on img tags, + effectively the width and height properties. + Only absolute units of measurement (in, pt, pc, mm, cm) and pixels (px) are allowed. This is + in place to prevent imagecrash attacks, disable with null at your own risk. + This directive is similar to %HTML.MaxImgLength, and both should be + concurrently edited, although there are + subtle differences in the input format (the CSS max is a number with + a unit). +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt new file mode 100644 index 0000000..c9c068f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt @@ -0,0 +1,10 @@ +CSS.Proprietary +TYPE: bool +VERSION: 3.0.0 +DEFAULT: false +--DESCRIPTION-- + +

    + Whether or not to allow safe, proprietary CSS values. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.txt new file mode 100644 index 0000000..060f5d3 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/CSS.txt @@ -0,0 +1,2 @@ +CSS +DESCRIPTION: Configuration regarding allowed CSS. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt new file mode 100644 index 0000000..e9fa699 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt @@ -0,0 +1,13 @@ +Cache.DefinitionImpl +TYPE: string/null +VERSION: 2.0.0 +DEFAULT: 'Serializer' +--DESCRIPTION-- + +This directive defines which method to use when caching definitions, +the complex data-type that makes HTML Purifier tick. Set to null +to disable caching (not recommended, as you will see a definite +performance degradation). + +--ALIASES-- +Core.DefinitionCache diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt new file mode 100644 index 0000000..3682cbb --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt @@ -0,0 +1,13 @@ +Cache.SerializerPath +TYPE: string/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + Absolute path with no trailing slash to store serialized definitions in. + Default is within the + HTML Purifier library inside DefinitionCache/Serializer. This + path must be writable by the webserver. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.txt new file mode 100644 index 0000000..2f7aaa2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Cache.txt @@ -0,0 +1,2 @@ +Cache +DESCRIPTION: Configuration for DefinitionCache and related subclasses. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt new file mode 100644 index 0000000..552bb6d --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt @@ -0,0 +1,17 @@ +Core.AggressivelyFixLt +TYPE: bool +VERSION: 2.1.0 +DEFAULT: true +--DESCRIPTION-- +

    + This directive enables aggressive pre-filter fixes HTML Purifier can + perform in order to ensure that open angled-brackets do not get killed + during parsing stage. Enabling this will result in two preg_replace_callback + calls and at least two preg_replace calls for every HTML document parsed; + if your users make very well-formed HTML, you can set this directive false. + This has no effect when DirectLex is used. +

    +

    + Notice: This directive's default turned from false to true + in HTML Purifier 3.2.0. +

    \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt new file mode 100644 index 0000000..dcf2056 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt @@ -0,0 +1,11 @@ +Core.CollectErrors +TYPE: bool +VERSION: 2.0.0 +DEFAULT: false +--DESCRIPTION-- + +Whether or not to collect errors found while filtering the document. This +is a useful way to give feedback to your users. Warning: +Currently this feature is very patchy and experimental, with lots of +possible error messages not yet implemented. It will not cause any +problems, but it may not help your users either. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt new file mode 100644 index 0000000..28c9682 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt @@ -0,0 +1,29 @@ +Core.ColorKeywords +TYPE: hash +VERSION: 2.0.0 +--DEFAULT-- +array ( + 'maroon' => '#800000', + 'red' => '#FF0000', + 'orange' => '#FFA500', + 'yellow' => '#FFFF00', + 'olive' => '#808000', + 'purple' => '#800080', + 'fuchsia' => '#FF00FF', + 'white' => '#FFFFFF', + 'lime' => '#00FF00', + 'green' => '#008000', + 'navy' => '#000080', + 'blue' => '#0000FF', + 'aqua' => '#00FFFF', + 'teal' => '#008080', + 'black' => '#000000', + 'silver' => '#C0C0C0', + 'gray' => '#808080', +) +--DESCRIPTION-- + +Lookup array of color names to six digit hexadecimal number corresponding +to color, with preceding hash mark. Used when parsing colors. + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt new file mode 100644 index 0000000..0f03d3a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt @@ -0,0 +1,13 @@ +Core.ConvertDocumentToFragment +TYPE: bool +DEFAULT: true +--DESCRIPTION-- + +This parameter determines whether or not the filter should convert +input that is a full document with html and body tags to a fragment +of just the contents of a body tag. This parameter is simply something +HTML Purifier can do during an edge-case: for most inputs, this +processing is not necessary. + +--ALIASES-- +Core.AcceptFullDocuments diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt new file mode 100644 index 0000000..392adb5 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt @@ -0,0 +1,17 @@ +Core.DirectLexLineNumberSyncInterval +TYPE: int +VERSION: 2.0.0 +DEFAULT: 0 +--DESCRIPTION-- + +

    + Specifies the number of tokens the DirectLex line number tracking + implementations should process before attempting to resyncronize the + current line count by manually counting all previous new-lines. When + at 0, this functionality is disabled. Lower values will decrease + performance, and this is only strictly necessary if the counting + algorithm is buggy (in which case you should report it as a bug). + This has no effect when %Core.MaintainLineNumbers is disabled or DirectLex is + not being used. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt new file mode 100644 index 0000000..9bca95c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt @@ -0,0 +1,14 @@ +Core.Encoding +TYPE: istring +DEFAULT: 'utf-8' +--DESCRIPTION-- +If for some reason you are unable to convert all webpages to UTF-8, you can +use this directive as a stop-gap compatibility change to let HTML Purifier +deal with non UTF-8 input. This technique has notable deficiencies: +absolutely no characters outside of the selected character encoding will be +preserved, not even the ones that have been ampersand escaped (this is due +to a UTF-8 specific feature that automatically resolves all +entities), making it pretty useless for anything except the most I18N-blind +applications, although %Core.EscapeNonASCIICharacters offers fixes this +trouble with another tradeoff. This directive only accepts ISO-8859-1 if +iconv is not enabled. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt new file mode 100644 index 0000000..cca96c6 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt @@ -0,0 +1,9 @@ +Core.EscapeInvalidChildren +TYPE: bool +DEFAULT: false +--DESCRIPTION-- +When true, a child is found that is not allowed in the context of the +parent element will be transformed into text as if it were ASCII. When +false, that element and all internal tags will be dropped, though text will +be preserved. There is no option for dropping the element but preserving +child nodes. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt new file mode 100644 index 0000000..6e02a19 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt @@ -0,0 +1,6 @@ +Core.EscapeInvalidTags +TYPE: bool +DEFAULT: false +--DESCRIPTION-- +When true, invalid tags will be written back to the document as plain text. +Otherwise, they are silently dropped. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt new file mode 100644 index 0000000..f8b7d38 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt @@ -0,0 +1,12 @@ +Core.EscapeNonASCIICharacters +TYPE: bool +VERSION: 1.4.0 +DEFAULT: false +--DESCRIPTION-- +This directive overcomes a deficiency in %Core.Encoding by blindly +converting all non-ASCII characters into decimal numeric entities before +converting it to its native encoding. This means that even characters that +can be expressed in the non-UTF-8 encoding will be entity-ized, which can +be a real downer for encodings like Big5. It also assumes that the ASCII +repetoire is available, although this is the case for almost all encodings. +Anyway, use UTF-8! diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt new file mode 100644 index 0000000..0a86d96 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt @@ -0,0 +1,19 @@ +Core.HiddenElements +TYPE: lookup +--DEFAULT-- +array ( + 'script' => true, + 'style' => true, +) +--DESCRIPTION-- + +

    + This directive is a lookup array of elements which should have their + contents removed when they are not allowed by the HTML definition. + For example, the contents of a script tag are not + normally shown in a document, so if script tags are to be removed, + their contents should be removed to. This is opposed to a b + tag, which defines some presentational changes but does not hide its + contents. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt new file mode 100644 index 0000000..1be6003 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt @@ -0,0 +1,11 @@ +Core.Language +TYPE: string +VERSION: 2.0.0 +DEFAULT: 'en' +--DESCRIPTION-- + +ISO 639 language code for localizable things in HTML Purifier to use, +which is mainly error reporting. There is currently only an English (en) +translation, so this directive is currently useless. + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt new file mode 100644 index 0000000..62125a4 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt @@ -0,0 +1,33 @@ +Core.LexerImpl +TYPE: mixed/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + This parameter determines what lexer implementation can be used. The + valid values are: +

    +
    +
    null
    +
    + Recommended, the lexer implementation will be auto-detected based on + your PHP-version and configuration. +
    +
    string lexer identifier
    +
    + This is a slim way of manually overridding the implementation. + Currently recognized values are: DOMLex (the default PHP5 +implementation) + and DirectLex (the default PHP4 implementation). Only use this if + you know what you are doing: usually, the auto-detection will + manage things for cases you aren't even aware of. +
    +
    object lexer instance
    +
    + Super-advanced: you can specify your own, custom, implementation that + implements the interface defined by HTMLPurifier_Lexer. + I may remove this option simply because I don't expect anyone + to use it. +
    +
    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt new file mode 100644 index 0000000..de10208 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt @@ -0,0 +1,16 @@ +Core.MaintainLineNumbers +TYPE: bool/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + If true, HTML Purifier will add line number information to all tokens. + This is useful when error reporting is turned on, but can result in + significant performance degradation and should not be used when + unnecessary. This directive must be used with the DirectLex lexer, + as the DOMLex lexer does not (yet) support this functionality. + If the value is null, an appropriate value will be selected based + on other configuration. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt new file mode 100644 index 0000000..7ac86b3 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt @@ -0,0 +1,12 @@ +Core.RemoveInvalidImg +TYPE: bool +DEFAULT: true +VERSION: 1.3.0 +--DESCRIPTION-- + +

    + This directive enables pre-emptive URI checking in img + tags, as the attribute validation strategy is not authorized to + remove elements from the document. Revert to pre-1.3.0 behavior by setting to false. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt new file mode 100644 index 0000000..531718b --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt @@ -0,0 +1,11 @@ +Core.RemoveScriptContents +TYPE: bool/null +DEFAULT: NULL +VERSION: 2.0.0 +DEPRECATED-VERSION: 2.1.0 +DEPRECATED-USE: Core.HiddenElements +--DESCRIPTION-- +

    + This directive enables HTML Purifier to remove not only script tags + but all of their contents. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.txt new file mode 100644 index 0000000..3240014 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Core.txt @@ -0,0 +1,2 @@ +Core +DESCRIPTION: Core features that are always available. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt new file mode 100644 index 0000000..be67d63 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt @@ -0,0 +1,10 @@ +Filter.Custom +TYPE: list +VERSION: 3.1.0 +DEFAULT: array() +--DESCRIPTION-- +

    + This directive can be used to add custom filters; it is nearly the + equivalent of the now deprecated HTMLPurifier->addFilter() + method. Specify an array of concrete implementations. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt new file mode 100644 index 0000000..bba9223 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt @@ -0,0 +1,73 @@ +Filter.ExtractStyleBlocks +TYPE: bool +VERSION: 3.1.0 +DEFAULT: false +EXTERNAL: CSSTidy +--DESCRIPTION-- +

    + This directive turns on the style block extraction filter, which removes + style blocks from input HTML, cleans them up with CSSTidy, + and places them in the StyleBlocks context variable, for further + use by you, usually to be placed in an external stylesheet, or a + style block in the head of your document. +

    +

    + Sample usage: +

    +
    ';
    +?>
    +
    +
    +
    +  Filter.ExtractStyleBlocks
    +body {color:#F00;} Some text';
    +
    +    $config = HTMLPurifier_Config::createDefault();
    +    $config->set('Filter', 'ExtractStyleBlocks', true);
    +    $purifier = new HTMLPurifier($config);
    +    
    +    $html = $purifier->purify($dirty);
    +    
    +    // This implementation writes the stylesheets to the styles/ directory.
    +    // You can also echo the styles inside the document, but it's a bit
    +    // more difficult to make sure they get interpreted properly by
    +    // browsers; try the usual CSS armoring techniques.
    +    $styles = $purifier->context->get('StyleBlocks');
    +    $dir = 'styles/';
    +    if (!is_dir($dir)) mkdir($dir);
    +    $hash = sha1($_GET['html']);
    +    foreach ($styles as $i => $style) {
    +        file_put_contents($name = $dir . $hash . "_$i");
    +        echo '';
    +    }
    +?>
    +
    +
    +  
    + +
    + + +]]>
    +

    + Warning: It is possible for a user to mount an + imagecrash attack using this CSS. Counter-measures are difficult; + it is not simply enough to limit the range of CSS lengths (using + relative lengths with many nesting levels allows for large values + to be attained without actually specifying them in the stylesheet), + and the flexible nature of selectors makes it difficult to selectively + disable lengths on image tags (HTML Purifier, however, does disable + CSS width and height in inline styling). There are probably two effective + counter measures: an explicit width and height set to auto in all + images in your document (unlikely) or the disabling of width and + height (somewhat reasonable). Whether or not these measures should be + used is left to the reader. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt new file mode 100644 index 0000000..cdcb379 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt @@ -0,0 +1,10 @@ +Filter.YouTube +TYPE: bool +VERSION: 3.1.0 +DEFAULT: false +--DESCRIPTION-- +

    + This directive enables YouTube video embedding in HTML Purifier. Check + this document + on embedding videos for more information on what this filter does. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.txt new file mode 100644 index 0000000..9fad43a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Filter.txt @@ -0,0 +1,2 @@ +Filter +DESCRIPTION: Directives for turning filters on and off, or specifying custom filters. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksEscaping.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksEscaping.txt new file mode 100644 index 0000000..d20010c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksEscaping.txt @@ -0,0 +1,14 @@ +FilterParam.ExtractStyleBlocksEscaping +TYPE: bool +VERSION: 3.0.0 +DEFAULT: true +ALIASES: Filter.ExtractStyleBlocksEscaping +--DESCRIPTION-- + +

    + Whether or not to escape the dangerous characters <, > and & + as \3C, \3E and \26, respectively. This is can be safely set to false + if the contents of StyleBlocks will be placed in an external stylesheet, + where there is no risk of it being interpreted as HTML. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksScope.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksScope.txt new file mode 100644 index 0000000..ec29078 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksScope.txt @@ -0,0 +1,28 @@ +FilterParam.ExtractStyleBlocksScope +TYPE: string/null +VERSION: 3.0.0 +DEFAULT: NULL +ALIASES: Filter.ExtractStyleBlocksScope +--DESCRIPTION-- + +

    + If you would like users to be able to define external stylesheets, but + only allow them to specify CSS declarations for a specific node and + prevent them from fiddling with other elements, use this directive. + It accepts any valid CSS selector, and will prepend this to any + CSS declaration extracted from the document. For example, if this + directive is set to #user-content and a user uses the + selector a:hover, the final selector will be + #user-content a:hover. +

    +

    + The comma shorthand may be used; consider the above example, with + #user-content, #user-content2, the final selector will + be #user-content a:hover, #user-content2 a:hover. +

    +

    + Warning: It is possible for users to bypass this measure + using a naughty + selector. This is a bug in CSS Tidy 1.3, not HTML + Purifier, and I am working to get it fixed. Until then, HTML Purifier + performs a basic check to prevent this. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksTidyImpl.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksTidyImpl.txt new file mode 100644 index 0000000..07250bf --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksTidyImpl.txt @@ -0,0 +1,14 @@ +FilterParam.ExtractStyleBlocksTidyImpl +TYPE: mixed/null +VERSION: 3.1.0 +DEFAULT: NULL +--DESCRIPTION-- +

    + If left NULL, HTML Purifier will attempt to instantiate a csstidy + class to use for internal cleaning. This will usually be good enough. +

    +

    + However, for trusted user input, you can set this to false to + disable cleaning. In addition, you can supply your own concrete implementation + of Tidy's interface to use, although I don't know why you'd want to do that. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.txt new file mode 100644 index 0000000..39305fa --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/FilterParam.txt @@ -0,0 +1,2 @@ +FilterParam +DESCRIPTION: Configuration for filters. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt new file mode 100644 index 0000000..9329eb1 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt @@ -0,0 +1,22 @@ +HTML.Allowed +TYPE: itext/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + This is a convenience directive that rolls the functionality of + %HTML.AllowedElements and %HTML.AllowedAttributes into one directive. + Specify elements and attributes that are allowed using: + element1[attr1|attr2],element2.... You can also use + newlines instead of commas to separate elements. +

    +

    + Warning: + All of the constraints on the component directives are still enforced. + The syntax is a subset of TinyMCE's valid_elements + whitelist: directly copy-pasting it here will probably result in + broken whitelists. If %HTML.AllowedElements or %HTML.AllowedAttributes + are set, this directive has no effect. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt new file mode 100644 index 0000000..6ff12fc --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt @@ -0,0 +1,19 @@ +HTML.AllowedAttributes +TYPE: lookup/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + If HTML Purifier's attribute set is unsatisfactory, overload it! + The syntax is "tag.attr" or "*.attr" for the global attributes + (style, id, class, dir, lang, xml:lang). +

    +

    + Warning: If another directive conflicts with the + elements here, that directive will win and override. For + example, %HTML.EnableAttrID will take precedence over *.id in this + directive. You must set that directive to true before you can use + IDs at all. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt new file mode 100644 index 0000000..031a300 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt @@ -0,0 +1,18 @@ +HTML.AllowedElements +TYPE: lookup/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- +

    + If HTML Purifier's tag set is unsatisfactory for your needs, you + can overload it with your own list of tags to allow. Note that this + method is subtractive: it does its job by taking away from HTML Purifier + usual feature set, so you cannot add a tag that HTML Purifier never + supported in the first place (like embed, form or head). If you + change this, you probably also want to change %HTML.AllowedAttributes. +

    +

    + Warning: If another directive conflicts with the + elements here, that directive will win and override. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt new file mode 100644 index 0000000..7b8367e --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt @@ -0,0 +1,20 @@ +HTML.AllowedModules +TYPE: lookup/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + A doctype comes with a set of usual modules to use. Without having + to mucking about with the doctypes, you can quickly activate or + disable these modules by specifying which modules you wish to allow + with this directive. This is most useful for unit testing specific + modules, although end users may find it useful for their own ends. +

    +

    + If you specify a module that does not exist, the manager will silently + fail to use it, so be careful! User-defined modules are not affected + by this directive. Modules defined in %HTML.CoreModules are not + affected by this directive. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt new file mode 100644 index 0000000..47fe143 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt @@ -0,0 +1,18 @@ +HTML.BlockWrapper +TYPE: string +VERSION: 1.3.0 +DEFAULT: 'p' +--DESCRIPTION-- + +

    + String name of element to wrap inline elements that are inside a block + context. This only occurs in the children of blockquote in strict mode. +

    +

    + Example: by default value, + <blockquote>Foo</blockquote> would become + <blockquote><p>Foo</p></blockquote>. + The <p> tags can be replaced with whatever you desire, + as long as it is a block level element. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt new file mode 100644 index 0000000..78bffdb --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt @@ -0,0 +1,23 @@ +HTML.CoreModules +TYPE: lookup +VERSION: 2.0.0 +--DEFAULT-- +array ( + 'Structure' => true, + 'Text' => true, + 'Hypertext' => true, + 'List' => true, + 'NonXMLCommonAttributes' => true, + 'XMLCommonAttributes' => true, + 'CommonAttributes' => true, +) +--DESCRIPTION-- + +

    + Certain modularized doctypes (XHTML, namely), have certain modules + that must be included for the doctype to be an conforming document + type: put those modules here. By default, XHTML's core modules + are used. You can set this to a blank array to disable core module + protection, but this is not recommended. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt new file mode 100644 index 0000000..4b6d39c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt @@ -0,0 +1,10 @@ +HTML.CustomDoctype +TYPE: string/null +VERSION: 2.0.1 +DEFAULT: NULL +--DESCRIPTION-- + +A custom doctype for power-users who defined there own document +type. This directive only applies when %HTML.Doctype is blank. + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt new file mode 100644 index 0000000..07f6b67 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt @@ -0,0 +1,33 @@ +HTML.DefinitionID +TYPE: string/null +DEFAULT: NULL +VERSION: 2.0.0 +--DESCRIPTION-- + +

    + Unique identifier for a custom-built HTML definition. If you edit + the raw version of the HTMLDefinition, introducing changes that the + configuration object does not reflect, you must specify this variable. + If you change your custom edits, you should change this directive, or + clear your cache. Example: +

    +
    +$config = HTMLPurifier_Config::createDefault();
    +$config->set('HTML', 'DefinitionID', '1');
    +$def = $config->getHTMLDefinition();
    +$def->addAttribute('a', 'tabindex', 'Number');
    +
    +

    + In the above example, the configuration is still at the defaults, but + using the advanced API, an extra attribute has been added. The + configuration object normally has no way of knowing that this change + has taken place, so it needs an extra directive: %HTML.DefinitionID. + If someone else attempts to use the default configuration, these two + pieces of code will not clobber each other in the cache, since one has + an extra directive attached to it. +

    +

    + You must specify a value to this directive to use the + advanced API features. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt new file mode 100644 index 0000000..dfee8e7 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt @@ -0,0 +1,16 @@ +HTML.DefinitionRev +TYPE: int +VERSION: 2.0.0 +DEFAULT: 1 +--DESCRIPTION-- + +

    + Revision identifier for your custom definition specified in + %HTML.DefinitionID. This serves the same purpose: uniquely identifying + your custom definition, but this one does so in a chronological + context: revision 3 is more up-to-date then revision 2. Thus, when + this gets incremented, the cache handling is smart enough to clean + up any older revisions of your definition as well as flush the + cache. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt new file mode 100644 index 0000000..1c58e2a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt @@ -0,0 +1,10 @@ +HTML.Doctype +TYPE: string/null +DEFAULT: NULL +--DESCRIPTION-- +Doctype to use during filtering. Technically speaking this is not actually +a doctype (as it does not identify a corresponding DTD), but we are using +this name for sake of simplicity. When non-blank, this will override any +older directives like %HTML.XHTML or %HTML.Strict. +--ALLOWED-- +'HTML 4.01 Transitional', 'HTML 4.01 Strict', 'XHTML 1.0 Transitional', 'XHTML 1.0 Strict', 'XHTML 1.1' diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt new file mode 100644 index 0000000..6a05388 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt @@ -0,0 +1,20 @@ +HTML.ForbiddenAttributes +TYPE: lookup +VERSION: 3.1.0 +DEFAULT: array() +--DESCRIPTION-- +

    + While this directive is similar to %HTML.AllowedAttributes, for + forwards-compatibility with XML, this attribute has a different syntax. Instead of + tag.attr, use tag@attr. To disallow href + attributes in a tags, set this directive to + a@href. You can also disallow an attribute globally with + attr or *@attr (either syntax is fine; the latter + is provided for consistency with %HTML.AllowedAttributes). +

    +

    + Warning: This directive complements %HTML.ForbiddenElements, + accordingly, check + out that directive for a discussion of why you + should think twice before using this directive. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt new file mode 100644 index 0000000..328eecf --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt @@ -0,0 +1,19 @@ +HTML.ForbiddenElements +TYPE: lookup +VERSION: 3.1.0 +DEFAULT: array() +--DESCRIPTION-- +

    + This was, perhaps, the most requested feature ever in HTML + Purifier. Please don't abuse it! This is the logical inverse of + %HTML.AllowedElements, and it will override that directive, or any + other directive. +

    +

    + If possible, %HTML.Allowed is recommended over this directive, because it + can sometimes be difficult to tell whether or not you've forbidden all of + the behavior you would like to disallow. If you forbid img + with the expectation of preventing images on your site, you'll be in for + a nasty surprise when people start using the background-image + CSS property. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt new file mode 100644 index 0000000..290d61e --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt @@ -0,0 +1,13 @@ +HTML.MaxImgLength +TYPE: int/null +DEFAULT: 1200 +VERSION: 3.1.1 +--DESCRIPTION-- +

    + This directive controls the maximum number of pixels in the width and + height attributes in img tags. This is + in place to prevent imagecrash attacks, disable with null at your own risk. + This directive is similar to %CSS.MaxImgLength, and both should be + concurrently edited, although there are + subtle differences in the input format (the HTML max is an integer). +

    \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt new file mode 100644 index 0000000..0e680f6 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt @@ -0,0 +1,12 @@ +HTML.Parent +TYPE: string +VERSION: 1.3.0 +DEFAULT: 'div' +--DESCRIPTION-- + +

    + String name of element that HTML fragment passed to library will be + inserted in. An interesting variation would be using span as the + parent element, meaning that only inline tags would be allowed. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt new file mode 100644 index 0000000..34b3203 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt @@ -0,0 +1,11 @@ +HTML.Proprietary +TYPE: bool +VERSION: 3.1.0 +DEFAULT: false +--DESCRIPTION-- +

    + Whether or not to allow proprietary elements and attributes in your + documents, as per HTMLPurifier_HTMLModule_Proprietary. + Warning: This can cause your documents to stop + validating! +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt new file mode 100644 index 0000000..7cff1c2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt @@ -0,0 +1,13 @@ +HTML.SafeEmbed +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

    + Whether or not to permit embed tags in documents, with a number of extra + security features added to prevent script execution. This is similar to + what websites like MySpace do to embed tags. Embed is a proprietary + element and will cause your website to stop validating. You probably want + to enable this with %HTML.SafeObject. + Highly experimental. +

    \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt new file mode 100644 index 0000000..7470999 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt @@ -0,0 +1,13 @@ +HTML.SafeObject +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

    + Whether or not to permit object tags in documents, with a number of extra + security features added to prevent script execution. This is similar to + what websites like MySpace do to object tags. You may also want to + enable %HTML.SafeEmbed for maximum interoperability with Internet Explorer, + although embed tags will cause your website to stop validating. + Highly experimental. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt new file mode 100644 index 0000000..39f8179 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt @@ -0,0 +1,8 @@ +HTML.Strict +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +DEPRECATED-VERSION: 1.7.0 +DEPRECATED-USE: HTML.Doctype +--DESCRIPTION-- +Determines whether or not to use Transitional (loose) or Strict rulesets. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt new file mode 100644 index 0000000..7bf3c6d --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt @@ -0,0 +1,8 @@ +HTML.TidyAdd +TYPE: lookup +VERSION: 2.0.0 +DEFAULT: array() +--DESCRIPTION-- + +Fixes to add to the default set of Tidy fixes as per your level. + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt new file mode 100644 index 0000000..7b98bc7 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt @@ -0,0 +1,23 @@ +HTML.TidyLevel +TYPE: string +VERSION: 2.0.0 +DEFAULT: 'medium' +--DESCRIPTION-- + +

    General level of cleanliness the Tidy module should enforce. +There are four allowed values:

    +
    +
    none
    +
    No extra tidying should be done
    +
    light
    +
    Only fix elements that would be discarded otherwise due to + lack of support in doctype
    +
    medium
    +
    Enforce best practices
    +
    heavy
    +
    Transform all deprecated elements and attributes to standards + compliant equivalents
    +
    + +--ALLOWED-- +'none', 'light', 'medium', 'heavy' diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt new file mode 100644 index 0000000..1e22069 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt @@ -0,0 +1,8 @@ +HTML.TidyRemove +TYPE: lookup +VERSION: 2.0.0 +DEFAULT: array() +--DESCRIPTION-- + +Fixes to remove from the default set of Tidy fixes as per your level. + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt new file mode 100644 index 0000000..9785137 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt @@ -0,0 +1,7 @@ +HTML.Trusted +TYPE: bool +VERSION: 2.0.0 +DEFAULT: false +--DESCRIPTION-- +Indicates whether or not the user input is trusted or not. If the input is +trusted, a more expansive set of allowed tags and attributes will be used. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt new file mode 100644 index 0000000..7909203 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt @@ -0,0 +1,10 @@ +HTML.XHTML +TYPE: bool +DEFAULT: true +VERSION: 1.1.0 +DEPRECATED-VERSION: 1.7.0 +DEPRECATED-USE: HTML.Doctype +--DESCRIPTION-- +Determines whether or not output is XHTML 1.0 or HTML 4.01 flavor. +--ALIASES-- +Core.XHTML diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.txt new file mode 100644 index 0000000..9b8b3a7 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/HTML.txt @@ -0,0 +1,2 @@ +HTML +DESCRIPTION: Configuration regarding allowed HTML. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt new file mode 100644 index 0000000..171b0ff --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt @@ -0,0 +1,9 @@ +Output.CommentScriptContents +TYPE: bool +VERSION: 2.0.0 +DEFAULT: true +--DESCRIPTION-- +Determines whether or not HTML Purifier should attempt to fix up the +contents of script tags for legacy browsers with comments. +--ALIASES-- +Core.CommentScriptContents diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt new file mode 100644 index 0000000..2021572 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt @@ -0,0 +1,13 @@ +Output.Newline +TYPE: string/null +VERSION: 2.0.1 +DEFAULT: NULL +--DESCRIPTION-- + +

    + Newline string to format final output with. If left null, HTML Purifier + will auto-detect the default newline type of the system and use that; + you can manually override it here. Remember, \r\n is Windows, \r + is Mac, and \n is Unix. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt new file mode 100644 index 0000000..c8c4e83 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt @@ -0,0 +1,13 @@ +Output.SortAttr +TYPE: bool +VERSION: 3.2.0 +DEFAULT: false +--DESCRIPTION-- +

    + If true, HTML Purifier will sort attributes by name before writing them back + to the document, converting a tag like: <el b="" a="" c="" /> + to <el a="" b="" c="" />. This is a workaround for + a bug in FCKeditor which causes it to swap attributes order, adding noise + to text diffs. If you're not seeing this bug, chances are, you don't need + this directive. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt new file mode 100644 index 0000000..5d7f29d --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt @@ -0,0 +1,24 @@ +Output.TidyFormat +TYPE: bool +VERSION: 1.1.1 +DEFAULT: false +--DESCRIPTION-- +

    + Determines whether or not to run Tidy on the final output for pretty + formatting reasons, such as indentation and wrap. +

    +

    + This can greatly improve readability for editors who are hand-editing + the HTML, but is by no means necessary as HTML Purifier has already + fixed all major errors the HTML may have had. Tidy is a non-default + extension, and this directive will silently fail if Tidy is not + available. +

    +

    + If you are looking to make the overall look of your page's source + better, I recommend running Tidy on the entire page rather than just + user-content (after all, the indentation relative to the containing + blocks will be incorrect). +

    +--ALIASES-- +Core.TidyFormat diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.txt new file mode 100644 index 0000000..134e141 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Output.txt @@ -0,0 +1,2 @@ +Output +DESCRIPTION: Configuration relating to the generation of (X)HTML. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt new file mode 100644 index 0000000..9933762 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt @@ -0,0 +1,6 @@ +Test.ForceNoIconv +TYPE: bool +DEFAULT: false +--DESCRIPTION-- +When set to true, HTMLPurifier_Encoder will act as if iconv does not exist +and use only pure PHP implementations. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Test.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Test.txt new file mode 100644 index 0000000..fec6f8d --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/Test.txt @@ -0,0 +1,2 @@ +Test +DESCRIPTION: Developer testing configuration for our unit tests. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt new file mode 100644 index 0000000..2686bac --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt @@ -0,0 +1,14 @@ +URI.AllowedSchemes +TYPE: lookup +--DEFAULT-- +array ( + 'http' => true, + 'https' => true, + 'mailto' => true, + 'ftp' => true, + 'nntp' => true, + 'news' => true, +) +--DESCRIPTION-- +Whitelist that defines the schemes that a URI is allowed to have. This +prevents XSS attacks from using pseudo-schemes like javascript or mocha. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt new file mode 100644 index 0000000..a0f8d97 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt @@ -0,0 +1,17 @@ +URI.Base +TYPE: string/null +VERSION: 2.1.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + The base URI is the URI of the document this purified HTML will be + inserted into. This information is important if HTML Purifier needs + to calculate absolute URIs from relative URIs, such as when %URI.MakeAbsolute + is on. You may use a non-absolute URI for this value, but behavior + may vary (%URI.MakeAbsolute deals nicely with both absolute and + relative paths, but forwards-compatibility is not guaranteed). + Warning: If set, the scheme on this URI + overrides the one specified by %URI.DefaultScheme. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt new file mode 100644 index 0000000..2f39c2f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt @@ -0,0 +1,10 @@ +URI.DefaultScheme +TYPE: string +DEFAULT: 'http' +--DESCRIPTION-- + +

    + Defines through what scheme the output will be served, in order to + select the proper object validator when no scheme information is present. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt new file mode 100644 index 0000000..20bfc1d --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt @@ -0,0 +1,11 @@ +URI.DefinitionID +TYPE: string/null +VERSION: 2.1.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + Unique identifier for a custom-built URI definition. If you want + to add custom URIFilters, you must specify this value. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt new file mode 100644 index 0000000..7dabdc6 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt @@ -0,0 +1,11 @@ +URI.DefinitionRev +TYPE: int +VERSION: 2.1.0 +DEFAULT: 1 +--DESCRIPTION-- + +

    + Revision identifier for your custom definition. See + %HTML.DefinitionRev for details. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt new file mode 100644 index 0000000..a97b2e2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt @@ -0,0 +1,13 @@ +URI.Disable +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +--DESCRIPTION-- + +

    + Disables all URIs in all forms. Not sure why you'd want to do that + (after all, the Internet's founded on the notion of a hyperlink). +

    + +--ALIASES-- +Attr.DisableURI diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt new file mode 100644 index 0000000..6d3ceba --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt @@ -0,0 +1,10 @@ +URI.DisableExternal +TYPE: bool +VERSION: 1.2.0 +DEFAULT: false +--DESCRIPTION-- +Disables links to external websites. This is a highly effective anti-spam +and anti-pagerank-leech measure, but comes at a hefty price: nolinks or +images outside of your domain will be allowed. Non-linkified URIs will +still be preserved. If you want to be able to link to subdomains or use +absolute URIs, specify %URI.Host for your website. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt new file mode 100644 index 0000000..37f5d13 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt @@ -0,0 +1,12 @@ +URI.DisableExternalResources +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +--DESCRIPTION-- +Disables the embedding of external resources, preventing users from +embedding things like images from other hosts. This prevents access +tracking (good for email viewers), bandwidth leeching, cross-site request +forging, goatse.cx posting, and other nasties, but also results in a loss +of end-user functionality (they can't directly post a pic they posted from +Flickr anymore). Use it if you don't have a robust user-content moderation +team. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt new file mode 100644 index 0000000..a456051 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt @@ -0,0 +1,12 @@ +URI.DisableResources +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +--DESCRIPTION-- + +

    + Disables embedding resources, essentially meaning no pictures. You can + still link to them though. See %URI.DisableExternalResources for why + this might be a good idea. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt new file mode 100644 index 0000000..15356ac --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt @@ -0,0 +1,19 @@ +URI.Host +TYPE: string/null +VERSION: 1.2.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + Defines the domain name of the server, so we can determine whether or + an absolute URI is from your website or not. Not strictly necessary, + as users should be using relative URIs to reference resources on your + website. It will, however, let you use absolute URIs to link to + subdomains of the domain you post here: i.e. example.com will allow + sub.example.com. However, higher up domains will still be excluded: + if you set %URI.Host to sub.example.com, example.com will be blocked. + Note: This directive overrides %URI.Base because + a given page may be on a sub-domain, but you wish HTML Purifier to be + more relaxed and allow some of the parent domains too. +

    + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt new file mode 100644 index 0000000..5f5cbc5 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt @@ -0,0 +1,8 @@ +URI.HostBlacklist +TYPE: list +VERSION: 1.3.0 +DEFAULT: array() +--DESCRIPTION-- +List of strings that are forbidden in the host of any URI. Use it to kill +domain names of spam, etc. Note that it will catch anything in the domain, +so moo.com will catch moo.com.example.com. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt new file mode 100644 index 0000000..2d2b40a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt @@ -0,0 +1,12 @@ +URI.MakeAbsolute +TYPE: bool +VERSION: 2.1.0 +DEFAULT: false +--DESCRIPTION-- + +

    + Converts all URIs into absolute forms. This is useful when the HTML + being filtered assumes a specific base path, but will actually be + viewed in a different context (and setting an alternate base URI is + not possible). %URI.Base must be set for this directive to work. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt new file mode 100644 index 0000000..7743ac2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt @@ -0,0 +1,82 @@ +URI.Munge +TYPE: string/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + Munges all browsable (usually http, https and ftp) + absolute URIs into another URI, usually a URI redirection service. + This directive accepts a URI, formatted with a %s where + the url-encoded original URI should be inserted (sample: + http://www.google.com/url?q=%s). +

    +

    + Uses for this directive: +

    +
      +
    • + Prevent PageRank leaks, while being fairly transparent + to users (you may also want to add some client side JavaScript to + override the text in the statusbar). Notice: + Many security experts believe that this form of protection does not deter spam-bots. +
    • +
    • + Redirect users to a splash page telling them they are leaving your + website. While this is poor usability practice, it is often mandated + in corporate environments. +
    • +
    +

    + Prior to HTML Purifier 3.1.1, this directive also enabled the munging + of browsable external resources, which could break things if your redirection + script was a splash page or used meta tags. To revert to + previous behavior, please use %URI.MungeResources. +

    +

    + You may want to also use %URI.MungeSecretKey along with this directive + in order to enforce what URIs your redirector script allows. Open + redirector scripts can be a security risk and negatively affect the + reputation of your domain name. +

    +

    + Starting with HTML Purifier 3.1.1, there is also these substitutions: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KeyDescriptionExample <a href="">
    %r1 - The URI embeds a resource
    (blank) - The URI is merely a link
    %nThe name of the tag this URI came froma
    %mThe name of the attribute this URI came fromhref
    %pThe name of the CSS property this URI came from, or blank if irrelevant
    +

    + Admittedly, these letters are somewhat arbitrary; the only stipulation + was that they couldn't be a through f. r is for resource (I would have preferred + e, but you take what you can get), n is for name, m + was picked because it came after n (and I couldn't use a), p is for + property. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt new file mode 100644 index 0000000..f86c3e0 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt @@ -0,0 +1,16 @@ +URI.MungeResources +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

    + If true, any URI munging directives like %URI.Munge + will also apply to embedded resources, such as <img src="">. + Be careful enabling this directive if you have a redirector script + that does not use the Location HTTP header; all of your images + and other embedded resources will break. +

    +

    + Warning: It is strongly advised you use this in conjunction + %URI.MungeSecretKey to mitigate the security risk of an open redirector. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt new file mode 100644 index 0000000..d52ccf4 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt @@ -0,0 +1,29 @@ +URI.MungeSecretKey +TYPE: string/null +VERSION: 3.1.1 +DEFAULT: NULL +--DESCRIPTION-- +

    + This directive enables secure checksum generation along with %URI.Munge. + It should be set to a secure key that is not shared with anyone else. + The checksum can be placed in the URI using %t. Use of this checksum + affords an additional level of protection by allowing a redirector + to check if a URI has passed through HTML Purifier with this line: +

    + +
    $checksum === sha1($secret_key . ':' . $url)
    + +

    + If the output is TRUE, the redirector script should accept the URI. +

    + +

    + Please note that it would still be possible for an attacker to procure + secure hashes en-mass by abusing your website's Preview feature or the + like, but this service affords an additional level of protection + that should be combined with website blacklisting. +

    + +

    + Remember this has no effect if %URI.Munge is not on. +

    diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt new file mode 100644 index 0000000..c75b133 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt @@ -0,0 +1,8 @@ +URI.OverrideAllowedSchemes +TYPE: bool +DEFAULT: true +--DESCRIPTION-- +If this is set to true (which it is by default), you can override +%URI.AllowedSchemes by simply registering a HTMLPurifier_URIScheme to the +registry. If false, you will also have to update that directive in order +to add more schemes. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.txt b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.txt new file mode 100644 index 0000000..114ecb1 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/URI.txt @@ -0,0 +1,2 @@ +URI +DESCRIPTION: Features regarding Uniform Resource Identifiers. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/info.ini b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/info.ini new file mode 100644 index 0000000..d189704 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ConfigSchema/schema/info.ini @@ -0,0 +1 @@ +name = "HTML Purifier" diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ContentSets.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ContentSets.php new file mode 100644 index 0000000..070b6f2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ContentSets.php @@ -0,0 +1,154 @@ + true) indexed by name. + * @note This is in HTMLPurifier_HTMLDefinition->info_content_sets + */ + public $lookup = array(); + + /** + * Synchronized list of defined content sets (keys of info) + */ + protected $keys = array(); + /** + * Synchronized list of defined content values (values of info) + */ + protected $values = array(); + + /** + * Merges in module's content sets, expands identifiers in the content + * sets and populates the keys, values and lookup member variables. + * @param $modules List of HTMLPurifier_HTMLModule + */ + public function __construct($modules) { + if (!is_array($modules)) $modules = array($modules); + // populate content_sets based on module hints + // sorry, no way of overloading + foreach ($modules as $module_i => $module) { + foreach ($module->content_sets as $key => $value) { + $temp = $this->convertToLookup($value); + if (isset($this->lookup[$key])) { + // add it into the existing content set + $this->lookup[$key] = array_merge($this->lookup[$key], $temp); + } else { + $this->lookup[$key] = $temp; + } + } + } + $old_lookup = false; + while ($old_lookup !== $this->lookup) { + $old_lookup = $this->lookup; + foreach ($this->lookup as $i => $set) { + $add = array(); + foreach ($set as $element => $x) { + if (isset($this->lookup[$element])) { + $add += $this->lookup[$element]; + unset($this->lookup[$i][$element]); + } + } + $this->lookup[$i] += $add; + } + } + + foreach ($this->lookup as $key => $lookup) { + $this->info[$key] = implode(' | ', array_keys($lookup)); + } + $this->keys = array_keys($this->info); + $this->values = array_values($this->info); + } + + /** + * Accepts a definition; generates and assigns a ChildDef for it + * @param $def HTMLPurifier_ElementDef reference + * @param $module Module that defined the ElementDef + */ + public function generateChildDef(&$def, $module) { + if (!empty($def->child)) return; // already done! + $content_model = $def->content_model; + if (is_string($content_model)) { + // Assume that $this->keys is alphanumeric + $def->content_model = preg_replace_callback( + '/\b(' . implode('|', $this->keys) . ')\b/', + array($this, 'generateChildDefCallback'), + $content_model + ); + //$def->content_model = str_replace( + // $this->keys, $this->values, $content_model); + } + $def->child = $this->getChildDef($def, $module); + } + + public function generateChildDefCallback($matches) { + return $this->info[$matches[0]]; + } + + /** + * Instantiates a ChildDef based on content_model and content_model_type + * member variables in HTMLPurifier_ElementDef + * @note This will also defer to modules for custom HTMLPurifier_ChildDef + * subclasses that need content set expansion + * @param $def HTMLPurifier_ElementDef to have ChildDef extracted + * @return HTMLPurifier_ChildDef corresponding to ElementDef + */ + public function getChildDef($def, $module) { + $value = $def->content_model; + if (is_object($value)) { + trigger_error( + 'Literal object child definitions should be stored in '. + 'ElementDef->child not ElementDef->content_model', + E_USER_NOTICE + ); + return $value; + } + switch ($def->content_model_type) { + case 'required': + return new HTMLPurifier_ChildDef_Required($value); + case 'optional': + return new HTMLPurifier_ChildDef_Optional($value); + case 'empty': + return new HTMLPurifier_ChildDef_Empty(); + case 'custom': + return new HTMLPurifier_ChildDef_Custom($value); + } + // defer to its module + $return = false; + if ($module->defines_child_def) { // save a func call + $return = $module->getChildDef($def); + } + if ($return !== false) return $return; + // error-out + trigger_error( + 'Could not determine which ChildDef class to instantiate', + E_USER_ERROR + ); + return false; + } + + /** + * Converts a string list of elements separated by pipes into + * a lookup array. + * @param $string List of elements + * @return Lookup array of elements + */ + protected function convertToLookup($string) { + $array = explode('|', str_replace(' ', '', $string)); + $ret = array(); + foreach ($array as $i => $k) { + $ret[$k] = true; + } + return $ret; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Context.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Context.php new file mode 100644 index 0000000..f213372 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Context.php @@ -0,0 +1,81 @@ +_storage[$name])) { + trigger_error("Name $name produces collision, cannot re-register", + E_USER_ERROR); + return; + } + $this->_storage[$name] =& $ref; + } + + /** + * Retrieves a variable reference from the context. + * @param $name String name + * @param $ignore_error Boolean whether or not to ignore error + */ + public function &get($name, $ignore_error = false) { + if (!isset($this->_storage[$name])) { + if (!$ignore_error) { + trigger_error("Attempted to retrieve non-existent variable $name", + E_USER_ERROR); + } + $var = null; // so we can return by reference + return $var; + } + return $this->_storage[$name]; + } + + /** + * Destorys a variable in the context. + * @param $name String name + */ + public function destroy($name) { + if (!isset($this->_storage[$name])) { + trigger_error("Attempted to destroy non-existent variable $name", + E_USER_ERROR); + return; + } + unset($this->_storage[$name]); + } + + /** + * Checks whether or not the variable exists. + * @param $name String name + */ + public function exists($name) { + return isset($this->_storage[$name]); + } + + /** + * Loads a series of variables from an associative array + * @param $context_array Assoc array of variables to load + */ + public function loadArray($context_array) { + foreach ($context_array as $key => $discard) { + $this->register($key, $context_array[$key]); + } + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Definition.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Definition.php new file mode 100644 index 0000000..ecbae63 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Definition.php @@ -0,0 +1,38 @@ +setup) return; + $this->setup = true; + $this->doSetup($config); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache.php new file mode 100644 index 0000000..a318a8e --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache.php @@ -0,0 +1,107 @@ +type = $type; + } + + /** + * Generates a unique identifier for a particular configuration + * @param Instance of HTMLPurifier_Config + */ + public function generateKey($config) { + return $config->version . ',' . // possibly replace with function calls + $config->getBatchSerial($this->type) . ',' . + $config->get($this->type, 'DefinitionRev'); + } + + /** + * Tests whether or not a key is old with respect to the configuration's + * version and revision number. + * @param $key Key to test + * @param $config Instance of HTMLPurifier_Config to test against + */ + public function isOld($key, $config) { + if (substr_count($key, ',') < 2) return true; + list($version, $hash, $revision) = explode(',', $key, 3); + $compare = version_compare($version, $config->version); + // version mismatch, is always old + if ($compare != 0) return true; + // versions match, ids match, check revision number + if ( + $hash == $config->getBatchSerial($this->type) && + $revision < $config->get($this->type, 'DefinitionRev') + ) return true; + return false; + } + + /** + * Checks if a definition's type jives with the cache's type + * @note Throws an error on failure + * @param $def Definition object to check + * @return Boolean true if good, false if not + */ + public function checkDefType($def) { + if ($def->type !== $this->type) { + trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}"); + return false; + } + return true; + } + + /** + * Adds a definition object to the cache + */ + abstract public function add($def, $config); + + /** + * Unconditionally saves a definition object to the cache + */ + abstract public function set($def, $config); + + /** + * Replace an object in the cache + */ + abstract public function replace($def, $config); + + /** + * Retrieves a definition object from the cache + */ + abstract public function get($config); + + /** + * Removes a definition object to the cache + */ + abstract public function remove($config); + + /** + * Clears all objects from cache + */ + abstract public function flush($config); + + /** + * Clears all expired (older version or revision) objects from cache + * @note Be carefuly implementing this method as flush. Flush must + * not interfere with other Definition types, and cleanup() + * should not be repeatedly called by userland code. + */ + abstract public function cleanup($config); + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator.php new file mode 100644 index 0000000..46de132 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator.php @@ -0,0 +1,61 @@ +copy(); + // reference is necessary for mocks in PHP 4 + $decorator->cache =& $cache; + $decorator->type = $cache->type; + return $decorator; + } + + /** + * Cross-compatible clone substitute + */ + public function copy() { + return new HTMLPurifier_DefinitionCache_Decorator(); + } + + public function add($def, $config) { + return $this->cache->add($def, $config); + } + + public function set($def, $config) { + return $this->cache->set($def, $config); + } + + public function replace($def, $config) { + return $this->cache->replace($def, $config); + } + + public function get($config) { + return $this->cache->get($config); + } + + public function remove($config) { + return $this->cache->remove($config); + } + + public function flush($config) { + return $this->cache->flush($config); + } + + public function cleanup($config) { + return $this->cache->cleanup($config); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php new file mode 100644 index 0000000..e2d8aa1 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php @@ -0,0 +1,42 @@ +definitions[$this->generateKey($config)] = $def; + return $status; + } + + public function set($def, $config) { + $status = parent::set($def, $config); + if ($status) $this->definitions[$this->generateKey($config)] = $def; + return $status; + } + + public function replace($def, $config) { + $status = parent::replace($def, $config); + if ($status) $this->definitions[$this->generateKey($config)] = $def; + return $status; + } + + public function get($config) { + $key = $this->generateKey($config); + if (isset($this->definitions[$key])) return $this->definitions[$key]; + $this->definitions[$key] = parent::get($config); + return $this->definitions[$key]; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in new file mode 100644 index 0000000..62235e2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in @@ -0,0 +1,46 @@ +checkDefType($def)) return; + $file = $this->generateFilePath($config); + if (file_exists($file)) return false; + if (!$this->_prepareDir($config)) return false; + return $this->_write($file, serialize($def)); + } + + public function set($def, $config) { + if (!$this->checkDefType($def)) return; + $file = $this->generateFilePath($config); + if (!$this->_prepareDir($config)) return false; + return $this->_write($file, serialize($def)); + } + + public function replace($def, $config) { + if (!$this->checkDefType($def)) return; + $file = $this->generateFilePath($config); + if (!file_exists($file)) return false; + if (!$this->_prepareDir($config)) return false; + return $this->_write($file, serialize($def)); + } + + public function get($config) { + $file = $this->generateFilePath($config); + if (!file_exists($file)) return false; + return unserialize(file_get_contents($file)); + } + + public function remove($config) { + $file = $this->generateFilePath($config); + if (!file_exists($file)) return false; + return unlink($file); + } + + public function flush($config) { + if (!$this->_prepareDir($config)) return false; + $dir = $this->generateDirectoryPath($config); + $dh = opendir($dir); + while (false !== ($filename = readdir($dh))) { + if (empty($filename)) continue; + if ($filename[0] === '.') continue; + unlink($dir . '/' . $filename); + } + } + + public function cleanup($config) { + if (!$this->_prepareDir($config)) return false; + $dir = $this->generateDirectoryPath($config); + $dh = opendir($dir); + while (false !== ($filename = readdir($dh))) { + if (empty($filename)) continue; + if ($filename[0] === '.') continue; + $key = substr($filename, 0, strlen($filename) - 4); + if ($this->isOld($key, $config)) unlink($dir . '/' . $filename); + } + } + + /** + * Generates the file path to the serial file corresponding to + * the configuration and definition name + * @todo Make protected + */ + public function generateFilePath($config) { + $key = $this->generateKey($config); + return $this->generateDirectoryPath($config) . '/' . $key . '.ser'; + } + + /** + * Generates the path to the directory contain this cache's serial files + * @note No trailing slash + * @todo Make protected + */ + public function generateDirectoryPath($config) { + $base = $this->generateBaseDirectoryPath($config); + return $base . '/' . $this->type; + } + + /** + * Generates path to base directory that contains all definition type + * serials + * @todo Make protected + */ + public function generateBaseDirectoryPath($config) { + $base = $config->get('Cache', 'SerializerPath'); + $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base; + return $base; + } + + /** + * Convenience wrapper function for file_put_contents + * @param $file File name to write to + * @param $data Data to write into file + * @return Number of bytes written if success, or false if failure. + */ + private function _write($file, $data) { + return file_put_contents($file, $data); + } + + /** + * Prepares the directory that this type stores the serials in + * @return True if successful + */ + private function _prepareDir($config) { + $directory = $this->generateDirectoryPath($config); + if (!is_dir($directory)) { + $base = $this->generateBaseDirectoryPath($config); + if (!is_dir($base)) { + trigger_error('Base directory '.$base.' does not exist, + please create or change using %Cache.SerializerPath', + E_USER_ERROR); + return false; + } elseif (!$this->_testPermissions($base)) { + return false; + } + $old = umask(0022); // disable group and world writes + mkdir($directory); + umask($old); + } elseif (!$this->_testPermissions($directory)) { + return false; + } + return true; + } + + /** + * Tests permissions on a directory and throws out friendly + * error messages and attempts to chmod it itself if possible + */ + private function _testPermissions($dir) { + // early abort, if it is writable, everything is hunky-dory + if (is_writable($dir)) return true; + if (!is_dir($dir)) { + // generally, you'll want to handle this beforehand + // so a more specific error message can be given + trigger_error('Directory '.$dir.' does not exist', + E_USER_ERROR); + return false; + } + if (function_exists('posix_getuid')) { + // POSIX system, we can give more specific advice + if (fileowner($dir) === posix_getuid()) { + // we can chmod it ourselves + chmod($dir, 0755); + return true; + } elseif (filegroup($dir) === posix_getgid()) { + $chmod = '775'; + } else { + // PHP's probably running as nobody, so we'll + // need to give global permissions + $chmod = '777'; + } + trigger_error('Directory '.$dir.' not writable, '. + 'please chmod to ' . $chmod, + E_USER_ERROR); + } else { + // generic error message + trigger_error('Directory '.$dir.' not writable, '. + 'please alter file permissions', + E_USER_ERROR); + } + return false; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/README b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/README new file mode 100644 index 0000000..59bde5c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCache/Serializer/README @@ -0,0 +1 @@ +This is a dummy file to prevent Git from ignoring this empty directory. diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCacheFactory.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCacheFactory.php new file mode 100644 index 0000000..fd6328f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DefinitionCacheFactory.php @@ -0,0 +1,90 @@ + array()); + protected $implementations = array(); + protected $decorators = array(); + + /** + * Initialize default decorators + */ + public function setup() { + $this->addDecorator('Cleanup'); + } + + /** + * Retrieves an instance of global definition cache factory. + */ + public static function instance($prototype = null) { + static $instance; + if ($prototype !== null) { + $instance = $prototype; + } elseif ($instance === null || $prototype === true) { + $instance = new HTMLPurifier_DefinitionCacheFactory(); + $instance->setup(); + } + return $instance; + } + + /** + * Registers a new definition cache object + * @param $short Short name of cache object, for reference + * @param $long Full class name of cache object, for construction + */ + public function register($short, $long) { + $this->implementations[$short] = $long; + } + + /** + * Factory method that creates a cache object based on configuration + * @param $name Name of definitions handled by cache + * @param $config Instance of HTMLPurifier_Config + */ + public function create($type, $config) { + $method = $config->get('Cache', 'DefinitionImpl'); + if ($method === null) { + return new HTMLPurifier_DefinitionCache_Null($type); + } + if (!empty($this->caches[$method][$type])) { + return $this->caches[$method][$type]; + } + if ( + isset($this->implementations[$method]) && + class_exists($class = $this->implementations[$method], false) + ) { + $cache = new $class($type); + } else { + if ($method != 'Serializer') { + trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING); + } + $cache = new HTMLPurifier_DefinitionCache_Serializer($type); + } + foreach ($this->decorators as $decorator) { + $new_cache = $decorator->decorate($cache); + // prevent infinite recursion in PHP 4 + unset($cache); + $cache = $new_cache; + } + $this->caches[$method][$type] = $cache; + return $this->caches[$method][$type]; + } + + /** + * Registers a decorator to add to all new cache objects + * @param + */ + public function addDecorator($decorator) { + if (is_string($decorator)) { + $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator"; + $decorator = new $class; + } + $this->decorators[$decorator->name] = $decorator; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Doctype.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Doctype.php new file mode 100644 index 0000000..63b48df --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Doctype.php @@ -0,0 +1,59 @@ +renderDoctype. + * If structure changes, please update that function. + */ +class HTMLPurifier_Doctype +{ + /** + * Full name of doctype + */ + public $name; + + /** + * List of standard modules (string identifiers or literal objects) + * that this doctype uses + */ + public $modules = array(); + + /** + * List of modules to use for tidying up code + */ + public $tidyModules = array(); + + /** + * Is the language derived from XML (i.e. XHTML)? + */ + public $xml = true; + + /** + * List of aliases for this doctype + */ + public $aliases = array(); + + /** + * Public DTD identifier + */ + public $dtdPublic; + + /** + * System DTD identifier + */ + public $dtdSystem; + + public function __construct($name = null, $xml = true, $modules = array(), + $tidyModules = array(), $aliases = array(), $dtd_public = null, $dtd_system = null + ) { + $this->name = $name; + $this->xml = $xml; + $this->modules = $modules; + $this->tidyModules = $tidyModules; + $this->aliases = $aliases; + $this->dtdPublic = $dtd_public; + $this->dtdSystem = $dtd_system; + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DoctypeRegistry.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DoctypeRegistry.php new file mode 100644 index 0000000..94c2cec --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/DoctypeRegistry.php @@ -0,0 +1,102 @@ +doctypes[$doctype->name] = $doctype; + $name = $doctype->name; + // hookup aliases + foreach ($doctype->aliases as $alias) { + if (isset($this->doctypes[$alias])) continue; + $this->aliases[$alias] = $name; + } + // remove old aliases + if (isset($this->aliases[$name])) unset($this->aliases[$name]); + return $doctype; + } + + /** + * Retrieves reference to a doctype of a certain name + * @note This function resolves aliases + * @note When possible, use the more fully-featured make() + * @param $doctype Name of doctype + * @return Editable doctype object + */ + public function get($doctype) { + if (isset($this->aliases[$doctype])) $doctype = $this->aliases[$doctype]; + if (!isset($this->doctypes[$doctype])) { + trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR); + $anon = new HTMLPurifier_Doctype($doctype); + return $anon; + } + return $this->doctypes[$doctype]; + } + + /** + * Creates a doctype based on a configuration object, + * will perform initialization on the doctype + * @note Use this function to get a copy of doctype that config + * can hold on to (this is necessary in order to tell + * Generator whether or not the current document is XML + * based or not). + */ + public function make($config) { + return clone $this->get($this->getDoctypeFromConfig($config)); + } + + /** + * Retrieves the doctype from the configuration object + */ + public function getDoctypeFromConfig($config) { + // recommended test + $doctype = $config->get('HTML', 'Doctype'); + if (!empty($doctype)) return $doctype; + $doctype = $config->get('HTML', 'CustomDoctype'); + if (!empty($doctype)) return $doctype; + // backwards-compatibility + if ($config->get('HTML', 'XHTML')) { + $doctype = 'XHTML 1.0'; + } else { + $doctype = 'HTML 4.01'; + } + if ($config->get('HTML', 'Strict')) { + $doctype .= ' Strict'; + } else { + $doctype .= ' Transitional'; + } + return $doctype; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ElementDef.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ElementDef.php new file mode 100644 index 0000000..460fc17 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ElementDef.php @@ -0,0 +1,161 @@ +setup(), this array may also + * contain an array at index 0 that indicates which attribute + * collections to load into the full array. It may also + * contain string indentifiers in lieu of HTMLPurifier_AttrDef, + * see HTMLPurifier_AttrTypes on how they are expanded during + * HTMLPurifier_HTMLDefinition->setup() processing. + */ + public $attr = array(); + + /** + * Indexed list of tag's HTMLPurifier_AttrTransform to be done before validation + */ + public $attr_transform_pre = array(); + + /** + * Indexed list of tag's HTMLPurifier_AttrTransform to be done after validation + */ + public $attr_transform_post = array(); + + /** + * HTMLPurifier_ChildDef of this tag. + */ + public $child; + + /** + * Abstract string representation of internal ChildDef rules. See + * HTMLPurifier_ContentSets for how this is parsed and then transformed + * into an HTMLPurifier_ChildDef. + * @warning This is a temporary variable that is not available after + * being processed by HTMLDefinition + */ + public $content_model; + + /** + * Value of $child->type, used to determine which ChildDef to use, + * used in combination with $content_model. + * @warning This must be lowercase + * @warning This is a temporary variable that is not available after + * being processed by HTMLDefinition + */ + public $content_model_type; + + + + /** + * Does the element have a content model (#PCDATA | Inline)*? This + * is important for chameleon ins and del processing in + * HTMLPurifier_ChildDef_Chameleon. Dynamically set: modules don't + * have to worry about this one. + */ + public $descendants_are_inline = false; + + /** + * List of the names of required attributes this element has. Dynamically + * populated by HTMLPurifier_HTMLDefinition::getElement + */ + public $required_attr = array(); + + /** + * Lookup table of tags excluded from all descendants of this tag. + * @note SGML permits exclusions for all descendants, but this is + * not possible with DTDs or XML Schemas. W3C has elected to + * use complicated compositions of content_models to simulate + * exclusion for children, but we go the simpler, SGML-style + * route of flat-out exclusions, which correctly apply to + * all descendants and not just children. Note that the XHTML + * Modularization Abstract Modules are blithely unaware of such + * distinctions. + */ + public $excludes = array(); + + /** + * Low-level factory constructor for creating new standalone element defs + */ + public static function create($content_model, $content_model_type, $attr) { + $def = new HTMLPurifier_ElementDef(); + $def->content_model = $content_model; + $def->content_model_type = $content_model_type; + $def->attr = $attr; + return $def; + } + + /** + * Merges the values of another element definition into this one. + * Values from the new element def take precedence if a value is + * not mergeable. + */ + public function mergeIn($def) { + + // later keys takes precedence + foreach($def->attr as $k => $v) { + if ($k === 0) { + // merge in the includes + // sorry, no way to override an include + foreach ($v as $v2) { + $this->attr[0][] = $v2; + } + continue; + } + if ($v === false) { + if (isset($this->attr[$k])) unset($this->attr[$k]); + continue; + } + $this->attr[$k] = $v; + } + $this->_mergeAssocArray($this->attr_transform_pre, $def->attr_transform_pre); + $this->_mergeAssocArray($this->attr_transform_post, $def->attr_transform_post); + $this->_mergeAssocArray($this->excludes, $def->excludes); + + if(!empty($def->content_model)) { + $this->content_model .= ' | ' . $def->content_model; + $this->child = false; + } + if(!empty($def->content_model_type)) { + $this->content_model_type = $def->content_model_type; + $this->child = false; + } + if(!is_null($def->child)) $this->child = $def->child; + if($def->descendants_are_inline) $this->descendants_are_inline = $def->descendants_are_inline; + + } + + /** + * Merges one array into another, removes values which equal false + * @param $a1 Array by reference that is merged into + * @param $a2 Array that merges into $a1 + */ + private function _mergeAssocArray(&$a1, $a2) { + foreach ($a2 as $k => $v) { + if ($v === false) { + if (isset($a1[$k])) unset($a1[$k]); + continue; + } + $a1[$k] = $v; + } + } + +} + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Encoder.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Encoder.php new file mode 100644 index 0000000..cb239f8 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Encoder.php @@ -0,0 +1,419 @@ + under the + * LGPL license. Notes on what changed are inside, but in general, + * the original code transformed UTF-8 text into an array of integer + * Unicode codepoints. Understandably, transforming that back to + * a string would be somewhat expensive, so the function was modded to + * directly operate on the string. However, this discourages code + * reuse, and the logic enumerated here would be useful for any + * function that needs to be able to understand UTF-8 characters. + * As of right now, only smart lossless character encoding converters + * would need that, and I'm probably not going to implement them. + * Once again, PHP 6 should solve all our problems. + */ + public static function cleanUTF8($str, $force_php = false) { + + // UTF-8 validity is checked since PHP 4.3.5 + // This is an optimization: if the string is already valid UTF-8, no + // need to do PHP stuff. 99% of the time, this will be the case. + // The regexp matches the XML char production, as well as well as excluding + // non-SGML codepoints U+007F to U+009F + if (preg_match('/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du', $str)) { + return $str; + } + + $mState = 0; // cached expected number of octets after the current octet + // until the beginning of the next UTF8 character sequence + $mUcs4 = 0; // cached Unicode character + $mBytes = 1; // cached expected number of octets in the current sequence + + // original code involved an $out that was an array of Unicode + // codepoints. Instead of having to convert back into UTF-8, we've + // decided to directly append valid UTF-8 characters onto a string + // $out once they're done. $char accumulates raw bytes, while $mUcs4 + // turns into the Unicode code point, so there's some redundancy. + + $out = ''; + $char = ''; + + $len = strlen($str); + for($i = 0; $i < $len; $i++) { + $in = ord($str{$i}); + $char .= $str[$i]; // append byte to char + if (0 == $mState) { + // When mState is zero we expect either a US-ASCII character + // or a multi-octet sequence. + if (0 == (0x80 & ($in))) { + // US-ASCII, pass straight through. + if (($in <= 31 || $in == 127) && + !($in == 9 || $in == 13 || $in == 10) // save \r\t\n + ) { + // control characters, remove + } else { + $out .= $char; + } + // reset + $char = ''; + $mBytes = 1; + } elseif (0xC0 == (0xE0 & ($in))) { + // First octet of 2 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x1F) << 6; + $mState = 1; + $mBytes = 2; + } elseif (0xE0 == (0xF0 & ($in))) { + // First octet of 3 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x0F) << 12; + $mState = 2; + $mBytes = 3; + } elseif (0xF0 == (0xF8 & ($in))) { + // First octet of 4 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x07) << 18; + $mState = 3; + $mBytes = 4; + } elseif (0xF8 == (0xFC & ($in))) { + // First octet of 5 octet sequence. + // + // This is illegal because the encoded codepoint must be + // either: + // (a) not the shortest form or + // (b) outside the Unicode range of 0-0x10FFFF. + // Rather than trying to resynchronize, we will carry on + // until the end of the sequence and let the later error + // handling code catch it. + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x03) << 24; + $mState = 4; + $mBytes = 5; + } elseif (0xFC == (0xFE & ($in))) { + // First octet of 6 octet sequence, see comments for 5 + // octet sequence. + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 1) << 30; + $mState = 5; + $mBytes = 6; + } else { + // Current octet is neither in the US-ASCII range nor a + // legal first octet of a multi-octet sequence. + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char = ''; + } + } else { + // When mState is non-zero, we expect a continuation of the + // multi-octet sequence + if (0x80 == (0xC0 & ($in))) { + // Legal continuation. + $shift = ($mState - 1) * 6; + $tmp = $in; + $tmp = ($tmp & 0x0000003F) << $shift; + $mUcs4 |= $tmp; + + if (0 == --$mState) { + // End of the multi-octet sequence. mUcs4 now contains + // the final Unicode codepoint to be output + + // Check for illegal sequences and codepoints. + + // From Unicode 3.1, non-shortest form is illegal + if (((2 == $mBytes) && ($mUcs4 < 0x0080)) || + ((3 == $mBytes) && ($mUcs4 < 0x0800)) || + ((4 == $mBytes) && ($mUcs4 < 0x10000)) || + (4 < $mBytes) || + // From Unicode 3.2, surrogate characters = illegal + (($mUcs4 & 0xFFFFF800) == 0xD800) || + // Codepoints outside the Unicode range are illegal + ($mUcs4 > 0x10FFFF) + ) { + + } elseif (0xFEFF != $mUcs4 && // omit BOM + // check for valid Char unicode codepoints + ( + 0x9 == $mUcs4 || + 0xA == $mUcs4 || + 0xD == $mUcs4 || + (0x20 <= $mUcs4 && 0x7E >= $mUcs4) || + // 7F-9F is not strictly prohibited by XML, + // but it is non-SGML, and thus we don't allow it + (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) || + (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4) + ) + ) { + $out .= $char; + } + // initialize UTF8 cache (reset) + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char = ''; + } + } else { + // ((0xC0 & (*in) != 0x80) && (mState != 0)) + // Incomplete multi-octet sequence. + // used to result in complete fail, but we'll reset + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char =''; + } + } + } + return $out; + } + + /** + * Translates a Unicode codepoint into its corresponding UTF-8 character. + * @note Based on Feyd's function at + * , + * which is in public domain. + * @note While we're going to do code point parsing anyway, a good + * optimization would be to refuse to translate code points that + * are non-SGML characters. However, this could lead to duplication. + * @note This is very similar to the unichr function in + * maintenance/generate-entity-file.php (although this is superior, + * due to its sanity checks). + */ + + // +----------+----------+----------+----------+ + // | 33222222 | 22221111 | 111111 | | + // | 10987654 | 32109876 | 54321098 | 76543210 | bit + // +----------+----------+----------+----------+ + // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F + // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF + // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF + // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF + // +----------+----------+----------+----------+ + // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF) + // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes + // +----------+----------+----------+----------+ + + public static function unichr($code) { + if($code > 1114111 or $code < 0 or + ($code >= 55296 and $code <= 57343) ) { + // bits are set outside the "valid" range as defined + // by UNICODE 4.1.0 + return ''; + } + + $x = $y = $z = $w = 0; + if ($code < 128) { + // regular ASCII character + $x = $code; + } else { + // set up bits for UTF-8 + $x = ($code & 63) | 128; + if ($code < 2048) { + $y = (($code & 2047) >> 6) | 192; + } else { + $y = (($code & 4032) >> 6) | 128; + if($code < 65536) { + $z = (($code >> 12) & 15) | 224; + } else { + $z = (($code >> 12) & 63) | 128; + $w = (($code >> 18) & 7) | 240; + } + } + } + // set up the actual character + $ret = ''; + if($w) $ret .= chr($w); + if($z) $ret .= chr($z); + if($y) $ret .= chr($y); + $ret .= chr($x); + + return $ret; + } + + /** + * Converts a string to UTF-8 based on configuration. + */ + public static function convertToUTF8($str, $config, $context) { + $encoding = $config->get('Core', 'Encoding'); + if ($encoding === 'utf-8') return $str; + static $iconv = null; + if ($iconv === null) $iconv = function_exists('iconv'); + set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler')); + if ($iconv && !$config->get('Test', 'ForceNoIconv')) { + $str = iconv($encoding, 'utf-8//IGNORE', $str); + if ($str === false) { + // $encoding is not a valid encoding + restore_error_handler(); + trigger_error('Invalid encoding ' . $encoding, E_USER_ERROR); + return ''; + } + // If the string is bjorked by Shift_JIS or a similar encoding + // that doesn't support all of ASCII, convert the naughty + // characters to their true byte-wise ASCII/UTF-8 equivalents. + $str = strtr($str, HTMLPurifier_Encoder::testEncodingSupportsASCII($encoding)); + restore_error_handler(); + return $str; + } elseif ($encoding === 'iso-8859-1') { + $str = utf8_encode($str); + restore_error_handler(); + return $str; + } + trigger_error('Encoding not supported, please install iconv', E_USER_ERROR); + } + + /** + * Converts a string from UTF-8 based on configuration. + * @note Currently, this is a lossy conversion, with unexpressable + * characters being omitted. + */ + public static function convertFromUTF8($str, $config, $context) { + $encoding = $config->get('Core', 'Encoding'); + if ($encoding === 'utf-8') return $str; + static $iconv = null; + if ($iconv === null) $iconv = function_exists('iconv'); + if ($escape = $config->get('Core', 'EscapeNonASCIICharacters')) { + $str = HTMLPurifier_Encoder::convertToASCIIDumbLossless($str); + } + set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler')); + if ($iconv && !$config->get('Test', 'ForceNoIconv')) { + // Undo our previous fix in convertToUTF8, otherwise iconv will barf + $ascii_fix = HTMLPurifier_Encoder::testEncodingSupportsASCII($encoding); + if (!$escape && !empty($ascii_fix)) { + $clear_fix = array(); + foreach ($ascii_fix as $utf8 => $native) $clear_fix[$utf8] = ''; + $str = strtr($str, $clear_fix); + } + $str = strtr($str, array_flip($ascii_fix)); + // Normal stuff + $str = iconv('utf-8', $encoding . '//IGNORE', $str); + restore_error_handler(); + return $str; + } elseif ($encoding === 'iso-8859-1') { + $str = utf8_decode($str); + restore_error_handler(); + return $str; + } + trigger_error('Encoding not supported', E_USER_ERROR); + } + + /** + * Lossless (character-wise) conversion of HTML to ASCII + * @param $str UTF-8 string to be converted to ASCII + * @returns ASCII encoded string with non-ASCII character entity-ized + * @warning Adapted from MediaWiki, claiming fair use: this is a common + * algorithm. If you disagree with this license fudgery, + * implement it yourself. + * @note Uses decimal numeric entities since they are best supported. + * @note This is a DUMB function: it has no concept of keeping + * character entities that the projected character encoding + * can allow. We could possibly implement a smart version + * but that would require it to also know which Unicode + * codepoints the charset supported (not an easy task). + * @note Sort of with cleanUTF8() but it assumes that $str is + * well-formed UTF-8 + */ + public static function convertToASCIIDumbLossless($str) { + $bytesleft = 0; + $result = ''; + $working = 0; + $len = strlen($str); + for( $i = 0; $i < $len; $i++ ) { + $bytevalue = ord( $str[$i] ); + if( $bytevalue <= 0x7F ) { //0xxx xxxx + $result .= chr( $bytevalue ); + $bytesleft = 0; + } elseif( $bytevalue <= 0xBF ) { //10xx xxxx + $working = $working << 6; + $working += ($bytevalue & 0x3F); + $bytesleft--; + if( $bytesleft <= 0 ) { + $result .= "&#" . $working . ";"; + } + } elseif( $bytevalue <= 0xDF ) { //110x xxxx + $working = $bytevalue & 0x1F; + $bytesleft = 1; + } elseif( $bytevalue <= 0xEF ) { //1110 xxxx + $working = $bytevalue & 0x0F; + $bytesleft = 2; + } else { //1111 0xxx + $working = $bytevalue & 0x07; + $bytesleft = 3; + } + } + return $result; + } + + /** + * This expensive function tests whether or not a given character + * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will + * fail this test, and require special processing. Variable width + * encodings shouldn't ever fail. + * + * @param string $encoding Encoding name to test, as per iconv format + * @param bool $bypass Whether or not to bypass the precompiled arrays. + * @return Array of UTF-8 characters to their corresponding ASCII, + * which can be used to "undo" any overzealous iconv action. + */ + public static function testEncodingSupportsASCII($encoding, $bypass = false) { + static $encodings = array(); + if (!$bypass) { + if (isset($encodings[$encoding])) return $encodings[$encoding]; + $lenc = strtolower($encoding); + switch ($lenc) { + case 'shift_jis': + return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~'); + case 'johab': + return array("\xE2\x82\xA9" => '\\'); + } + if (strpos($lenc, 'iso-8859-') === 0) return array(); + } + $ret = array(); + set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler')); + if (iconv('UTF-8', $encoding, 'a') === false) return false; + for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars + $c = chr($i); + if (iconv('UTF-8', "$encoding//IGNORE", $c) === '') { + // Reverse engineer: what's the UTF-8 equiv of this byte + // sequence? This assumes that there's no variable width + // encoding that doesn't support ASCII. + $ret[iconv($encoding, 'UTF-8//IGNORE', $c)] = $c; + } + } + restore_error_handler(); + $encodings[$encoding] = $ret; + return $ret; + } + + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityLookup.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityLookup.php new file mode 100644 index 0000000..2ecc52b --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityLookup.php @@ -0,0 +1,43 @@ +table = unserialize(file_get_contents($file)); + } + + /** + * Retrieves sole instance of the object. + * @param Optional prototype of custom lookup table to overload with. + */ + public static function instance($prototype = false) { + // no references, since PHP doesn't copy unless modified + static $instance = null; + if ($prototype) { + $instance = $prototype; + } elseif (!$instance) { + $instance = new HTMLPurifier_EntityLookup(); + $instance->setup(); + } + return $instance; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityLookup/entities.ser b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityLookup/entities.ser new file mode 100644 index 0000000..f2b8b8f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityLookup/entities.ser @@ -0,0 +1 @@ +a:246:{s:4:"nbsp";s:2:" ";s:5:"iexcl";s:2:"¡";s:4:"cent";s:2:"¢";s:5:"pound";s:2:"£";s:6:"curren";s:2:"¤";s:3:"yen";s:2:"¥";s:6:"brvbar";s:2:"¦";s:4:"sect";s:2:"§";s:3:"uml";s:2:"¨";s:4:"copy";s:2:"©";s:4:"ordf";s:2:"ª";s:5:"laquo";s:2:"«";s:3:"not";s:2:"¬";s:3:"shy";s:2:"­";s:3:"reg";s:2:"®";s:4:"macr";s:2:"¯";s:3:"deg";s:2:"°";s:6:"plusmn";s:2:"±";s:5:"acute";s:2:"´";s:5:"micro";s:2:"µ";s:4:"para";s:2:"¶";s:6:"middot";s:2:"·";s:5:"cedil";s:2:"¸";s:4:"ordm";s:2:"º";s:5:"raquo";s:2:"»";s:6:"iquest";s:2:"¿";s:6:"Agrave";s:2:"À";s:6:"Aacute";s:2:"Á";s:5:"Acirc";s:2:"Â";s:6:"Atilde";s:2:"Ã";s:4:"Auml";s:2:"Ä";s:5:"Aring";s:2:"Å";s:5:"AElig";s:2:"Æ";s:6:"Ccedil";s:2:"Ç";s:6:"Egrave";s:2:"È";s:6:"Eacute";s:2:"É";s:5:"Ecirc";s:2:"Ê";s:4:"Euml";s:2:"Ë";s:6:"Igrave";s:2:"Ì";s:6:"Iacute";s:2:"Í";s:5:"Icirc";s:2:"Î";s:4:"Iuml";s:2:"Ï";s:3:"ETH";s:2:"Ð";s:6:"Ntilde";s:2:"Ñ";s:6:"Ograve";s:2:"Ò";s:6:"Oacute";s:2:"Ó";s:5:"Ocirc";s:2:"Ô";s:6:"Otilde";s:2:"Õ";s:4:"Ouml";s:2:"Ö";s:5:"times";s:2:"×";s:6:"Oslash";s:2:"Ø";s:6:"Ugrave";s:2:"Ù";s:6:"Uacute";s:2:"Ú";s:5:"Ucirc";s:2:"Û";s:4:"Uuml";s:2:"Ü";s:6:"Yacute";s:2:"Ý";s:5:"THORN";s:2:"Þ";s:5:"szlig";s:2:"ß";s:6:"agrave";s:2:"à";s:6:"aacute";s:2:"á";s:5:"acirc";s:2:"â";s:6:"atilde";s:2:"ã";s:4:"auml";s:2:"ä";s:5:"aring";s:2:"å";s:5:"aelig";s:2:"æ";s:6:"ccedil";s:2:"ç";s:6:"egrave";s:2:"è";s:6:"eacute";s:2:"é";s:5:"ecirc";s:2:"ê";s:4:"euml";s:2:"ë";s:6:"igrave";s:2:"ì";s:6:"iacute";s:2:"í";s:5:"icirc";s:2:"î";s:4:"iuml";s:2:"ï";s:3:"eth";s:2:"ð";s:6:"ntilde";s:2:"ñ";s:6:"ograve";s:2:"ò";s:6:"oacute";s:2:"ó";s:5:"ocirc";s:2:"ô";s:6:"otilde";s:2:"õ";s:4:"ouml";s:2:"ö";s:6:"divide";s:2:"÷";s:6:"oslash";s:2:"ø";s:6:"ugrave";s:2:"ù";s:6:"uacute";s:2:"ú";s:5:"ucirc";s:2:"û";s:4:"uuml";s:2:"ü";s:6:"yacute";s:2:"ý";s:5:"thorn";s:2:"þ";s:4:"yuml";s:2:"ÿ";s:4:"quot";s:1:""";s:3:"amp";s:1:"&";s:2:"lt";s:1:"<";s:2:"gt";s:1:">";s:4:"apos";s:1:"'";s:5:"OElig";s:2:"Œ";s:5:"oelig";s:2:"œ";s:6:"Scaron";s:2:"Š";s:6:"scaron";s:2:"š";s:4:"Yuml";s:2:"Ÿ";s:4:"circ";s:2:"ˆ";s:5:"tilde";s:2:"˜";s:4:"ensp";s:3:" ";s:4:"emsp";s:3:" ";s:6:"thinsp";s:3:" ";s:4:"zwnj";s:3:"‌";s:3:"zwj";s:3:"‍";s:3:"lrm";s:3:"‎";s:3:"rlm";s:3:"‏";s:5:"ndash";s:3:"–";s:5:"mdash";s:3:"—";s:5:"lsquo";s:3:"‘";s:5:"rsquo";s:3:"’";s:5:"sbquo";s:3:"‚";s:5:"ldquo";s:3:"“";s:5:"rdquo";s:3:"”";s:5:"bdquo";s:3:"„";s:6:"dagger";s:3:"†";s:6:"Dagger";s:3:"‡";s:6:"permil";s:3:"‰";s:6:"lsaquo";s:3:"‹";s:6:"rsaquo";s:3:"›";s:4:"euro";s:3:"€";s:4:"fnof";s:2:"ƒ";s:5:"Alpha";s:2:"Α";s:4:"Beta";s:2:"Β";s:5:"Gamma";s:2:"Γ";s:5:"Delta";s:2:"Δ";s:7:"Epsilon";s:2:"Ε";s:4:"Zeta";s:2:"Ζ";s:3:"Eta";s:2:"Η";s:5:"Theta";s:2:"Θ";s:4:"Iota";s:2:"Ι";s:5:"Kappa";s:2:"Κ";s:6:"Lambda";s:2:"Λ";s:2:"Mu";s:2:"Μ";s:2:"Nu";s:2:"Ν";s:2:"Xi";s:2:"Ξ";s:7:"Omicron";s:2:"Ο";s:2:"Pi";s:2:"Π";s:3:"Rho";s:2:"Ρ";s:5:"Sigma";s:2:"Σ";s:3:"Tau";s:2:"Τ";s:7:"Upsilon";s:2:"Υ";s:3:"Phi";s:2:"Φ";s:3:"Chi";s:2:"Χ";s:3:"Psi";s:2:"Ψ";s:5:"Omega";s:2:"Ω";s:5:"alpha";s:2:"α";s:4:"beta";s:2:"β";s:5:"gamma";s:2:"γ";s:5:"delta";s:2:"δ";s:7:"epsilon";s:2:"ε";s:4:"zeta";s:2:"ζ";s:3:"eta";s:2:"η";s:5:"theta";s:2:"θ";s:4:"iota";s:2:"ι";s:5:"kappa";s:2:"κ";s:6:"lambda";s:2:"λ";s:2:"mu";s:2:"μ";s:2:"nu";s:2:"ν";s:2:"xi";s:2:"ξ";s:7:"omicron";s:2:"ο";s:2:"pi";s:2:"π";s:3:"rho";s:2:"ρ";s:6:"sigmaf";s:2:"ς";s:5:"sigma";s:2:"σ";s:3:"tau";s:2:"τ";s:7:"upsilon";s:2:"υ";s:3:"phi";s:2:"φ";s:3:"chi";s:2:"χ";s:3:"psi";s:2:"ψ";s:5:"omega";s:2:"ω";s:8:"thetasym";s:2:"ϑ";s:5:"upsih";s:2:"ϒ";s:3:"piv";s:2:"ϖ";s:4:"bull";s:3:"•";s:6:"hellip";s:3:"…";s:5:"prime";s:3:"′";s:5:"Prime";s:3:"″";s:5:"oline";s:3:"‾";s:5:"frasl";s:3:"⁄";s:6:"weierp";s:3:"℘";s:5:"image";s:3:"ℑ";s:4:"real";s:3:"ℜ";s:5:"trade";s:3:"™";s:7:"alefsym";s:3:"ℵ";s:4:"larr";s:3:"←";s:4:"uarr";s:3:"↑";s:4:"rarr";s:3:"→";s:4:"darr";s:3:"↓";s:4:"harr";s:3:"↔";s:5:"crarr";s:3:"↵";s:4:"lArr";s:3:"⇐";s:4:"uArr";s:3:"⇑";s:4:"rArr";s:3:"⇒";s:4:"dArr";s:3:"⇓";s:4:"hArr";s:3:"⇔";s:6:"forall";s:3:"∀";s:4:"part";s:3:"∂";s:5:"exist";s:3:"∃";s:5:"empty";s:3:"∅";s:5:"nabla";s:3:"∇";s:4:"isin";s:3:"∈";s:5:"notin";s:3:"∉";s:2:"ni";s:3:"∋";s:4:"prod";s:3:"∏";s:3:"sum";s:3:"∑";s:5:"minus";s:3:"−";s:6:"lowast";s:3:"∗";s:5:"radic";s:3:"√";s:4:"prop";s:3:"∝";s:5:"infin";s:3:"∞";s:3:"ang";s:3:"∠";s:3:"and";s:3:"∧";s:2:"or";s:3:"∨";s:3:"cap";s:3:"∩";s:3:"cup";s:3:"∪";s:3:"int";s:3:"∫";s:3:"sim";s:3:"∼";s:4:"cong";s:3:"≅";s:5:"asymp";s:3:"≈";s:2:"ne";s:3:"≠";s:5:"equiv";s:3:"≡";s:2:"le";s:3:"≤";s:2:"ge";s:3:"≥";s:3:"sub";s:3:"⊂";s:3:"sup";s:3:"⊃";s:4:"nsub";s:3:"⊄";s:4:"sube";s:3:"⊆";s:4:"supe";s:3:"⊇";s:5:"oplus";s:3:"⊕";s:6:"otimes";s:3:"⊗";s:4:"perp";s:3:"⊥";s:4:"sdot";s:3:"⋅";s:5:"lceil";s:3:"⌈";s:5:"rceil";s:3:"⌉";s:6:"lfloor";s:3:"⌊";s:6:"rfloor";s:3:"⌋";s:4:"lang";s:3:"〈";s:4:"rang";s:3:"〉";s:3:"loz";s:3:"◊";s:6:"spades";s:3:"♠";s:5:"clubs";s:3:"♣";s:6:"hearts";s:3:"♥";s:5:"diams";s:3:"♦";} \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityParser.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityParser.php new file mode 100644 index 0000000..abc385a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/EntityParser.php @@ -0,0 +1,143 @@ + '"', + 38 => '&', + 39 => "'", + 60 => '<', + 62 => '>' + ); + + /** + * Stripped entity names to decimal conversion table for special entities. + */ + protected $_special_ent2dec = + array( + 'quot' => 34, + 'amp' => 38, + 'lt' => 60, + 'gt' => 62 + ); + + /** + * Substitutes non-special entities with their parsed equivalents. Since + * running this whenever you have parsed character is t3h 5uck, we run + * it before everything else. + * + * @param $string String to have non-special entities parsed. + * @returns Parsed string. + */ + public function substituteNonSpecialEntities($string) { + // it will try to detect missing semicolons, but don't rely on it + return preg_replace_callback( + $this->_substituteEntitiesRegex, + array($this, 'nonSpecialEntityCallback'), + $string + ); + } + + /** + * Callback function for substituteNonSpecialEntities() that does the work. + * + * @param $matches PCRE matches array, with 0 the entire match, and + * either index 1, 2 or 3 set with a hex value, dec value, + * or string (respectively). + * @returns Replacement string. + */ + + protected function nonSpecialEntityCallback($matches) { + // replaces all but big five + $entity = $matches[0]; + $is_num = (@$matches[0][1] === '#'); + if ($is_num) { + $is_hex = (@$entity[2] === 'x'); + $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; + + // abort for special characters + if (isset($this->_special_dec2str[$code])) return $entity; + + return HTMLPurifier_Encoder::unichr($code); + } else { + if (isset($this->_special_ent2dec[$matches[3]])) return $entity; + if (!$this->_entity_lookup) { + $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); + } + if (isset($this->_entity_lookup->table[$matches[3]])) { + return $this->_entity_lookup->table[$matches[3]]; + } else { + return $entity; + } + } + } + + /** + * Substitutes only special entities with their parsed equivalents. + * + * @notice We try to avoid calling this function because otherwise, it + * would have to be called a lot (for every parsed section). + * + * @param $string String to have non-special entities parsed. + * @returns Parsed string. + */ + public function substituteSpecialEntities($string) { + return preg_replace_callback( + $this->_substituteEntitiesRegex, + array($this, 'specialEntityCallback'), + $string); + } + + /** + * Callback function for substituteSpecialEntities() that does the work. + * + * This callback has same syntax as nonSpecialEntityCallback(). + * + * @param $matches PCRE-style matches array, with 0 the entire match, and + * either index 1, 2 or 3 set with a hex value, dec value, + * or string (respectively). + * @returns Replacement string. + */ + protected function specialEntityCallback($matches) { + $entity = $matches[0]; + $is_num = (@$matches[0][1] === '#'); + if ($is_num) { + $is_hex = (@$entity[2] === 'x'); + $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; + return isset($this->_special_dec2str[$int]) ? + $this->_special_dec2str[$int] : + $entity; + } else { + return isset($this->_special_ent2dec[$matches[3]]) ? + $this->_special_ent2dec[$matches[3]] : + $entity; + } + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ErrorCollector.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ErrorCollector.php new file mode 100644 index 0000000..42b0b2d --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ErrorCollector.php @@ -0,0 +1,208 @@ +locale =& $context->get('Locale'); + $this->context = $context; + $this->_current =& $this->_stacks[0]; + $this->errors =& $this->_stacks[0]; + } + + /** + * Sends an error message to the collector for later use + * @param $severity int Error severity, PHP error style (don't use E_USER_) + * @param $msg string Error message text + * @param $subst1 string First substitution for $msg + * @param $subst2 string ... + */ + public function send($severity, $msg) { + + $args = array(); + if (func_num_args() > 2) { + $args = func_get_args(); + array_shift($args); + unset($args[0]); + } + + $token = $this->context->get('CurrentToken', true); + $line = $token ? $token->line : $this->context->get('CurrentLine', true); + $col = $token ? $token->col : $this->context->get('CurrentCol', true); + $attr = $this->context->get('CurrentAttr', true); + + // perform special substitutions, also add custom parameters + $subst = array(); + if (!is_null($token)) { + $args['CurrentToken'] = $token; + } + if (!is_null($attr)) { + $subst['$CurrentAttr.Name'] = $attr; + if (isset($token->attr[$attr])) $subst['$CurrentAttr.Value'] = $token->attr[$attr]; + } + + if (empty($args)) { + $msg = $this->locale->getMessage($msg); + } else { + $msg = $this->locale->formatMessage($msg, $args); + } + + if (!empty($subst)) $msg = strtr($msg, $subst); + + // (numerically indexed) + $error = array( + self::LINENO => $line, + self::SEVERITY => $severity, + self::MESSAGE => $msg, + self::CHILDREN => array() + ); + $this->_current[] = $error; + + + // NEW CODE BELOW ... + + $struct = null; + // Top-level errors are either: + // TOKEN type, if $value is set appropriately, or + // "syntax" type, if $value is null + $new_struct = new HTMLPurifier_ErrorStruct(); + $new_struct->type = HTMLPurifier_ErrorStruct::TOKEN; + if ($token) $new_struct->value = clone $token; + if (is_int($line) && is_int($col)) { + if (isset($this->lines[$line][$col])) { + $struct = $this->lines[$line][$col]; + } else { + $struct = $this->lines[$line][$col] = $new_struct; + } + // These ksorts may present a performance problem + ksort($this->lines[$line], SORT_NUMERIC); + } else { + if (isset($this->lines[-1])) { + $struct = $this->lines[-1]; + } else { + $struct = $this->lines[-1] = $new_struct; + } + } + ksort($this->lines, SORT_NUMERIC); + + // Now, check if we need to operate on a lower structure + if (!empty($attr)) { + $struct = $struct->getChild(HTMLPurifier_ErrorStruct::ATTR, $attr); + if (!$struct->value) { + $struct->value = array($attr, 'PUT VALUE HERE'); + } + } + if (!empty($cssprop)) { + $struct = $struct->getChild(HTMLPurifier_ErrorStruct::CSSPROP, $cssprop); + if (!$struct->value) { + // if we tokenize CSS this might be a little more difficult to do + $struct->value = array($cssprop, 'PUT VALUE HERE'); + } + } + + // Ok, structs are all setup, now time to register the error + $struct->addError($severity, $msg); + } + + /** + * Retrieves raw error data for custom formatter to use + * @param List of arrays in format of array(line of error, + * error severity, error message, + * recursive sub-errors array) + */ + public function getRaw() { + return $this->errors; + } + + /** + * Default HTML formatting implementation for error messages + * @param $config Configuration array, vital for HTML output nature + * @param $errors Errors array to display; used for recursion. + */ + public function getHTMLFormatted($config, $errors = null) { + $ret = array(); + + $this->generator = new HTMLPurifier_Generator($config, $this->context); + if ($errors === null) $errors = $this->errors; + + // 'At line' message needs to be removed + + // generation code for new structure goes here. It needs to be recursive. + foreach ($this->lines as $line => $col_array) { + if ($line == -1) continue; + foreach ($col_array as $col => $struct) { + $this->_renderStruct($ret, $struct, $line, $col); + } + } + if (isset($this->lines[-1])) { + $this->_renderStruct($ret, $this->lines[-1]); + } + + if (empty($errors)) { + return '

    ' . $this->locale->getMessage('ErrorCollector: No errors') . '

    '; + } else { + return '
    • ' . implode('
    • ', $ret) . '
    '; + } + + } + + private function _renderStruct(&$ret, $struct, $line = null, $col = null) { + $stack = array($struct); + $context_stack = array(array()); + while ($current = array_pop($stack)) { + $context = array_pop($context_stack); + foreach ($current->errors as $error) { + list($severity, $msg) = $error; + $string = ''; + $string .= '
    '; + // W3C uses an icon to indicate the severity of the error. + $error = $this->locale->getErrorName($severity); + $string .= "$error "; + if (!is_null($line) && !is_null($col)) { + $string .= "Line $line, Column $col: "; + } else { + $string .= 'End of Document: '; + } + $string .= '' . $this->generator->escape($msg) . ' '; + $string .= '
    '; + // Here, have a marker for the character on the column appropriate. + // Be sure to clip extremely long lines. + //$string .= '
    ';
    +                //$string .= '';
    +                //$string .= '
    '; + $ret[] = $string; + } + foreach ($current->children as $type => $array) { + $context[] = $current; + $stack = array_merge($stack, array_reverse($array, true)); + for ($i = count($array); $i > 0; $i--) { + $context_stack[] = $context; + } + } + } + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ErrorStruct.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ErrorStruct.php new file mode 100644 index 0000000..c6e5472 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/ErrorStruct.php @@ -0,0 +1,58 @@ +children[$type][$id])) { + $this->children[$type][$id] = new HTMLPurifier_ErrorStruct(); + $this->children[$type][$id]->type = $type; + } + return $this->children[$type][$id]; + } + + public function addError($severity, $message) { + $this->errors[] = array($severity, $message); + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Exception.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Exception.php new file mode 100644 index 0000000..4f2ebf5 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Exception.php @@ -0,0 +1,11 @@ +preFilter, + * 2->preFilter, 3->preFilter, purify, 3->postFilter, 2->postFilter, + * 1->postFilter. + * + * @note Methods are not declared abstract as it is perfectly legitimate + * for an implementation not to want anything to happen on a step + */ + +class HTMLPurifier_Filter +{ + + /** + * Name of the filter for identification purposes + */ + public $name; + + /** + * Pre-processor function, handles HTML before HTML Purifier + */ + public function preFilter($html, $config, $context) { + return $html; + } + + /** + * Post-processor function, handles HTML after HTML Purifier + */ + public function postFilter($html, $config, $context) { + return $html; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php new file mode 100644 index 0000000..e3545e0 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php @@ -0,0 +1,134 @@ + blocks from input HTML, cleans them up + * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks') + * so they can be used elsewhere in the document. + * + * @note + * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for + * sample usage. + * + * @note + * This filter can also be used on stylesheets not included in the + * document--something purists would probably prefer. Just directly + * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS() + */ +class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter +{ + + public $name = 'ExtractStyleBlocks'; + private $_styleMatches = array(); + private $_tidy; + + public function __construct() { + $this->_tidy = new csstidy(); + } + + /** + * Save the contents of CSS blocks to style matches + * @param $matches preg_replace style $matches array + */ + protected function styleCallback($matches) { + $this->_styleMatches[] = $matches[1]; + } + + /** + * Removes inline #isU', array($this, 'styleCallback'), $html); + $style_blocks = $this->_styleMatches; + $this->_styleMatches = array(); // reset + $context->register('StyleBlocks', $style_blocks); // $context must not be reused + if ($this->_tidy) { + foreach ($style_blocks as &$style) { + $style = $this->cleanCSS($style, $config, $context); + } + } + return $html; + } + + /** + * Takes CSS (the stuff found in in a font-family prop). + if ($config->get('FilterParam', 'ExtractStyleBlocksEscaping')) { + $css = str_replace( + array('<', '>', '&'), + array('\3C ', '\3E ', '\26 '), + $css + ); + } + return $css; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter/YouTube.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter/YouTube.php new file mode 100644 index 0000000..3236660 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Filter/YouTube.php @@ -0,0 +1,31 @@ +]+>.+?'. + 'http://www.youtube.com/v/([A-Za-z0-9\-_]+).+?#s'; + $pre_replace = '\1'; + return preg_replace($pre_regex, $pre_replace, $html); + } + + public function postFilter($html, $config, $context) { + $post_regex = '#([A-Za-z0-9\-_]+)#'; + $post_replace = ''. + ''. + ''. + ''. + ''; + return preg_replace($post_regex, $post_replace, $html); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Generator.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Generator.php new file mode 100644 index 0000000..0ff5ba9 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Generator.php @@ -0,0 +1,182 @@ + tags + */ + private $_scriptFix = false; + + /** + * Cache of HTMLDefinition during HTML output to determine whether or + * not attributes should be minimized. + */ + private $_def; + + /** + * Cache of %Output.SortAttr + */ + private $_sortAttr; + + /** + * Configuration for the generator + */ + protected $config; + + /** + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + */ + public function __construct($config, $context) { + $this->config = $config; + $this->_scriptFix = $config->get('Output', 'CommentScriptContents'); + $this->_sortAttr = $config->get('Output', 'SortAttr'); + $this->_def = $config->getHTMLDefinition(); + $this->_xhtml = $this->_def->doctype->xml; + } + + /** + * Generates HTML from an array of tokens. + * @param $tokens Array of HTMLPurifier_Token + * @param $config HTMLPurifier_Config object + * @return Generated HTML + */ + public function generateFromTokens($tokens) { + if (!$tokens) return ''; + + // Basic algorithm + $html = ''; + for ($i = 0, $size = count($tokens); $i < $size; $i++) { + if ($this->_scriptFix && $tokens[$i]->name === 'script' + && $i + 2 < $size && $tokens[$i+2] instanceof HTMLPurifier_Token_End) { + // script special case + // the contents of the script block must be ONE token + // for this to work. + $html .= $this->generateFromToken($tokens[$i++]); + $html .= $this->generateScriptFromToken($tokens[$i++]); + } + $html .= $this->generateFromToken($tokens[$i]); + } + + // Tidy cleanup + if (extension_loaded('tidy') && $this->config->get('Output', 'TidyFormat')) { + $tidy = new Tidy; + $tidy->parseString($html, array( + 'indent'=> true, + 'output-xhtml' => $this->_xhtml, + 'show-body-only' => true, + 'indent-spaces' => 2, + 'wrap' => 68, + ), 'utf8'); + $tidy->cleanRepair(); + $html = (string) $tidy; // explicit cast necessary + } + + // Normalize newlines to system defined value + $nl = $this->config->get('Output', 'Newline'); + if ($nl === null) $nl = PHP_EOL; + if ($nl !== "\n") $html = str_replace("\n", $nl, $html); + return $html; + } + + /** + * Generates HTML from a single token. + * @param $token HTMLPurifier_Token object. + * @return Generated HTML + */ + public function generateFromToken($token) { + if (!$token instanceof HTMLPurifier_Token) { + trigger_error('Cannot generate HTML from non-HTMLPurifier_Token object', E_USER_WARNING); + return ''; + + } elseif ($token instanceof HTMLPurifier_Token_Start) { + $attr = $this->generateAttributes($token->attr, $token->name); + return '<' . $token->name . ($attr ? ' ' : '') . $attr . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_End) { + return 'name . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_Empty) { + $attr = $this->generateAttributes($token->attr, $token->name); + return '<' . $token->name . ($attr ? ' ' : '') . $attr . + ( $this->_xhtml ? ' /': '' ) //
    v.
    + . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_Text) { + return $this->escape($token->data, ENT_NOQUOTES); + + } elseif ($token instanceof HTMLPurifier_Token_Comment) { + return ''; + } else { + return ''; + + } + } + + /** + * Special case processor for the contents of script tags + * @warning This runs into problems if there's already a literal + * --> somewhere inside the script contents. + */ + public function generateScriptFromToken($token) { + if (!$token instanceof HTMLPurifier_Token_Text) return $this->generateFromToken($token); + // Thanks + $data = preg_replace('#//\s*$#', '', $token->data); + return ''; + } + + /** + * Generates attribute declarations from attribute array. + * @note This does not include the leading or trailing space. + * @param $assoc_array_of_attributes Attribute array + * @param $element Name of element attributes are for, used to check + * attribute minimization. + * @return Generate HTML fragment for insertion. + */ + public function generateAttributes($assoc_array_of_attributes, $element = false) { + $html = ''; + if ($this->_sortAttr) ksort($assoc_array_of_attributes); + foreach ($assoc_array_of_attributes as $key => $value) { + if (!$this->_xhtml) { + // Remove namespaced attributes + if (strpos($key, ':') !== false) continue; + // Check if we should minimize the attribute: val="val" -> val + if ($element && !empty($this->_def->info[$element]->attr[$key]->minimized)) { + $html .= $key . ' '; + continue; + } + } + $html .= $key.'="'.$this->escape($value).'" '; + } + return rtrim($html); + } + + /** + * Escapes raw text data. + * @todo This really ought to be protected, but until we have a facility + * for properly generating HTML here w/o using tokens, it stays + * public. + * @param $string String data to escape for HTML. + * @param $quote Quoting style, like htmlspecialchars. ENT_NOQUOTES is + * permissible for non-attribute output. + * @return String escaped data. + */ + public function escape($string, $quote = ENT_COMPAT) { + return htmlspecialchars($string, $quote, 'UTF-8'); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLDefinition.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLDefinition.php new file mode 100644 index 0000000..c9ba89f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLDefinition.php @@ -0,0 +1,420 @@ +getAnonymousModule(); + if (!isset($module->info[$element_name])) { + $element = $module->addBlankElement($element_name); + } else { + $element = $module->info[$element_name]; + } + $element->attr[$attr_name] = $def; + } + + /** + * Adds a custom element to your HTML definition + * @note See HTMLPurifier_HTMLModule::addElement for detailed + * parameter and return value descriptions. + */ + public function addElement($element_name, $type, $contents, $attr_collections, $attributes) { + $module = $this->getAnonymousModule(); + // assume that if the user is calling this, the element + // is safe. This may not be a good idea + $element = $module->addElement($element_name, $type, $contents, $attr_collections, $attributes); + return $element; + } + + /** + * Adds a blank element to your HTML definition, for overriding + * existing behavior + * @note See HTMLPurifier_HTMLModule::addBlankElement for detailed + * parameter and return value descriptions. + */ + public function addBlankElement($element_name) { + $module = $this->getAnonymousModule(); + $element = $module->addBlankElement($element_name); + return $element; + } + + /** + * Retrieves a reference to the anonymous module, so you can + * bust out advanced features without having to make your own + * module. + */ + public function getAnonymousModule() { + if (!$this->_anonModule) { + $this->_anonModule = new HTMLPurifier_HTMLModule(); + $this->_anonModule->name = 'Anonymous'; + } + return $this->_anonModule; + } + + private $_anonModule; + + + // PUBLIC BUT INTERNAL VARIABLES -------------------------------------- + + public $type = 'HTML'; + public $manager; /**< Instance of HTMLPurifier_HTMLModuleManager */ + + /** + * Performs low-cost, preliminary initialization. + */ + public function __construct() { + $this->manager = new HTMLPurifier_HTMLModuleManager(); + } + + protected function doSetup($config) { + $this->processModules($config); + $this->setupConfigStuff($config); + unset($this->manager); + + // cleanup some of the element definitions + foreach ($this->info as $k => $v) { + unset($this->info[$k]->content_model); + unset($this->info[$k]->content_model_type); + } + } + + /** + * Extract out the information from the manager + */ + protected function processModules($config) { + + if ($this->_anonModule) { + // for user specific changes + // this is late-loaded so we don't have to deal with PHP4 + // reference wonky-ness + $this->manager->addModule($this->_anonModule); + unset($this->_anonModule); + } + + $this->manager->setup($config); + $this->doctype = $this->manager->doctype; + + foreach ($this->manager->modules as $module) { + foreach($module->info_tag_transform as $k => $v) { + if ($v === false) unset($this->info_tag_transform[$k]); + else $this->info_tag_transform[$k] = $v; + } + foreach($module->info_attr_transform_pre as $k => $v) { + if ($v === false) unset($this->info_attr_transform_pre[$k]); + else $this->info_attr_transform_pre[$k] = $v; + } + foreach($module->info_attr_transform_post as $k => $v) { + if ($v === false) unset($this->info_attr_transform_post[$k]); + else $this->info_attr_transform_post[$k] = $v; + } + foreach ($module->info_injector as $k => $v) { + if ($v === false) unset($this->info_injector[$k]); + else $this->info_injector[$k] = $v; + } + } + + $this->info = $this->manager->getElements(); + $this->info_content_sets = $this->manager->contentSets->lookup; + + } + + /** + * Sets up stuff based on config. We need a better way of doing this. + */ + protected function setupConfigStuff($config) { + + $block_wrapper = $config->get('HTML', 'BlockWrapper'); + if (isset($this->info_content_sets['Block'][$block_wrapper])) { + $this->info_block_wrapper = $block_wrapper; + } else { + trigger_error('Cannot use non-block element as block wrapper', + E_USER_ERROR); + } + + $parent = $config->get('HTML', 'Parent'); + $def = $this->manager->getElement($parent, true); + if ($def) { + $this->info_parent = $parent; + $this->info_parent_def = $def; + } else { + trigger_error('Cannot use unrecognized element as parent', + E_USER_ERROR); + $this->info_parent_def = $this->manager->getElement($this->info_parent, true); + } + + // support template text + $support = "(for information on implementing this, see the ". + "support forums) "; + + // setup allowed elements ----------------------------------------- + + $allowed_elements = $config->get('HTML', 'AllowedElements'); + $allowed_attributes = $config->get('HTML', 'AllowedAttributes'); // retrieve early + + if (!is_array($allowed_elements) && !is_array($allowed_attributes)) { + $allowed = $config->get('HTML', 'Allowed'); + if (is_string($allowed)) { + list($allowed_elements, $allowed_attributes) = $this->parseTinyMCEAllowedList($allowed); + } + } + + if (is_array($allowed_elements)) { + foreach ($this->info as $name => $d) { + if(!isset($allowed_elements[$name])) unset($this->info[$name]); + unset($allowed_elements[$name]); + } + // emit errors + foreach ($allowed_elements as $element => $d) { + $element = htmlspecialchars($element); // PHP doesn't escape errors, be careful! + trigger_error("Element '$element' is not supported $support", E_USER_WARNING); + } + } + + // setup allowed attributes --------------------------------------- + + $allowed_attributes_mutable = $allowed_attributes; // by copy! + if (is_array($allowed_attributes)) { + + // This actually doesn't do anything, since we went away from + // global attributes. It's possible that userland code uses + // it, but HTMLModuleManager doesn't! + foreach ($this->info_global_attr as $attr => $x) { + $keys = array($attr, "*@$attr", "*.$attr"); + $delete = true; + foreach ($keys as $key) { + if ($delete && isset($allowed_attributes[$key])) { + $delete = false; + } + if (isset($allowed_attributes_mutable[$key])) { + unset($allowed_attributes_mutable[$key]); + } + } + if ($delete) unset($this->info_global_attr[$attr]); + } + + foreach ($this->info as $tag => $info) { + foreach ($info->attr as $attr => $x) { + $keys = array("$tag@$attr", $attr, "*@$attr", "$tag.$attr", "*.$attr"); + $delete = true; + foreach ($keys as $key) { + if ($delete && isset($allowed_attributes[$key])) { + $delete = false; + } + if (isset($allowed_attributes_mutable[$key])) { + unset($allowed_attributes_mutable[$key]); + } + } + if ($delete) unset($this->info[$tag]->attr[$attr]); + } + } + // emit errors + foreach ($allowed_attributes_mutable as $elattr => $d) { + $bits = preg_split('/[.@]/', $elattr, 2); + $c = count($bits); + switch ($c) { + case 2: + if ($bits[0] !== '*') { + $element = htmlspecialchars($bits[0]); + $attribute = htmlspecialchars($bits[1]); + if (!isset($this->info[$element])) { + trigger_error("Cannot allow attribute '$attribute' if element '$element' is not allowed/supported $support"); + } else { + trigger_error("Attribute '$attribute' in element '$element' not supported $support", + E_USER_WARNING); + } + break; + } + // otherwise fall through + case 1: + $attribute = htmlspecialchars($bits[0]); + trigger_error("Global attribute '$attribute' is not ". + "supported in any elements $support", + E_USER_WARNING); + break; + } + } + + } + + // setup forbidden elements --------------------------------------- + + $forbidden_elements = $config->get('HTML', 'ForbiddenElements'); + $forbidden_attributes = $config->get('HTML', 'ForbiddenAttributes'); + + foreach ($this->info as $tag => $info) { + if (isset($forbidden_elements[$tag])) { + unset($this->info[$tag]); + continue; + } + foreach ($info->attr as $attr => $x) { + if ( + isset($forbidden_attributes["$tag@$attr"]) || + isset($forbidden_attributes["*@$attr"]) || + isset($forbidden_attributes[$attr]) + ) { + unset($this->info[$tag]->attr[$attr]); + continue; + } // this segment might get removed eventually + elseif (isset($forbidden_attributes["$tag.$attr"])) { + // $tag.$attr are not user supplied, so no worries! + trigger_error("Error with $tag.$attr: tag.attr syntax not supported for HTML.ForbiddenAttributes; use tag@attr instead", E_USER_WARNING); + } + } + } + foreach ($forbidden_attributes as $key => $v) { + if (strlen($key) < 2) continue; + if ($key[0] != '*') continue; + if ($key[1] == '.') { + trigger_error("Error with $key: *.attr syntax not supported for HTML.ForbiddenAttributes; use attr instead", E_USER_WARNING); + } + } + + // setup injectors ----------------------------------------------------- + foreach ($this->info_injector as $i => $injector) { + if ($injector->checkNeeded($config) !== false) { + // remove injector that does not have it's required + // elements/attributes present, and is thus not needed. + unset($this->info_injector[$i]); + } + } + } + + /** + * Parses a TinyMCE-flavored Allowed Elements and Attributes list into + * separate lists for processing. Format is element[attr1|attr2],element2... + * @warning Although it's largely drawn from TinyMCE's implementation, + * it is different, and you'll probably have to modify your lists + * @param $list String list to parse + * @param array($allowed_elements, $allowed_attributes) + * @todo Give this its own class, probably static interface + */ + public function parseTinyMCEAllowedList($list) { + + $list = str_replace(array(' ', "\t"), '', $list); + + $elements = array(); + $attributes = array(); + + $chunks = preg_split('/(,|[\n\r]+)/', $list); + foreach ($chunks as $chunk) { + if (empty($chunk)) continue; + // remove TinyMCE element control characters + if (!strpos($chunk, '[')) { + $element = $chunk; + $attr = false; + } else { + list($element, $attr) = explode('[', $chunk); + } + if ($element !== '*') $elements[$element] = true; + if (!$attr) continue; + $attr = substr($attr, 0, strlen($attr) - 1); // remove trailing ] + $attr = explode('|', $attr); + foreach ($attr as $key) { + $attributes["$element.$key"] = true; + } + } + + return array($elements, $attributes); + + } + + +} + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule.php new file mode 100644 index 0000000..3bdc023 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule.php @@ -0,0 +1,243 @@ +info, since the object's data is only info, + * with extra behavior associated with it. + */ + public $attr_collections = array(); + + /** + * Associative array of deprecated tag name to HTMLPurifier_TagTransform + */ + public $info_tag_transform = array(); + + /** + * List of HTMLPurifier_AttrTransform to be performed before validation. + */ + public $info_attr_transform_pre = array(); + + /** + * List of HTMLPurifier_AttrTransform to be performed after validation. + */ + public $info_attr_transform_post = array(); + + /** + * List of HTMLPurifier_Injector to be performed during well-formedness fixing. + * An injector will only be invoked if all of it's pre-requisites are met; + * if an injector fails setup, there will be no error; it will simply be + * silently disabled. + */ + public $info_injector = array(); + + /** + * Boolean flag that indicates whether or not getChildDef is implemented. + * For optimization reasons: may save a call to a function. Be sure + * to set it if you do implement getChildDef(), otherwise it will have + * no effect! + */ + public $defines_child_def = false; + + /** + * Boolean flag whether or not this module is safe. If it is not safe, all + * of its members are unsafe. Modules are safe by default (this might be + * slightly dangerous, but it doesn't make much sense to force HTML Purifier, + * which is based off of safe HTML, to explicitly say, "This is safe," even + * though there are modules which are "unsafe") + * + * @note Previously, safety could be applied at an element level granularity. + * We've removed this ability, so in order to add "unsafe" elements + * or attributes, a dedicated module with this property set to false + * must be used. + */ + public $safe = true; + + /** + * Retrieves a proper HTMLPurifier_ChildDef subclass based on + * content_model and content_model_type member variables of + * the HTMLPurifier_ElementDef class. There is a similar function + * in HTMLPurifier_HTMLDefinition. + * @param $def HTMLPurifier_ElementDef instance + * @return HTMLPurifier_ChildDef subclass + */ + public function getChildDef($def) {return false;} + + // -- Convenience ----------------------------------------------------- + + /** + * Convenience function that sets up a new element + * @param $element Name of element to add + * @param $type What content set should element be registered to? + * Set as false to skip this step. + * @param $contents Allowed children in form of: + * "$content_model_type: $content_model" + * @param $attr_includes What attribute collections to register to + * element? + * @param $attr What unique attributes does the element define? + * @note See ElementDef for in-depth descriptions of these parameters. + * @return Created element definition object, so you + * can set advanced parameters + */ + public function addElement($element, $type, $contents, $attr_includes = array(), $attr = array()) { + $this->elements[] = $element; + // parse content_model + list($content_model_type, $content_model) = $this->parseContents($contents); + // merge in attribute inclusions + $this->mergeInAttrIncludes($attr, $attr_includes); + // add element to content sets + if ($type) $this->addElementToContentSet($element, $type); + // create element + $this->info[$element] = HTMLPurifier_ElementDef::create( + $content_model, $content_model_type, $attr + ); + // literal object $contents means direct child manipulation + if (!is_string($contents)) $this->info[$element]->child = $contents; + return $this->info[$element]; + } + + /** + * Convenience function that creates a totally blank, non-standalone + * element. + * @param $element Name of element to create + * @return Created element + */ + public function addBlankElement($element) { + if (!isset($this->info[$element])) { + $this->elements[] = $element; + $this->info[$element] = new HTMLPurifier_ElementDef(); + $this->info[$element]->standalone = false; + } else { + trigger_error("Definition for $element already exists in module, cannot redefine"); + } + return $this->info[$element]; + } + + /** + * Convenience function that registers an element to a content set + * @param Element to register + * @param Name content set (warning: case sensitive, usually upper-case + * first letter) + */ + public function addElementToContentSet($element, $type) { + if (!isset($this->content_sets[$type])) $this->content_sets[$type] = ''; + else $this->content_sets[$type] .= ' | '; + $this->content_sets[$type] .= $element; + } + + /** + * Convenience function that transforms single-string contents + * into separate content model and content model type + * @param $contents Allowed children in form of: + * "$content_model_type: $content_model" + * @note If contents is an object, an array of two nulls will be + * returned, and the callee needs to take the original $contents + * and use it directly. + */ + public function parseContents($contents) { + if (!is_string($contents)) return array(null, null); // defer + switch ($contents) { + // check for shorthand content model forms + case 'Empty': + return array('empty', ''); + case 'Inline': + return array('optional', 'Inline | #PCDATA'); + case 'Flow': + return array('optional', 'Flow | #PCDATA'); + } + list($content_model_type, $content_model) = explode(':', $contents); + $content_model_type = strtolower(trim($content_model_type)); + $content_model = trim($content_model); + return array($content_model_type, $content_model); + } + + /** + * Convenience function that merges a list of attribute includes into + * an attribute array. + * @param $attr Reference to attr array to modify + * @param $attr_includes Array of includes / string include to merge in + */ + public function mergeInAttrIncludes(&$attr, $attr_includes) { + if (!is_array($attr_includes)) { + if (empty($attr_includes)) $attr_includes = array(); + else $attr_includes = array($attr_includes); + } + $attr[0] = $attr_includes; + } + + /** + * Convenience function that generates a lookup table with boolean + * true as value. + * @param $list List of values to turn into a lookup + * @note You can also pass an arbitrary number of arguments in + * place of the regular argument + * @return Lookup array equivalent of list + */ + public function makeLookup($list) { + if (is_string($list)) $list = func_get_args(); + $ret = array(); + foreach ($list as $value) { + if (is_null($value)) continue; + $ret[$value] = true; + } + return $ret; + } + + /** + * Lazy load construction of the module after determining whether + * or not it's needed, and also when a finalized configuration object + * is available. + * @param $config Instance of HTMLPurifier_Config + */ + public function setup($config) {} + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Bdo.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Bdo.php new file mode 100644 index 0000000..79af960 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Bdo.php @@ -0,0 +1,30 @@ + array('dir' => false) + ); + + public function setup($config) { + $bdo = $this->addElement( + 'bdo', 'Inline', 'Inline', array('Core', 'Lang'), + array( + 'dir' => 'Enum#ltr,rtl', // required + // The Abstract Module specification has the attribute + // inclusions wrong for bdo: bdo allows Lang + ) + ); + $bdo->attr_transform_post['required-dir'] = new HTMLPurifier_AttrTransform_BdoDir(); + + $this->attr_collections['I18N']['dir'] = 'Enum#ltr,rtl'; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/CommonAttributes.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/CommonAttributes.php new file mode 100644 index 0000000..96a31b8 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/CommonAttributes.php @@ -0,0 +1,24 @@ + array( + 0 => array('Style'), + // 'xml:space' => false, + 'class' => 'NMTOKENS', + 'id' => 'ID', + 'title' => 'CDATA', + ), + 'Lang' => array(), + 'I18N' => array( + 0 => array('Lang'), // proprietary, for xml:lang/lang + ), + 'Common' => array( + 0 => array('Core', 'I18N') + ) + ); +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Edit.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Edit.php new file mode 100644 index 0000000..d1134e8 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Edit.php @@ -0,0 +1,37 @@ + 'URI', + // 'datetime' => 'Datetime', // not implemented + ); + $this->addElement('del', 'Inline', $contents, 'Common', $attr); + $this->addElement('ins', 'Inline', $contents, 'Common', $attr); + } + + // HTML 4.01 specifies that ins/del must not contain block + // elements when used in an inline context, chameleon is + // a complicated workaround to acheive this effect + + // Inline context ! Block context (exclamation mark is + // separator, see getChildDef for parsing) + + public $defines_child_def = true; + public function getChildDef($def) { + if ($def->content_model_type != 'chameleon') return false; + $value = explode('!', $def->content_model); + return new HTMLPurifier_ChildDef_Chameleon($value[0], $value[1]); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Forms.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Forms.php new file mode 100644 index 0000000..7198081 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Forms.php @@ -0,0 +1,117 @@ + 'Form', + 'Inline' => 'Formctrl', + ); + + public function setup($config) { + $form = $this->addElement('form', 'Form', + 'Required: Heading | List | Block | fieldset', 'Common', array( + 'accept' => 'ContentTypes', + 'accept-charset' => 'Charsets', + 'action*' => 'URI', + 'method' => 'Enum#get,post', + // really ContentType, but these two are the only ones used today + 'enctype' => 'Enum#application/x-www-form-urlencoded,multipart/form-data', + )); + $form->excludes = array('form' => true); + + $input = $this->addElement('input', 'Formctrl', 'Empty', 'Common', array( + 'accept' => 'ContentTypes', + 'accesskey' => 'Character', + 'alt' => 'Text', + 'checked' => 'Bool#checked', + 'disabled' => 'Bool#disabled', + 'maxlength' => 'Number', + 'name' => 'CDATA', + 'readonly' => 'Bool#readonly', + 'size' => 'Number', + 'src' => 'URI#embeds', + 'tabindex' => 'Number', + 'type' => 'Enum#text,password,checkbox,button,radio,submit,reset,file,hidden,image', + 'value' => 'CDATA', + )); + $input->attr_transform_post[] = new HTMLPurifier_AttrTransform_Input(); + + $this->addElement('select', 'Formctrl', 'Required: optgroup | option', 'Common', array( + 'disabled' => 'Bool#disabled', + 'multiple' => 'Bool#multiple', + 'name' => 'CDATA', + 'size' => 'Number', + 'tabindex' => 'Number', + )); + + $this->addElement('option', false, 'Optional: #PCDATA', 'Common', array( + 'disabled' => 'Bool#disabled', + 'label' => 'Text', + 'selected' => 'Bool#selected', + 'value' => 'CDATA', + )); + // It's illegal for there to be more than one selected, but not + // be multiple. Also, no selected means undefined behavior. This might + // be difficult to implement; perhaps an injector, or a context variable. + + $textarea = $this->addElement('textarea', 'Formctrl', 'Optional: #PCDATA', 'Common', array( + 'accesskey' => 'Character', + 'cols*' => 'Number', + 'disabled' => 'Bool#disabled', + 'name' => 'CDATA', + 'readonly' => 'Bool#readonly', + 'rows*' => 'Number', + 'tabindex' => 'Number', + )); + $textarea->attr_transform_pre[] = new HTMLPurifier_AttrTransform_Textarea(); + + $button = $this->addElement('button', 'Formctrl', 'Optional: #PCDATA | Heading | List | Block | Inline', 'Common', array( + 'accesskey' => 'Character', + 'disabled' => 'Bool#disabled', + 'name' => 'CDATA', + 'tabindex' => 'Number', + 'type' => 'Enum#button,submit,reset', + 'value' => 'CDATA', + )); + + // For exclusions, ideally we'd specify content sets, not literal elements + $button->excludes = $this->makeLookup( + 'form', 'fieldset', // Form + 'input', 'select', 'textarea', 'label', 'button', // Formctrl + 'a' // as per HTML 4.01 spec, this is omitted by modularization + ); + + // Extra exclusion: img usemap="" is not permitted within this element. + // We'll omit this for now, since we don't have any good way of + // indicating it yet. + + // This is HIGHLY user-unfriendly; we need a custom child-def for this + $this->addElement('fieldset', 'Form', 'Custom: (#WS?,legend,(Flow|#PCDATA)*)', 'Common'); + + $label = $this->addElement('label', 'Formctrl', 'Optional: #PCDATA | Inline', 'Common', array( + 'accesskey' => 'Character', + // 'for' => 'IDREF', // IDREF not implemented, cannot allow + )); + $label->excludes = array('label' => true); + + $this->addElement('legend', false, 'Optional: #PCDATA | Inline', 'Common', array( + 'accesskey' => 'Character', + )); + + $this->addElement('optgroup', false, 'Required: option', 'Common', array( + 'disabled' => 'Bool#disabled', + 'label*' => 'Text', + )); + + // Don't forget an injector for . This one's a little complex + // because it maps to multiple elements. + + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Hypertext.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Hypertext.php new file mode 100644 index 0000000..875ae93 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Hypertext.php @@ -0,0 +1,29 @@ +addElement( + 'a', 'Inline', 'Inline', 'Common', + array( + // 'accesskey' => 'Character', + // 'charset' => 'Charset', + 'href' => 'URI', + // 'hreflang' => 'LanguageCode', + 'rel' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rel'), + 'rev' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rev'), + // 'tabindex' => 'Number', + // 'type' => 'ContentType', + ) + ); + $a->excludes = array('a' => true); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Image.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Image.php new file mode 100644 index 0000000..ca00b81 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Image.php @@ -0,0 +1,39 @@ +get('HTML', 'MaxImgLength'); + $img = $this->addElement( + 'img', 'Inline', 'Empty', 'Common', + array( + 'alt*' => 'Text', + // According to the spec, it's Length, but percents can + // be abused, so we allow only Pixels. + 'height' => 'Pixels#' . $max, + 'width' => 'Pixels#' . $max, + 'longdesc' => 'URI', + 'src*' => new HTMLPurifier_AttrDef_URI(true), // embedded + ) + ); + if ($max === null || $config->get('HTML', 'Trusted')) { + $img->attr['height'] = + $img->attr['width'] = 'Length'; + } + + // kind of strange, but splitting things up would be inefficient + $img->attr_transform_pre[] = + $img->attr_transform_post[] = + new HTMLPurifier_AttrTransform_ImgRequired(); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Legacy.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Legacy.php new file mode 100644 index 0000000..2772b13 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Legacy.php @@ -0,0 +1,136 @@ +addElement('basefont', 'Inline', 'Empty', false, array( + 'color' => 'Color', + 'face' => 'Text', // extremely broad, we should + 'size' => 'Text', // tighten it + 'id' => 'ID' + )); + $this->addElement('center', 'Block', 'Flow', 'Common'); + $this->addElement('dir', 'Block', 'Required: li', 'Common', array( + 'compact' => 'Bool#compact' + )); + $this->addElement('font', 'Inline', 'Inline', array('Core', 'I18N'), array( + 'color' => 'Color', + 'face' => 'Text', // extremely broad, we should + 'size' => 'Text', // tighten it + )); + $this->addElement('menu', 'Block', 'Required: li', 'Common', array( + 'compact' => 'Bool#compact' + )); + $this->addElement('s', 'Inline', 'Inline', 'Common'); + $this->addElement('strike', 'Inline', 'Inline', 'Common'); + $this->addElement('u', 'Inline', 'Inline', 'Common'); + + // setup modifications to old elements + + $align = 'Enum#left,right,center,justify'; + + $address = $this->addBlankElement('address'); + $address->content_model = 'Inline | #PCDATA | p'; + $address->content_model_type = 'optional'; + $address->child = false; + + $blockquote = $this->addBlankElement('blockquote'); + $blockquote->content_model = 'Flow | #PCDATA'; + $blockquote->content_model_type = 'optional'; + $blockquote->child = false; + + $br = $this->addBlankElement('br'); + $br->attr['clear'] = 'Enum#left,all,right,none'; + + $caption = $this->addBlankElement('caption'); + $caption->attr['align'] = 'Enum#top,bottom,left,right'; + + $div = $this->addBlankElement('div'); + $div->attr['align'] = $align; + + $dl = $this->addBlankElement('dl'); + $dl->attr['compact'] = 'Bool#compact'; + + for ($i = 1; $i <= 6; $i++) { + $h = $this->addBlankElement("h$i"); + $h->attr['align'] = $align; + } + + $hr = $this->addBlankElement('hr'); + $hr->attr['align'] = $align; + $hr->attr['noshade'] = 'Bool#noshade'; + $hr->attr['size'] = 'Pixels'; + $hr->attr['width'] = 'Length'; + + $img = $this->addBlankElement('img'); + $img->attr['align'] = 'Enum#top,middle,bottom,left,right'; + $img->attr['border'] = 'Pixels'; + $img->attr['hspace'] = 'Pixels'; + $img->attr['vspace'] = 'Pixels'; + + // figure out this integer business + + $li = $this->addBlankElement('li'); + $li->attr['value'] = new HTMLPurifier_AttrDef_Integer(); + $li->attr['type'] = 'Enum#s:1,i,I,a,A,disc,square,circle'; + + $ol = $this->addBlankElement('ol'); + $ol->attr['compact'] = 'Bool#compact'; + $ol->attr['start'] = new HTMLPurifier_AttrDef_Integer(); + $ol->attr['type'] = 'Enum#s:1,i,I,a,A'; + + $p = $this->addBlankElement('p'); + $p->attr['align'] = $align; + + $pre = $this->addBlankElement('pre'); + $pre->attr['width'] = 'Number'; + + // script omitted + + $table = $this->addBlankElement('table'); + $table->attr['align'] = 'Enum#left,center,right'; + $table->attr['bgcolor'] = 'Color'; + + $tr = $this->addBlankElement('tr'); + $tr->attr['bgcolor'] = 'Color'; + + $th = $this->addBlankElement('th'); + $th->attr['bgcolor'] = 'Color'; + $th->attr['height'] = 'Length'; + $th->attr['nowrap'] = 'Bool#nowrap'; + $th->attr['width'] = 'Length'; + + $td = $this->addBlankElement('td'); + $td->attr['bgcolor'] = 'Color'; + $td->attr['height'] = 'Length'; + $td->attr['nowrap'] = 'Bool#nowrap'; + $td->attr['width'] = 'Length'; + + $ul = $this->addBlankElement('ul'); + $ul->attr['compact'] = 'Bool#compact'; + $ul->attr['type'] = 'Enum#square,disc,circle'; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/List.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/List.php new file mode 100644 index 0000000..7232f60 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/List.php @@ -0,0 +1,34 @@ + 'List'); + + public function setup($config) { + $this->addElement('ol', 'List', 'Required: li', 'Common'); + $this->addElement('ul', 'List', 'Required: li', 'Common'); + $this->addElement('dl', 'List', 'Required: dt | dd', 'Common'); + + $this->addElement('li', false, 'Flow', 'Common'); + + $this->addElement('dd', false, 'Flow', 'Common'); + $this->addElement('dt', false, 'Inline', 'Common'); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Name.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Name.php new file mode 100644 index 0000000..1748a0b --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Name.php @@ -0,0 +1,16 @@ +addBlankElement($name); + $element->attr['name'] = 'ID'; + } + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php new file mode 100644 index 0000000..ca88152 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php @@ -0,0 +1,13 @@ + array( + 'lang' => 'LanguageCode', + ) + ); +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Object.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Object.php new file mode 100644 index 0000000..7dfd6b3 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Object.php @@ -0,0 +1,46 @@ + to cater to legacy browsers: this + * module does not allow this sort of behavior + */ +class HTMLPurifier_HTMLModule_Object extends HTMLPurifier_HTMLModule +{ + + public $name = 'Object'; + public $safe = false; + + public function setup($config) { + + $this->addElement('object', 'Inline', 'Optional: #PCDATA | Flow | param', 'Common', + array( + 'archive' => 'URI', + 'classid' => 'URI', + 'codebase' => 'URI', + 'codetype' => 'Text', + 'data' => 'URI', + 'declare' => 'Bool#declare', + 'height' => 'Length', + 'name' => 'CDATA', + 'standby' => 'Text', + 'tabindex' => 'Number', + 'type' => 'ContentType', + 'width' => 'Length' + ) + ); + + $this->addElement('param', false, 'Empty', false, + array( + 'id' => 'ID', + 'name*' => 'Text', + 'type' => 'Text', + 'value' => 'Text', + 'valuetype' => 'Enum#data,ref,object' + ) + ); + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Presentation.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Presentation.php new file mode 100644 index 0000000..9aa61ba --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Presentation.php @@ -0,0 +1,30 @@ +addElement('b', 'Inline', 'Inline', 'Common'); + $this->addElement('big', 'Inline', 'Inline', 'Common'); + $this->addElement('hr', 'Block', 'Empty', 'Common'); + $this->addElement('i', 'Inline', 'Inline', 'Common'); + $this->addElement('small', 'Inline', 'Inline', 'Common'); + $this->addElement('sub', 'Inline', 'Inline', 'Common'); + $this->addElement('sup', 'Inline', 'Inline', 'Common'); + $this->addElement('tt', 'Inline', 'Inline', 'Common'); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Proprietary.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Proprietary.php new file mode 100644 index 0000000..542e37c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Proprietary.php @@ -0,0 +1,32 @@ +addElement('marquee', 'Inline', 'Flow', 'Common', + array( + 'direction' => 'Enum#left,right,up,down', + 'behavior' => 'Enum#alternate', + 'width' => 'Length', + 'height' => 'Length', + 'scrolldelay' => 'Number', + 'scrollamount' => 'Number', + 'loop' => 'Number', + 'bgcolor' => 'Color', + 'hspace' => 'Pixels', + 'vspace' => 'Pixels', + ) + ); + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Ruby.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Ruby.php new file mode 100644 index 0000000..5f49201 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Ruby.php @@ -0,0 +1,26 @@ +addElement('ruby', 'Inline', + 'Custom: ((rb, (rt | (rp, rt, rp))) | (rbc, rtc, rtc?))', + 'Common'); + $this->addElement('rbc', false, 'Required: rb', 'Common'); + $this->addElement('rtc', false, 'Required: rt', 'Common'); + $rb = $this->addElement('rb', false, 'Inline', 'Common'); + $rb->excludes = array('ruby' => true); + $rt = $this->addElement('rt', false, 'Inline', 'Common', array('rbspan' => 'Number')); + $rt->excludes = array('ruby' => true); + $this->addElement('rp', false, 'Optional: #PCDATA', 'Common'); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/SafeEmbed.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/SafeEmbed.php new file mode 100644 index 0000000..bb2da7a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/SafeEmbed.php @@ -0,0 +1,31 @@ +get('HTML', 'MaxImgLength'); + $embed = $this->addElement( + 'embed', 'Inline', 'Empty', 'Common', + array( + 'src*' => 'URI#embedded', + 'type' => 'Enum#application/x-shockwave-flash', + 'width' => 'Pixels#' . $max, + 'height' => 'Pixels#' . $max, + 'allowscriptaccess' => 'Enum#never', + 'allownetworking' => 'Enum#internal', + 'wmode' => 'Enum#window', + 'name' => 'ID', + ) + ); + $embed->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeEmbed(); + + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/SafeObject.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/SafeObject.php new file mode 100644 index 0000000..9051a50 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/SafeObject.php @@ -0,0 +1,48 @@ +get('HTML', 'MaxImgLength'); + $object = $this->addElement( + 'object', + 'Inline', + 'Optional: param | Flow | #PCDATA', + 'Common', + array( + // While technically not required by the spec, we're forcing + // it to this value. + 'type' => 'Enum#application/x-shockwave-flash', + 'width' => 'Pixels#' . $max, + 'height' => 'Pixels#' . $max, + 'data' => 'URI#embedded' + ) + ); + $object->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeObject(); + + $param = $this->addElement('param', false, 'Empty', false, + array( + 'id' => 'ID', + 'name*' => 'Text', + 'value' => 'Text' + ) + ); + $param->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeParam(); + $this->info_injector[] = 'SafeObject'; + + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Scripting.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Scripting.php new file mode 100644 index 0000000..dc6704c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Scripting.php @@ -0,0 +1,53 @@ + 'script | noscript', 'Inline' => 'script | noscript'); + public $safe = false; + + public function setup($config) { + // TODO: create custom child-definition for noscript that + // auto-wraps stray #PCDATA in a similar manner to + // blockquote's custom definition (we would use it but + // blockquote's contents are optional while noscript's contents + // are required) + + // TODO: convert this to new syntax, main problem is getting + // both content sets working + + // In theory, this could be safe, but I don't see any reason to + // allow it. + $this->info['noscript'] = new HTMLPurifier_ElementDef(); + $this->info['noscript']->attr = array( 0 => array('Common') ); + $this->info['noscript']->content_model = 'Heading | List | Block'; + $this->info['noscript']->content_model_type = 'required'; + + $this->info['script'] = new HTMLPurifier_ElementDef(); + $this->info['script']->attr = array( + 'defer' => new HTMLPurifier_AttrDef_Enum(array('defer')), + 'src' => new HTMLPurifier_AttrDef_URI(true), + 'type' => new HTMLPurifier_AttrDef_Enum(array('text/javascript')) + ); + $this->info['script']->content_model = '#PCDATA'; + $this->info['script']->content_model_type = 'optional'; + $this->info['script']->attr_transform_pre['type'] = + $this->info['script']->attr_transform_post['type'] = + new HTMLPurifier_AttrTransform_ScriptRequired(); + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/StyleAttribute.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/StyleAttribute.php new file mode 100644 index 0000000..092d9ea --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/StyleAttribute.php @@ -0,0 +1,23 @@ + array('style' => false), // see constructor + 'Core' => array(0 => array('Style')) + ); + + public function setup($config) { + $this->attr_collections['Style']['style'] = new HTMLPurifier_AttrDef_CSS(); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tables.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tables.php new file mode 100644 index 0000000..1d5f11f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tables.php @@ -0,0 +1,65 @@ +addElement('caption', false, 'Inline', 'Common'); + + $this->addElement('table', 'Block', + new HTMLPurifier_ChildDef_Table(), 'Common', + array( + 'border' => 'Pixels', + 'cellpadding' => 'Length', + 'cellspacing' => 'Length', + 'frame' => 'Enum#void,above,below,hsides,lhs,rhs,vsides,box,border', + 'rules' => 'Enum#none,groups,rows,cols,all', + 'summary' => 'Text', + 'width' => 'Length' + ) + ); + + // common attributes + $cell_align = array( + 'align' => 'Enum#left,center,right,justify,char', + 'charoff' => 'Length', + 'valign' => 'Enum#top,middle,bottom,baseline', + ); + + $cell_t = array_merge( + array( + 'abbr' => 'Text', + 'colspan' => 'Number', + 'rowspan' => 'Number', + ), + $cell_align + ); + $this->addElement('td', false, 'Flow', 'Common', $cell_t); + $this->addElement('th', false, 'Flow', 'Common', $cell_t); + + $this->addElement('tr', false, 'Required: td | th', 'Common', $cell_align); + + $cell_col = array_merge( + array( + 'span' => 'Number', + 'width' => 'MultiLength', + ), + $cell_align + ); + $this->addElement('col', false, 'Empty', 'Common', $cell_col); + $this->addElement('colgroup', false, 'Optional: col', 'Common', $cell_col); + + $this->addElement('tbody', false, 'Required: tr', 'Common', $cell_align); + $this->addElement('thead', false, 'Required: tr', 'Common', $cell_align); + $this->addElement('tfoot', false, 'Required: tr', 'Common', $cell_align); + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Target.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Target.php new file mode 100644 index 0000000..4b4dada --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Target.php @@ -0,0 +1,22 @@ +addBlankElement($name); + $e->attr = array( + 'target' => new HTMLPurifier_AttrDef_HTML_FrameTarget() + ); + } + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Text.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Text.php new file mode 100644 index 0000000..9a0fe3b --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Text.php @@ -0,0 +1,62 @@ + 'Heading | Block | Inline' + ); + + public function setup($config) { + + // Inline Phrasal ------------------------------------------------- + $this->addElement('abbr', 'Inline', 'Inline', 'Common'); + $this->addElement('acronym', 'Inline', 'Inline', 'Common'); + $this->addElement('cite', 'Inline', 'Inline', 'Common'); + $this->addElement('code', 'Inline', 'Inline', 'Common'); + $this->addElement('dfn', 'Inline', 'Inline', 'Common'); + $this->addElement('em', 'Inline', 'Inline', 'Common'); + $this->addElement('kbd', 'Inline', 'Inline', 'Common'); + $this->addElement('q', 'Inline', 'Inline', 'Common', array('cite' => 'URI')); + $this->addElement('samp', 'Inline', 'Inline', 'Common'); + $this->addElement('strong', 'Inline', 'Inline', 'Common'); + $this->addElement('var', 'Inline', 'Inline', 'Common'); + + // Inline Structural ---------------------------------------------- + $this->addElement('span', 'Inline', 'Inline', 'Common'); + $this->addElement('br', 'Inline', 'Empty', 'Core'); + + // Block Phrasal -------------------------------------------------- + $this->addElement('address', 'Block', 'Inline', 'Common'); + $this->addElement('blockquote', 'Block', 'Optional: Heading | Block | List', 'Common', array('cite' => 'URI') ); + $pre = $this->addElement('pre', 'Block', 'Inline', 'Common'); + $pre->excludes = $this->makeLookup( + 'img', 'big', 'small', 'object', 'applet', 'font', 'basefont' ); + $this->addElement('h1', 'Heading', 'Inline', 'Common'); + $this->addElement('h2', 'Heading', 'Inline', 'Common'); + $this->addElement('h3', 'Heading', 'Inline', 'Common'); + $this->addElement('h4', 'Heading', 'Inline', 'Common'); + $this->addElement('h5', 'Heading', 'Inline', 'Common'); + $this->addElement('h6', 'Heading', 'Inline', 'Common'); + + // Block Structural ----------------------------------------------- + $this->addElement('p', 'Block', 'Inline', 'Common'); + $this->addElement('div', 'Block', 'Flow', 'Common'); + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy.php new file mode 100644 index 0000000..f94ef81 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy.php @@ -0,0 +1,207 @@ + 'none', 'light', 'medium', 'heavy'); + + /** + * Default level to place all fixes in. Disabled by default + */ + public $defaultLevel = null; + + /** + * Lists of fixes used by getFixesForLevel(). Format is: + * HTMLModule_Tidy->fixesForLevel[$level] = array('fix-1', 'fix-2'); + */ + public $fixesForLevel = array( + 'light' => array(), + 'medium' => array(), + 'heavy' => array() + ); + + /** + * Lazy load constructs the module by determining the necessary + * fixes to create and then delegating to the populate() function. + * @todo Wildcard matching and error reporting when an added or + * subtracted fix has no effect. + */ + public function setup($config) { + + // create fixes, initialize fixesForLevel + $fixes = $this->makeFixes(); + $this->makeFixesForLevel($fixes); + + // figure out which fixes to use + $level = $config->get('HTML', 'TidyLevel'); + $fixes_lookup = $this->getFixesForLevel($level); + + // get custom fix declarations: these need namespace processing + $add_fixes = $config->get('HTML', 'TidyAdd'); + $remove_fixes = $config->get('HTML', 'TidyRemove'); + + foreach ($fixes as $name => $fix) { + // needs to be refactored a little to implement globbing + if ( + isset($remove_fixes[$name]) || + (!isset($add_fixes[$name]) && !isset($fixes_lookup[$name])) + ) { + unset($fixes[$name]); + } + } + + // populate this module with necessary fixes + $this->populate($fixes); + + } + + /** + * Retrieves all fixes per a level, returning fixes for that specific + * level as well as all levels below it. + * @param $level String level identifier, see $levels for valid values + * @return Lookup up table of fixes + */ + public function getFixesForLevel($level) { + if ($level == $this->levels[0]) { + return array(); + } + $activated_levels = array(); + for ($i = 1, $c = count($this->levels); $i < $c; $i++) { + $activated_levels[] = $this->levels[$i]; + if ($this->levels[$i] == $level) break; + } + if ($i == $c) { + trigger_error( + 'Tidy level ' . htmlspecialchars($level) . ' not recognized', + E_USER_WARNING + ); + return array(); + } + $ret = array(); + foreach ($activated_levels as $level) { + foreach ($this->fixesForLevel[$level] as $fix) { + $ret[$fix] = true; + } + } + return $ret; + } + + /** + * Dynamically populates the $fixesForLevel member variable using + * the fixes array. It may be custom overloaded, used in conjunction + * with $defaultLevel, or not used at all. + */ + public function makeFixesForLevel($fixes) { + if (!isset($this->defaultLevel)) return; + if (!isset($this->fixesForLevel[$this->defaultLevel])) { + trigger_error( + 'Default level ' . $this->defaultLevel . ' does not exist', + E_USER_ERROR + ); + return; + } + $this->fixesForLevel[$this->defaultLevel] = array_keys($fixes); + } + + /** + * Populates the module with transforms and other special-case code + * based on a list of fixes passed to it + * @param $lookup Lookup table of fixes to activate + */ + public function populate($fixes) { + foreach ($fixes as $name => $fix) { + // determine what the fix is for + list($type, $params) = $this->getFixType($name); + switch ($type) { + case 'attr_transform_pre': + case 'attr_transform_post': + $attr = $params['attr']; + if (isset($params['element'])) { + $element = $params['element']; + if (empty($this->info[$element])) { + $e = $this->addBlankElement($element); + } else { + $e = $this->info[$element]; + } + } else { + $type = "info_$type"; + $e = $this; + } + // PHP does some weird parsing when I do + // $e->$type[$attr], so I have to assign a ref. + $f =& $e->$type; + $f[$attr] = $fix; + break; + case 'tag_transform': + $this->info_tag_transform[$params['element']] = $fix; + break; + case 'child': + case 'content_model_type': + $element = $params['element']; + if (empty($this->info[$element])) { + $e = $this->addBlankElement($element); + } else { + $e = $this->info[$element]; + } + $e->$type = $fix; + break; + default: + trigger_error("Fix type $type not supported", E_USER_ERROR); + break; + } + } + } + + /** + * Parses a fix name and determines what kind of fix it is, as well + * as other information defined by the fix + * @param $name String name of fix + * @return array(string $fix_type, array $fix_parameters) + * @note $fix_parameters is type dependant, see populate() for usage + * of these parameters + */ + public function getFixType($name) { + // parse it + $property = $attr = null; + if (strpos($name, '#') !== false) list($name, $property) = explode('#', $name); + if (strpos($name, '@') !== false) list($name, $attr) = explode('@', $name); + + // figure out the parameters + $params = array(); + if ($name !== '') $params['element'] = $name; + if (!is_null($attr)) $params['attr'] = $attr; + + // special case: attribute transform + if (!is_null($attr)) { + if (is_null($property)) $property = 'pre'; + $type = 'attr_transform_' . $property; + return array($type, $params); + } + + // special case: tag transform + if (is_null($property)) { + return array('tag_transform', $params); + } + + return array($property, $params); + + } + + /** + * Defines all fixes the module will perform in a compact + * associative array of fix name to fix implementation. + */ + public function makeFixes() {} + +} + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Name.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Name.php new file mode 100644 index 0000000..0b58079 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Name.php @@ -0,0 +1,23 @@ +content_model_type != 'strictblockquote') return parent::getChildDef($def); + return new HTMLPurifier_ChildDef_StrictBlockquote($def->content_model); + } +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php new file mode 100644 index 0000000..2da3109 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php @@ -0,0 +1,8 @@ + 'text-align:left;', + 'right' => 'text-align:right;', + 'top' => 'caption-side:top;', + 'bottom' => 'caption-side:bottom;' // not supported by IE + )); + + // @align for img ------------------------------------------------- + $r['img@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + 'left' => 'float:left;', + 'right' => 'float:right;', + 'top' => 'vertical-align:top;', + 'middle' => 'vertical-align:middle;', + 'bottom' => 'vertical-align:baseline;', + )); + + // @align for table ----------------------------------------------- + $r['table@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + 'left' => 'float:left;', + 'center' => 'margin-left:auto;margin-right:auto;', + 'right' => 'float:right;' + )); + + // @align for hr ----------------------------------------------- + $r['hr@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + // we use both text-align and margin because these work + // for different browsers (IE and Firefox, respectively) + // and the melange makes for a pretty cross-compatible + // solution + 'left' => 'margin-left:0;margin-right:auto;text-align:left;', + 'center' => 'margin-left:auto;margin-right:auto;text-align:center;', + 'right' => 'margin-left:auto;margin-right:0;text-align:right;' + )); + + // @align for h1, h2, h3, h4, h5, h6, p, div ---------------------- + // {{{ + $align_lookup = array(); + $align_values = array('left', 'right', 'center', 'justify'); + foreach ($align_values as $v) $align_lookup[$v] = "text-align:$v;"; + // }}} + $r['h1@align'] = + $r['h2@align'] = + $r['h3@align'] = + $r['h4@align'] = + $r['h5@align'] = + $r['h6@align'] = + $r['p@align'] = + $r['div@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS('align', $align_lookup); + + // @bgcolor for table, tr, td, th --------------------------------- + $r['table@bgcolor'] = + $r['td@bgcolor'] = + $r['th@bgcolor'] = + new HTMLPurifier_AttrTransform_BgColor(); + + // @border for img ------------------------------------------------ + $r['img@border'] = new HTMLPurifier_AttrTransform_Border(); + + // @clear for br -------------------------------------------------- + $r['br@clear'] = + new HTMLPurifier_AttrTransform_EnumToCSS('clear', array( + 'left' => 'clear:left;', + 'right' => 'clear:right;', + 'all' => 'clear:both;', + 'none' => 'clear:none;', + )); + + // @height for td, th --------------------------------------------- + $r['td@height'] = + $r['th@height'] = + new HTMLPurifier_AttrTransform_Length('height'); + + // @hspace for img ------------------------------------------------ + $r['img@hspace'] = new HTMLPurifier_AttrTransform_ImgSpace('hspace'); + + // @noshade for hr ------------------------------------------------ + // this transformation is not precise but often good enough. + // different browsers use different styles to designate noshade + $r['hr@noshade'] = + new HTMLPurifier_AttrTransform_BoolToCSS( + 'noshade', + 'color:#808080;background-color:#808080;border:0;' + ); + + // @nowrap for td, th --------------------------------------------- + $r['td@nowrap'] = + $r['th@nowrap'] = + new HTMLPurifier_AttrTransform_BoolToCSS( + 'nowrap', + 'white-space:nowrap;' + ); + + // @size for hr -------------------------------------------------- + $r['hr@size'] = new HTMLPurifier_AttrTransform_Length('size', 'height'); + + // @type for li, ol, ul ------------------------------------------- + // {{{ + $ul_types = array( + 'disc' => 'list-style-type:disc;', + 'square' => 'list-style-type:square;', + 'circle' => 'list-style-type:circle;' + ); + $ol_types = array( + '1' => 'list-style-type:decimal;', + 'i' => 'list-style-type:lower-roman;', + 'I' => 'list-style-type:upper-roman;', + 'a' => 'list-style-type:lower-alpha;', + 'A' => 'list-style-type:upper-alpha;' + ); + $li_types = $ul_types + $ol_types; + // }}} + + $r['ul@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ul_types); + $r['ol@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ol_types, true); + $r['li@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $li_types, true); + + // @vspace for img ------------------------------------------------ + $r['img@vspace'] = new HTMLPurifier_AttrTransform_ImgSpace('vspace'); + + // @width for hr, td, th ------------------------------------------ + $r['td@width'] = + $r['th@width'] = + $r['hr@width'] = new HTMLPurifier_AttrTransform_Length('width'); + + return $r; + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php new file mode 100644 index 0000000..1a3772d --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php @@ -0,0 +1,13 @@ + array( + 'xml:lang' => 'LanguageCode', + ) + ); +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModuleManager.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModuleManager.php new file mode 100644 index 0000000..a37e8cc --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/HTMLModuleManager.php @@ -0,0 +1,403 @@ +attrTypes = new HTMLPurifier_AttrTypes(); + $this->doctypes = new HTMLPurifier_DoctypeRegistry(); + + // setup basic modules + $common = array( + 'CommonAttributes', 'Text', 'Hypertext', 'List', + 'Presentation', 'Edit', 'Bdo', 'Tables', 'Image', + 'StyleAttribute', + // Unsafe: + 'Scripting', 'Object', 'Forms', + // Sorta legacy, but present in strict: + 'Name', + ); + $transitional = array('Legacy', 'Target'); + $xml = array('XMLCommonAttributes'); + $non_xml = array('NonXMLCommonAttributes'); + + // setup basic doctypes + $this->doctypes->register( + 'HTML 4.01 Transitional', false, + array_merge($common, $transitional, $non_xml), + array('Tidy_Transitional', 'Tidy_Proprietary'), + array(), + '-//W3C//DTD HTML 4.01 Transitional//EN', + 'http://www.w3.org/TR/html4/loose.dtd' + ); + + $this->doctypes->register( + 'HTML 4.01 Strict', false, + array_merge($common, $non_xml), + array('Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'), + array(), + '-//W3C//DTD HTML 4.01//EN', + 'http://www.w3.org/TR/html4/strict.dtd' + ); + + $this->doctypes->register( + 'XHTML 1.0 Transitional', true, + array_merge($common, $transitional, $xml, $non_xml), + array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Name'), + array(), + '-//W3C//DTD XHTML 1.0 Transitional//EN', + 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' + ); + + $this->doctypes->register( + 'XHTML 1.0 Strict', true, + array_merge($common, $xml, $non_xml), + array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'), + array(), + '-//W3C//DTD XHTML 1.0 Strict//EN', + 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' + ); + + $this->doctypes->register( + 'XHTML 1.1', true, + array_merge($common, $xml, array('Ruby')), + array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict', 'Tidy_Name'), // Tidy_XHTML1_1 + array(), + '-//W3C//DTD XHTML 1.1//EN', + 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd' + ); + + } + + /** + * Registers a module to the recognized module list, useful for + * overloading pre-existing modules. + * @param $module Mixed: string module name, with or without + * HTMLPurifier_HTMLModule prefix, or instance of + * subclass of HTMLPurifier_HTMLModule. + * @param $overload Boolean whether or not to overload previous modules. + * If this is not set, and you do overload a module, + * HTML Purifier will complain with a warning. + * @note This function will not call autoload, you must instantiate + * (and thus invoke) autoload outside the method. + * @note If a string is passed as a module name, different variants + * will be tested in this order: + * - Check for HTMLPurifier_HTMLModule_$name + * - Check all prefixes with $name in order they were added + * - Check for literal object name + * - Throw fatal error + * If your object name collides with an internal class, specify + * your module manually. All modules must have been included + * externally: registerModule will not perform inclusions for you! + */ + public function registerModule($module, $overload = false) { + if (is_string($module)) { + // attempt to load the module + $original_module = $module; + $ok = false; + foreach ($this->prefixes as $prefix) { + $module = $prefix . $original_module; + if (class_exists($module)) { + $ok = true; + break; + } + } + if (!$ok) { + $module = $original_module; + if (!class_exists($module)) { + trigger_error($original_module . ' module does not exist', + E_USER_ERROR); + return; + } + } + $module = new $module(); + } + if (empty($module->name)) { + trigger_error('Module instance of ' . get_class($module) . ' must have name'); + return; + } + if (!$overload && isset($this->registeredModules[$module->name])) { + trigger_error('Overloading ' . $module->name . ' without explicit overload parameter', E_USER_WARNING); + } + $this->registeredModules[$module->name] = $module; + } + + /** + * Adds a module to the current doctype by first registering it, + * and then tacking it on to the active doctype + */ + public function addModule($module) { + $this->registerModule($module); + if (is_object($module)) $module = $module->name; + $this->userModules[] = $module; + } + + /** + * Adds a class prefix that registerModule() will use to resolve a + * string name to a concrete class + */ + public function addPrefix($prefix) { + $this->prefixes[] = $prefix; + } + + /** + * Performs processing on modules, after being called you may + * use getElement() and getElements() + * @param $config Instance of HTMLPurifier_Config + */ + public function setup($config) { + + $this->trusted = $config->get('HTML', 'Trusted'); + + // generate + $this->doctype = $this->doctypes->make($config); + $modules = $this->doctype->modules; + + // take out the default modules that aren't allowed + $lookup = $config->get('HTML', 'AllowedModules'); + $special_cases = $config->get('HTML', 'CoreModules'); + + if (is_array($lookup)) { + foreach ($modules as $k => $m) { + if (isset($special_cases[$m])) continue; + if (!isset($lookup[$m])) unset($modules[$k]); + } + } + + // add proprietary module (this gets special treatment because + // it is completely removed from doctypes, etc.) + if ($config->get('HTML', 'Proprietary')) { + $modules[] = 'Proprietary'; + } + + // add SafeObject/Safeembed modules + if ($config->get('HTML', 'SafeObject')) { + $modules[] = 'SafeObject'; + } + if ($config->get('HTML', 'SafeEmbed')) { + $modules[] = 'SafeEmbed'; + } + + // merge in custom modules + $modules = array_merge($modules, $this->userModules); + + foreach ($modules as $module) { + $this->processModule($module); + $this->modules[$module]->setup($config); + } + + foreach ($this->doctype->tidyModules as $module) { + $this->processModule($module); + $this->modules[$module]->setup($config); + } + + // prepare any injectors + foreach ($this->modules as $module) { + $n = array(); + foreach ($module->info_injector as $i => $injector) { + if (!is_object($injector)) { + $class = "HTMLPurifier_Injector_$injector"; + $injector = new $class; + } + $n[$injector->name] = $injector; + } + $module->info_injector = $n; + } + + // setup lookup table based on all valid modules + foreach ($this->modules as $module) { + foreach ($module->info as $name => $def) { + if (!isset($this->elementLookup[$name])) { + $this->elementLookup[$name] = array(); + } + $this->elementLookup[$name][] = $module->name; + } + } + + // note the different choice + $this->contentSets = new HTMLPurifier_ContentSets( + // content set assembly deals with all possible modules, + // not just ones deemed to be "safe" + $this->modules + ); + $this->attrCollections = new HTMLPurifier_AttrCollections( + $this->attrTypes, + // there is no way to directly disable a global attribute, + // but using AllowedAttributes or simply not including + // the module in your custom doctype should be sufficient + $this->modules + ); + } + + /** + * Takes a module and adds it to the active module collection, + * registering it if necessary. + */ + public function processModule($module) { + if (!isset($this->registeredModules[$module]) || is_object($module)) { + $this->registerModule($module); + } + $this->modules[$module] = $this->registeredModules[$module]; + } + + /** + * Retrieves merged element definitions. + * @return Array of HTMLPurifier_ElementDef + */ + public function getElements() { + + $elements = array(); + foreach ($this->modules as $module) { + if (!$this->trusted && !$module->safe) continue; + foreach ($module->info as $name => $v) { + if (isset($elements[$name])) continue; + $elements[$name] = $this->getElement($name); + } + } + + // remove dud elements, this happens when an element that + // appeared to be safe actually wasn't + foreach ($elements as $n => $v) { + if ($v === false) unset($elements[$n]); + } + + return $elements; + + } + + /** + * Retrieves a single merged element definition + * @param $name Name of element + * @param $trusted Boolean trusted overriding parameter: set to true + * if you want the full version of an element + * @return Merged HTMLPurifier_ElementDef + * @note You may notice that modules are getting iterated over twice (once + * in getElements() and once here). This + * is because + */ + public function getElement($name, $trusted = null) { + + if (!isset($this->elementLookup[$name])) { + return false; + } + + // setup global state variables + $def = false; + if ($trusted === null) $trusted = $this->trusted; + + // iterate through each module that has registered itself to this + // element + foreach($this->elementLookup[$name] as $module_name) { + + $module = $this->modules[$module_name]; + + // refuse to create/merge from a module that is deemed unsafe-- + // pretend the module doesn't exist--when trusted mode is not on. + if (!$trusted && !$module->safe) { + continue; + } + + // clone is used because, ideally speaking, the original + // definition should not be modified. Usually, this will + // make no difference, but for consistency's sake + $new_def = clone $module->info[$name]; + + if (!$def && $new_def->standalone) { + $def = $new_def; + } elseif ($def) { + // This will occur even if $new_def is standalone. In practice, + // this will usually result in a full replacement. + $def->mergeIn($new_def); + } else { + // :TODO: + // non-standalone definitions that don't have a standalone + // to merge into could be deferred to the end + continue; + } + + // attribute value expansions + $this->attrCollections->performInclusions($def->attr); + $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes); + + // descendants_are_inline, for ChildDef_Chameleon + if (is_string($def->content_model) && + strpos($def->content_model, 'Inline') !== false) { + if ($name != 'del' && $name != 'ins') { + // this is for you, ins/del + $def->descendants_are_inline = true; + } + } + + $this->contentSets->generateChildDef($def, $module); + } + + // This can occur if there is a blank definition, but no base to + // mix it in with + if (!$def) return false; + + // add information on required attributes + foreach ($def->attr as $attr_name => $attr_def) { + if ($attr_def->required) { + $def->required_attr[] = $attr_name; + } + } + + return $def; + + } + +} + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/IDAccumulator.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/IDAccumulator.php new file mode 100644 index 0000000..5eaaf36 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/IDAccumulator.php @@ -0,0 +1,52 @@ +load($config->get('Attr', 'IDBlacklist')); + return $id_accumulator; + } + + /** + * Add an ID to the lookup table. + * @param $id ID to be added. + * @return Bool status, true if success, false if there's a dupe + */ + public function add($id) { + if (isset($this->ids[$id])) return false; + return $this->ids[$id] = true; + } + + /** + * Load a list of IDs into the lookup table + * @param $array_of_ids Array of IDs to load + * @note This function doesn't care about duplicates + */ + public function load($array_of_ids) { + foreach ($array_of_ids as $id) { + $this->ids[$id] = true; + } + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector.php new file mode 100644 index 0000000..2fd56b3 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector.php @@ -0,0 +1,232 @@ +processToken() + * documentation. + * + * @todo Allow injectors to request a re-run on their output. This + * would help if an operation is recursive. + */ +abstract class HTMLPurifier_Injector +{ + + /** + * Advisory name of injector, this is for friendly error messages + */ + public $name; + + /** + * Instance of HTMLPurifier_HTMLDefinition + */ + protected $htmlDefinition; + + /** + * Reference to CurrentNesting variable in Context. This is an array + * list of tokens that we are currently "inside" + */ + protected $currentNesting; + + /** + * Reference to InputTokens variable in Context. This is an array + * list of the input tokens that are being processed. + */ + protected $inputTokens; + + /** + * Reference to InputIndex variable in Context. This is an integer + * array index for $this->inputTokens that indicates what token + * is currently being processed. + */ + protected $inputIndex; + + /** + * Array of elements and attributes this injector creates and therefore + * need to be allowed by the definition. Takes form of + * array('element' => array('attr', 'attr2'), 'element2') + */ + public $needed = array(); + + /** + * Index of inputTokens to rewind to. + */ + protected $rewind = false; + + /** + * Rewind to a spot to re-perform processing. This is useful if you + * deleted a node, and now need to see if this change affected any + * earlier nodes. Rewinding does not affect other injectors, and can + * result in infinite loops if not used carefully. + * @warning HTML Purifier will prevent you from fast-forwarding with this + * function. + */ + public function rewind($index) { + $this->rewind = $index; + } + + /** + * Retrieves rewind, and then unsets it. + */ + public function getRewind() { + $r = $this->rewind; + $this->rewind = false; + return $r; + } + + /** + * Prepares the injector by giving it the config and context objects: + * this allows references to important variables to be made within + * the injector. This function also checks if the HTML environment + * will work with the Injector (see checkNeeded()). + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + * @return Boolean false if success, string of missing needed element/attribute if failure + */ + public function prepare($config, $context) { + $this->htmlDefinition = $config->getHTMLDefinition(); + // Even though this might fail, some unit tests ignore this and + // still test checkNeeded, so be careful. Maybe get rid of that + // dependency. + $result = $this->checkNeeded($config); + if ($result !== false) return $result; + $this->currentNesting =& $context->get('CurrentNesting'); + $this->inputTokens =& $context->get('InputTokens'); + $this->inputIndex =& $context->get('InputIndex'); + return false; + } + + /** + * This function checks if the HTML environment + * will work with the Injector: if p tags are not allowed, the + * Auto-Paragraphing injector should not be enabled. + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + * @return Boolean false if success, string of missing needed element/attribute if failure + */ + public function checkNeeded($config) { + $def = $config->getHTMLDefinition(); + foreach ($this->needed as $element => $attributes) { + if (is_int($element)) $element = $attributes; + if (!isset($def->info[$element])) return $element; + if (!is_array($attributes)) continue; + foreach ($attributes as $name) { + if (!isset($def->info[$element]->attr[$name])) return "$element.$name"; + } + } + return false; + } + + /** + * Tests if the context node allows a certain element + * @param $name Name of element to test for + * @return True if element is allowed, false if it is not + */ + public function allowsElement($name) { + if (!empty($this->currentNesting)) { + $parent_token = array_pop($this->currentNesting); + $this->currentNesting[] = $parent_token; + $parent = $this->htmlDefinition->info[$parent_token->name]; + } else { + $parent = $this->htmlDefinition->info_parent_def; + } + if (!isset($parent->child->elements[$name]) || isset($parent->excludes[$name])) { + return false; + } + return true; + } + + /** + * Iterator function, which starts with the next token and continues until + * you reach the end of the input tokens. + * @warning Please prevent previous references from interfering with this + * functions by setting $i = null beforehand! + * @param &$i Current integer index variable for inputTokens + * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference + */ + protected function forward(&$i, &$current) { + if ($i === null) $i = $this->inputIndex + 1; + else $i++; + if (!isset($this->inputTokens[$i])) return false; + $current = $this->inputTokens[$i]; + return true; + } + + /** + * Similar to _forward, but accepts a third parameter $nesting (which + * should be initialized at 0) and stops when we hit the end tag + * for the node $this->inputIndex starts in. + */ + protected function forwardUntilEndToken(&$i, &$current, &$nesting) { + $result = $this->forward($i, $current); + if (!$result) return false; + if ($nesting === null) $nesting = 0; + if ($current instanceof HTMLPurifier_Token_Start) $nesting++; + elseif ($current instanceof HTMLPurifier_Token_End) { + if ($nesting <= 0) return false; + $nesting--; + } + return true; + } + + /** + * Iterator function, starts with the previous token and continues until + * you reach the beginning of input tokens. + * @warning Please prevent previous references from interfering with this + * functions by setting $i = null beforehand! + * @param &$i Current integer index variable for inputTokens + * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference + */ + protected function backward(&$i, &$current) { + if ($i === null) $i = $this->inputIndex - 1; + else $i--; + if ($i < 0) return false; + $current = $this->inputTokens[$i]; + return true; + } + + /** + * Initializes the iterator at the current position. Use in a do {} while; + * loop to force the _forward and _backward functions to start at the + * current location. + * @warning Please prevent previous references from interfering with this + * functions by setting $i = null beforehand! + * @param &$i Current integer index variable for inputTokens + * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference + */ + protected function current(&$i, &$current) { + if ($i === null) $i = $this->inputIndex; + $current = $this->inputTokens[$i]; + } + + /** + * Handler that is called when a text token is processed + */ + public function handleText(&$token) {} + + /** + * Handler that is called when a start or empty token is processed + */ + public function handleElement(&$token) {} + + /** + * Handler that is called when an end token is processed + */ + public function handleEnd(&$token) { + $this->notifyEnd($token); + } + + /** + * Notifier that is called when an end token is processed + * @note This differs from handlers in that the token is read-only + * @deprecated + */ + public function notifyEnd($token) {} + + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/AutoParagraph.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/AutoParagraph.php new file mode 100644 index 0000000..cb39f74 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/AutoParagraph.php @@ -0,0 +1,339 @@ +armor['MakeWellFormed_TagClosedError'] = true; + return $par; + } + + public function handleText(&$token) { + $text = $token->data; + // Does the current parent allow

    tags? + if ($this->allowsElement('p')) { + if (empty($this->currentNesting) || strpos($text, "\n\n") !== false) { + // Note that we have differing behavior when dealing with text + // in the anonymous root node, or a node inside the document. + // If the text as a double-newline, the treatment is the same; + // if it doesn't, see the next if-block if you're in the document. + + $i = $nesting = null; + if (!$this->forwardUntilEndToken($i, $current, $nesting) && $token->is_whitespace) { + // State 1.1: ... ^ (whitespace, then document end) + // ---- + // This is a degenerate case + } else { + // State 1.2: PAR1 + // ---- + + // State 1.3: PAR1\n\nPAR2 + // ------------ + + // State 1.4:

    PAR1\n\nPAR2 (see State 2) + // ------------ + $token = array($this->_pStart()); + $this->_splitText($text, $token); + } + } else { + // State 2:
    PAR1... (similar to 1.4) + // ---- + + // We're in an element that allows paragraph tags, but we're not + // sure if we're going to need them. + if ($this->_pLookAhead()) { + // State 2.1:
    PAR1PAR1\n\nPAR2 + // ---- + // Note: This will always be the first child, since any + // previous inline element would have triggered this very + // same routine, and found the double newline. One possible + // exception would be a comment. + $token = array($this->_pStart(), $token); + } else { + // State 2.2.1:
    PAR1
    + // ---- + + // State 2.2.2:
    PAR1PAR1
    + // ---- + } + } + // Is the current parent a

    tag? + } elseif ( + !empty($this->currentNesting) && + $this->currentNesting[count($this->currentNesting)-1]->name == 'p' + ) { + // State 3.1: ...

    PAR1 + // ---- + + // State 3.2: ...

    PAR1\n\nPAR2 + // ------------ + $token = array(); + $this->_splitText($text, $token); + // Abort! + } else { + // State 4.1: ...PAR1 + // ---- + + // State 4.2: ...PAR1\n\nPAR2 + // ------------ + } + } + + public function handleElement(&$token) { + // We don't have to check if we're already in a

    tag for block + // tokens, because the tag would have been autoclosed by MakeWellFormed. + if ($this->allowsElement('p')) { + if (!empty($this->currentNesting)) { + if ($this->_isInline($token)) { + // State 1:

    ... + // --- + + // Check if this token is adjacent to the parent token + // (seek backwards until token isn't whitespace) + $i = null; + $this->backward($i, $prev); + + if (!$prev instanceof HTMLPurifier_Token_Start) { + // Token wasn't adjacent + + if ( + $prev instanceof HTMLPurifier_Token_Text && + substr($prev->data, -2) === "\n\n" + ) { + // State 1.1.4:

    PAR1

    \n\n + // --- + + // Quite frankly, this should be handled by splitText + $token = array($this->_pStart(), $token); + } else { + // State 1.1.1:

    PAR1

    + // --- + + // State 1.1.2:

    + // --- + + // State 1.1.3:
    PAR + // --- + } + + } else { + // State 1.2.1:
    + // --- + + // Lookahead to see if

    is needed. + if ($this->_pLookAhead()) { + // State 1.3.1:

    PAR1\n\nPAR2 + // --- + $token = array($this->_pStart(), $token); + } else { + // State 1.3.2:
    PAR1
    + // --- + + // State 1.3.3:
    PAR1
    \n\n
    + // --- + } + } + } else { + // State 2.3: ...
    + // ----- + } + } else { + if ($this->_isInline($token)) { + // State 3.1: + // --- + // This is where the {p} tag is inserted, not reflected in + // inputTokens yet, however. + $token = array($this->_pStart(), $token); + } else { + // State 3.2:
    + // ----- + } + + $i = null; + if ($this->backward($i, $prev)) { + if ( + !$prev instanceof HTMLPurifier_Token_Text + ) { + // State 3.1.1: ...

    {p} + // --- + + // State 3.2.1: ...

    + // ----- + + if (!is_array($token)) $token = array($token); + array_unshift($token, new HTMLPurifier_Token_Text("\n\n")); + } else { + // State 3.1.2: ...

    \n\n{p} + // --- + + // State 3.2.2: ...

    \n\n
    + // ----- + + // Note: PAR cannot occur because PAR would have been + // wrapped in

    tags. + } + } + } + } else { + // State 2.2:

    • + // ---- + + // State 2.4:

      + // --- + } + } + + /** + * Splits up a text in paragraph tokens and appends them + * to the result stream that will replace the original + * @param $data String text data that will be processed + * into paragraphs + * @param $result Reference to array of tokens that the + * tags will be appended onto + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + */ + private function _splitText($data, &$result) { + $raw_paragraphs = explode("\n\n", $data); + $paragraphs = array(); // without empty paragraphs + $needs_start = false; + $needs_end = false; + + $c = count($raw_paragraphs); + if ($c == 1) { + // There were no double-newlines, abort quickly. In theory this + // should never happen. + $result[] = new HTMLPurifier_Token_Text($data); + return; + } + for ($i = 0; $i < $c; $i++) { + $par = $raw_paragraphs[$i]; + if (trim($par) !== '') { + $paragraphs[] = $par; + } else { + if ($i == 0) { + // Double newline at the front + if (empty($result)) { + // The empty result indicates that the AutoParagraph + // injector did not add any start paragraph tokens. + // This means that we have been in a paragraph for + // a while, and the newline means we should start a new one. + $result[] = new HTMLPurifier_Token_End('p'); + $result[] = new HTMLPurifier_Token_Text("\n\n"); + // However, the start token should only be added if + // there is more processing to be done (i.e. there are + // real paragraphs in here). If there are none, the + // next start paragraph tag will be handled by the + // next call to the injector + $needs_start = true; + } else { + // We just started a new paragraph! + // Reinstate a double-newline for presentation's sake, since + // it was in the source code. + array_unshift($result, new HTMLPurifier_Token_Text("\n\n")); + } + } elseif ($i + 1 == $c) { + // Double newline at the end + // There should be a trailing

      when we're finally done. + $needs_end = true; + } + } + } + + // Check if this was just a giant blob of whitespace. Move this earlier, + // perhaps? + if (empty($paragraphs)) { + return; + } + + // Add the start tag indicated by \n\n at the beginning of $data + if ($needs_start) { + $result[] = $this->_pStart(); + } + + // Append the paragraphs onto the result + foreach ($paragraphs as $par) { + $result[] = new HTMLPurifier_Token_Text($par); + $result[] = new HTMLPurifier_Token_End('p'); + $result[] = new HTMLPurifier_Token_Text("\n\n"); + $result[] = $this->_pStart(); + } + + // Remove trailing start token; Injector will handle this later if + // it was indeed needed. This prevents from needing to do a lookahead, + // at the cost of a lookbehind later. + array_pop($result); + + // If there is no need for an end tag, remove all of it and let + // MakeWellFormed close it later. + if (!$needs_end) { + array_pop($result); // removes \n\n + array_pop($result); // removes

      + } + + } + + /** + * Returns true if passed token is inline (and, ergo, allowed in + * paragraph tags) + */ + private function _isInline($token) { + return isset($this->htmlDefinition->info['p']->child->elements[$token->name]); + } + + /** + * Looks ahead in the token list and determines whether or not we need + * to insert a

      tag. + */ + private function _pLookAhead() { + $this->current($i, $current); + if ($current instanceof HTMLPurifier_Token_Start) $nesting = 1; + else $nesting = 0; + $ok = false; + while ($this->forwardUntilEndToken($i, $current, $nesting)) { + $result = $this->_checkNeedsP($current); + if ($result !== null) { + $ok = $result; + break; + } + } + return $ok; + } + + /** + * Determines if a particular token requires an earlier inline token + * to get a paragraph. This should be used with _forwardUntilEndToken + */ + private function _checkNeedsP($current) { + if ($current instanceof HTMLPurifier_Token_Start){ + if (!$this->_isInline($current)) { + //

      PAR1
      + // ---- + // Terminate early, since we hit a block element + return false; + } + } elseif ($current instanceof HTMLPurifier_Token_Text) { + if (strpos($current->data, "\n\n") !== false) { + //
      PAR1PAR1\n\nPAR2 + // ---- + return true; + } else { + //
      PAR1PAR1... + // ---- + } + } + return null; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/DisplayLinkURI.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/DisplayLinkURI.php new file mode 100644 index 0000000..bdb6a7a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/DisplayLinkURI.php @@ -0,0 +1,24 @@ +start->attr['href'])){ + $url = $token->start->attr['href']; + unset($token->start->attr['href']); + $token = array($token, new HTMLPurifier_Token_Text(" ($url)")); + } else { + // nothing to display + } + } +} \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/Linkify.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/Linkify.php new file mode 100644 index 0000000..f2a32d6 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/Linkify.php @@ -0,0 +1,45 @@ + array('href')); + + public function handleText(&$token) { + if (!$this->allowsElement('a')) return; + + if (strpos($token->data, '://') === false) { + // our really quick heuristic failed, abort + // this may not work so well if we want to match things like + // "google.com", but then again, most people don't + return; + } + + // there is/are URL(s). Let's split the string: + // Note: this regex is extremely permissive + $bits = preg_split('#((?:https?|ftp)://[^\s\'"<>()]+)#S', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); + + $token = array(); + + // $i = index + // $c = count + // $l = is link + for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { + if (!$l) { + if ($bits[$i] === '') continue; + $token[] = new HTMLPurifier_Token_Text($bits[$i]); + } else { + $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i])); + $token[] = new HTMLPurifier_Token_Text($bits[$i]); + $token[] = new HTMLPurifier_Token_End('a'); + } + } + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/PurifierLinkify.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/PurifierLinkify.php new file mode 100644 index 0000000..0137851 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/PurifierLinkify.php @@ -0,0 +1,44 @@ + array('href')); + + public function prepare($config, $context) { + $this->docURL = $config->get('AutoFormatParam', 'PurifierLinkifyDocURL'); + return parent::prepare($config, $context); + } + + public function handleText(&$token) { + if (!$this->allowsElement('a')) return; + if (strpos($token->data, '%') === false) return; + + $bits = preg_split('#%([a-z0-9]+\.[a-z0-9]+)#Si', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); + $token = array(); + + // $i = index + // $c = count + // $l = is link + for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { + if (!$l) { + if ($bits[$i] === '') continue; + $token[] = new HTMLPurifier_Token_Text($bits[$i]); + } else { + $token[] = new HTMLPurifier_Token_Start('a', + array('href' => str_replace('%s', $bits[$i], $this->docURL))); + $token[] = new HTMLPurifier_Token_Text('%' . $bits[$i]); + $token[] = new HTMLPurifier_Token_End('a'); + } + } + + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/RemoveEmpty.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/RemoveEmpty.php new file mode 100644 index 0000000..2934007 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/RemoveEmpty.php @@ -0,0 +1,40 @@ +config = $config; + $this->context = $context; + $this->attrValidator = new HTMLPurifier_AttrValidator(); + } + + public function handleElement(&$token) { + if (!$token instanceof HTMLPurifier_Token_Start) return; + $next = false; + for ($i = $this->inputIndex + 1, $c = count($this->inputTokens); $i < $c; $i++) { + $next = $this->inputTokens[$i]; + if ($next instanceof HTMLPurifier_Token_Text && $next->is_whitespace) continue; + break; + } + if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) { + if ($token->name == 'colgroup') return; + $this->attrValidator->validateToken($token, $this->config, $this->context); + $token->armor['ValidateAttributes'] = true; + if (isset($token->attr['id']) || isset($token->attr['name'])) return; + $token = $i - $this->inputIndex + 1; + for ($b = $this->inputIndex - 1; $b > 0; $b--) { + $prev = $this->inputTokens[$b]; + if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) continue; + break; + } + // This is safe because we removed the token that triggered this. + $this->rewind($b - 1); + return; + } + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/SafeObject.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/SafeObject.php new file mode 100644 index 0000000..b879078 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Injector/SafeObject.php @@ -0,0 +1,86 @@ + 'never', + 'allowNetworking' => 'internal', + ); + protected $allowedParam = array( + 'wmode' => true, + 'movie' => true, + ); + + public function prepare($config, $context) { + parent::prepare($config, $context); + } + + public function handleElement(&$token) { + if ($token->name == 'object') { + $this->objectStack[] = $token; + $this->paramStack[] = array(); + $new = array($token); + foreach ($this->addParam as $name => $value) { + $new[] = new HTMLPurifier_Token_Empty('param', array('name' => $name, 'value' => $value)); + } + $token = $new; + } elseif ($token->name == 'param') { + $nest = count($this->currentNesting) - 1; + if ($nest >= 0 && $this->currentNesting[$nest]->name === 'object') { + $i = count($this->objectStack) - 1; + if (!isset($token->attr['name'])) { + $token = false; + return; + } + $n = $token->attr['name']; + // We need this fix because YouTube doesn't supply a data + // attribute, which we need if a type is specified. This is + // *very* Flash specific. + if (!isset($this->objectStack[$i]->attr['data']) && $token->attr['name'] == 'movie') { + $this->objectStack[$i]->attr['data'] = $token->attr['value']; + } + // Check if the parameter is the correct value but has not + // already been added + if ( + !isset($this->paramStack[$i][$n]) && + isset($this->addParam[$n]) && + $token->attr['name'] === $this->addParam[$n] + ) { + // keep token, and add to param stack + $this->paramStack[$i][$n] = true; + } elseif (isset($this->allowedParam[$n])) { + // keep token, don't do anything to it + // (could possibly check for duplicates here) + } else { + $token = false; + } + } else { + // not directly inside an object, DENY! + $token = false; + } + } + } + + public function handleEnd(&$token) { + // This is the WRONG way of handling the object and param stacks; + // we should be inserting them directly on the relevant object tokens + // so that the global stack handling handles it. + if ($token->name == 'object') { + array_pop($this->objectStack); + array_pop($this->paramStack); + } + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language.php new file mode 100644 index 0000000..68ebbd7 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language.php @@ -0,0 +1,162 @@ +config = $config; + $this->context = $context; + } + + /** + * Loads language object with necessary info from factory cache + * @note This is a lazy loader + */ + public function load() { + if ($this->_loaded) return; + $factory = HTMLPurifier_LanguageFactory::instance(); + $factory->loadLanguage($this->code); + foreach ($factory->keys as $key) { + $this->$key = $factory->cache[$this->code][$key]; + } + $this->_loaded = true; + } + + /** + * Retrieves a localised message. + * @param $key string identifier of message + * @return string localised message + */ + public function getMessage($key) { + if (!$this->_loaded) $this->load(); + if (!isset($this->messages[$key])) return "[$key]"; + return $this->messages[$key]; + } + + /** + * Retrieves a localised error name. + * @param $int integer error number, corresponding to PHP's error + * reporting + * @return string localised message + */ + public function getErrorName($int) { + if (!$this->_loaded) $this->load(); + if (!isset($this->errorNames[$int])) return "[Error: $int]"; + return $this->errorNames[$int]; + } + + /** + * Converts an array list into a string readable representation + */ + public function listify($array) { + $sep = $this->getMessage('Item separator'); + $sep_last = $this->getMessage('Item separator last'); + $ret = ''; + for ($i = 0, $c = count($array); $i < $c; $i++) { + if ($i == 0) { + } elseif ($i + 1 < $c) { + $ret .= $sep; + } else { + $ret .= $sep_last; + } + $ret .= $array[$i]; + } + return $ret; + } + + /** + * Formats a localised message with passed parameters + * @param $key string identifier of message + * @param $args Parameters to substitute in + * @return string localised message + * @todo Implement conditionals? Right now, some messages make + * reference to line numbers, but those aren't always available + */ + public function formatMessage($key, $args = array()) { + if (!$this->_loaded) $this->load(); + if (!isset($this->messages[$key])) return "[$key]"; + $raw = $this->messages[$key]; + $subst = array(); + $generator = false; + foreach ($args as $i => $value) { + if (is_object($value)) { + if ($value instanceof HTMLPurifier_Token) { + // factor this out some time + if (!$generator) $generator = $this->context->get('Generator'); + if (isset($value->name)) $subst['$'.$i.'.Name'] = $value->name; + if (isset($value->data)) $subst['$'.$i.'.Data'] = $value->data; + $subst['$'.$i.'.Compact'] = + $subst['$'.$i.'.Serialized'] = $generator->generateFromToken($value); + // a more complex algorithm for compact representation + // could be introduced for all types of tokens. This + // may need to be factored out into a dedicated class + if (!empty($value->attr)) { + $stripped_token = clone $value; + $stripped_token->attr = array(); + $subst['$'.$i.'.Compact'] = $generator->generateFromToken($stripped_token); + } + $subst['$'.$i.'.Line'] = $value->line ? $value->line : 'unknown'; + } + continue; + } elseif (is_array($value)) { + $keys = array_keys($value); + if (array_keys($keys) === $keys) { + // list + $subst['$'.$i] = $this->listify($value); + } else { + // associative array + // no $i implementation yet, sorry + $subst['$'.$i.'.Keys'] = $this->listify($keys); + $subst['$'.$i.'.Values'] = $this->listify(array_values($value)); + } + continue; + } + $subst['$' . $i] = $value; + } + return strtr($raw, $subst); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/classes/en-x-test.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/classes/en-x-test.php new file mode 100644 index 0000000..bfa2e63 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/classes/en-x-test.php @@ -0,0 +1,11 @@ + 'HTML Purifier X' +); + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en-x-testmini.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en-x-testmini.php new file mode 100644 index 0000000..be9bbd8 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en-x-testmini.php @@ -0,0 +1,11 @@ + 'HTML Purifier XNone' +); + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en.php new file mode 100644 index 0000000..04028b0 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Language/messages/en.php @@ -0,0 +1,60 @@ + 'HTML Purifier', + +// for unit testing purposes +'LanguageFactoryTest: Pizza' => 'Pizza', +'LanguageTest: List' => '$1', +'LanguageTest: Hash' => '$1.Keys; $1.Values', + +'Item separator' => ', ', +'Item separator last' => ' and ', // non-Harvard style + +'ErrorCollector: No errors' => 'No errors detected. However, because error reporting is still incomplete, there may have been errors that the error collector was not notified of; please inspect the output HTML carefully.', +'ErrorCollector: At line' => ' at line $line', +'ErrorCollector: Incidental errors' => 'Incidental errors', + +'Lexer: Unclosed comment' => 'Unclosed comment', +'Lexer: Unescaped lt' => 'Unescaped less-than sign (<) should be <', +'Lexer: Missing gt' => 'Missing greater-than sign (>), previous less-than sign (<) should be escaped', +'Lexer: Missing attribute key' => 'Attribute declaration has no key', +'Lexer: Missing end quote' => 'Attribute declaration has no end quote', + +'Strategy_RemoveForeignElements: Tag transform' => '<$1> element transformed into $CurrentToken.Serialized', +'Strategy_RemoveForeignElements: Missing required attribute' => '$CurrentToken.Compact element missing required attribute $1', +'Strategy_RemoveForeignElements: Foreign element to text' => 'Unrecognized $CurrentToken.Serialized tag converted to text', +'Strategy_RemoveForeignElements: Foreign element removed' => 'Unrecognized $CurrentToken.Serialized tag removed', +'Strategy_RemoveForeignElements: Comment removed' => 'Comment containing "$CurrentToken.Data" removed', +'Strategy_RemoveForeignElements: Foreign meta element removed' => 'Unrecognized $CurrentToken.Serialized meta tag and all descendants removed', +'Strategy_RemoveForeignElements: Token removed to end' => 'Tags and text starting from $1 element where removed to end', +'Strategy_RemoveForeignElements: Trailing hyphen in comment removed' => 'Trailing hyphen(s) in comment removed', +'Strategy_RemoveForeignElements: Hyphens in comment collapsed' => 'Double hyphens in comments are not allowed, and were collapsed into single hyphens', + +'Strategy_MakeWellFormed: Unnecessary end tag removed' => 'Unnecessary $CurrentToken.Serialized tag removed', +'Strategy_MakeWellFormed: Unnecessary end tag to text' => 'Unnecessary $CurrentToken.Serialized tag converted to text', +'Strategy_MakeWellFormed: Tag auto closed' => '$1.Compact started on line $1.Line auto-closed by $CurrentToken.Compact', +'Strategy_MakeWellFormed: Stray end tag removed' => 'Stray $CurrentToken.Serialized tag removed', +'Strategy_MakeWellFormed: Stray end tag to text' => 'Stray $CurrentToken.Serialized tag converted to text', +'Strategy_MakeWellFormed: Tag closed by element end' => '$1.Compact tag started on line $1.Line closed by end of $CurrentToken.Serialized', +'Strategy_MakeWellFormed: Tag closed by document end' => '$1.Compact tag started on line $1.Line closed by end of document', + +'Strategy_FixNesting: Node removed' => '$CurrentToken.Compact node removed', +'Strategy_FixNesting: Node excluded' => '$CurrentToken.Compact node removed due to descendant exclusion by ancestor element', +'Strategy_FixNesting: Node reorganized' => 'Contents of $CurrentToken.Compact node reorganized to enforce its content model', +'Strategy_FixNesting: Node contents removed' => 'Contents of $CurrentToken.Compact node removed', + +'AttrValidator: Attributes transformed' => 'Attributes on $CurrentToken.Compact transformed from $1.Keys to $2.Keys', +'AttrValidator: Attribute removed' => '$CurrentAttr.Name attribute on $CurrentToken.Compact removed', + +); + +$errorNames = array( + E_ERROR => 'Error', + E_WARNING => 'Warning', + E_NOTICE => 'Notice' +); + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/LanguageFactory.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/LanguageFactory.php new file mode 100644 index 0000000..9525526 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/LanguageFactory.php @@ -0,0 +1,197 @@ +cache[$language_code][$key] = $value + * @value array map + */ + public $cache; + + /** + * Valid keys in the HTMLPurifier_Language object. Designates which + * variables to slurp out of a message file. + * @value array list + */ + public $keys = array('fallback', 'messages', 'errorNames'); + + /** + * Instance of HTMLPurifier_AttrDef_Lang to validate language codes + * @value object HTMLPurifier_AttrDef_Lang + */ + protected $validator; + + /** + * Cached copy of dirname(__FILE__), directory of current file without + * trailing slash + * @value string filename + */ + protected $dir; + + /** + * Keys whose contents are a hash map and can be merged + * @value array lookup + */ + protected $mergeable_keys_map = array('messages' => true, 'errorNames' => true); + + /** + * Keys whose contents are a list and can be merged + * @value array lookup + */ + protected $mergeable_keys_list = array(); + + /** + * Retrieve sole instance of the factory. + * @param $prototype Optional prototype to overload sole instance with, + * or bool true to reset to default factory. + */ + public static function instance($prototype = null) { + static $instance = null; + if ($prototype !== null) { + $instance = $prototype; + } elseif ($instance === null || $prototype == true) { + $instance = new HTMLPurifier_LanguageFactory(); + $instance->setup(); + } + return $instance; + } + + /** + * Sets up the singleton, much like a constructor + * @note Prevents people from getting this outside of the singleton + */ + public function setup() { + $this->validator = new HTMLPurifier_AttrDef_Lang(); + $this->dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier'; + } + + /** + * Creates a language object, handles class fallbacks + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + * @param $code Code to override configuration with. Private parameter. + */ + public function create($config, $context, $code = false) { + + // validate language code + if ($code === false) { + $code = $this->validator->validate( + $config->get('Core', 'Language'), $config, $context + ); + } else { + $code = $this->validator->validate($code, $config, $context); + } + if ($code === false) $code = 'en'; // malformed code becomes English + + $pcode = str_replace('-', '_', $code); // make valid PHP classname + static $depth = 0; // recursion protection + + if ($code == 'en') { + $lang = new HTMLPurifier_Language($config, $context); + } else { + $class = 'HTMLPurifier_Language_' . $pcode; + $file = $this->dir . '/Language/classes/' . $code . '.php'; + if (file_exists($file) || class_exists($class, false)) { + $lang = new $class($config, $context); + } else { + // Go fallback + $raw_fallback = $this->getFallbackFor($code); + $fallback = $raw_fallback ? $raw_fallback : 'en'; + $depth++; + $lang = $this->create($config, $context, $fallback); + if (!$raw_fallback) { + $lang->error = true; + } + $depth--; + } + } + + $lang->code = $code; + + return $lang; + + } + + /** + * Returns the fallback language for language + * @note Loads the original language into cache + * @param $code string language code + */ + public function getFallbackFor($code) { + $this->loadLanguage($code); + return $this->cache[$code]['fallback']; + } + + /** + * Loads language into the cache, handles message file and fallbacks + * @param $code string language code + */ + public function loadLanguage($code) { + static $languages_seen = array(); // recursion guard + + // abort if we've already loaded it + if (isset($this->cache[$code])) return; + + // generate filename + $filename = $this->dir . '/Language/messages/' . $code . '.php'; + + // default fallback : may be overwritten by the ensuing include + $fallback = ($code != 'en') ? 'en' : false; + + // load primary localisation + if (!file_exists($filename)) { + // skip the include: will rely solely on fallback + $filename = $this->dir . '/Language/messages/en.php'; + $cache = array(); + } else { + include $filename; + $cache = compact($this->keys); + } + + // load fallback localisation + if (!empty($fallback)) { + + // infinite recursion guard + if (isset($languages_seen[$code])) { + trigger_error('Circular fallback reference in language ' . + $code, E_USER_ERROR); + $fallback = 'en'; + } + $language_seen[$code] = true; + + // load the fallback recursively + $this->loadLanguage($fallback); + $fallback_cache = $this->cache[$fallback]; + + // merge fallback with current language + foreach ( $this->keys as $key ) { + if (isset($cache[$key]) && isset($fallback_cache[$key])) { + if (isset($this->mergeable_keys_map[$key])) { + $cache[$key] = $cache[$key] + $fallback_cache[$key]; + } elseif (isset($this->mergeable_keys_list[$key])) { + $cache[$key] = array_merge( $fallback_cache[$key], $cache[$key] ); + } + } else { + $cache[$key] = $fallback_cache[$key]; + } + } + + } + + // save to cache for later retrieval + $this->cache[$code] = $cache; + + return; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Length.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Length.php new file mode 100644 index 0000000..085dfe9 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Length.php @@ -0,0 +1,113 @@ + true, 'ex' => true, 'px' => true, 'in' => true, + 'cm' => true, 'mm' => true, 'pt' => true, 'pc' => true + ); + + /** + * @param number $n Magnitude + * @param string $u Unit + */ + public function __construct($n = '0', $u = false) { + $this->n = (string) $n; + $this->unit = $u !== false ? (string) $u : false; + } + + /** + * @param string $s Unit string, like '2em' or '3.4in' + * @warning Does not perform validation. + */ + static public function make($s) { + if ($s instanceof HTMLPurifier_Length) return $s; + $n_length = strspn($s, '1234567890.+-'); + $n = substr($s, 0, $n_length); + $unit = substr($s, $n_length); + if ($unit === '') $unit = false; + return new HTMLPurifier_Length($n, $unit); + } + + /** + * Validates the number and unit. + */ + protected function validate() { + // Special case: + if ($this->n === '+0' || $this->n === '-0') $this->n = '0'; + if ($this->n === '0' && $this->unit === false) return true; + if (!ctype_lower($this->unit)) $this->unit = strtolower($this->unit); + if (!isset(HTMLPurifier_Length::$allowedUnits[$this->unit])) return false; + // Hack: + $def = new HTMLPurifier_AttrDef_CSS_Number(); + $result = $def->validate($this->n, false, false); + if ($result === false) return false; + $this->n = $result; + return true; + } + + /** + * Returns string representation of number. + */ + public function toString() { + if (!$this->isValid()) return false; + return $this->n . $this->unit; + } + + /** + * Retrieves string numeric magnitude. + */ + public function getN() {return $this->n;} + + /** + * Retrieves string unit. + */ + public function getUnit() {return $this->unit;} + + /** + * Returns true if this length unit is valid. + */ + public function isValid() { + if ($this->isValid === null) $this->isValid = $this->validate(); + return $this->isValid; + } + + /** + * Compares two lengths, and returns 1 if greater, -1 if less and 0 if equal. + * @warning If both values are too large or small, this calculation will + * not work properly + */ + public function compareTo($l) { + if ($l === false) return false; + if ($l->unit !== $this->unit) { + $converter = new HTMLPurifier_UnitConverter(); + $l = $converter->convert($l, $this->unit); + if ($l === false) return false; + } + return $this->n - $l->n; + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer.php new file mode 100644 index 0000000..abd919c --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer.php @@ -0,0 +1,297 @@ +get('Core', 'LexerImpl'); + } + + $needs_tracking = + $config->get('Core', 'MaintainLineNumbers') || + $config->get('Core', 'CollectErrors'); + + $inst = null; + if (is_object($lexer)) { + $inst = $lexer; + } else { + + if (is_null($lexer)) { do { + // auto-detection algorithm + + if ($needs_tracking) { + $lexer = 'DirectLex'; + break; + } + + if ( + class_exists('DOMDocument') && + method_exists('DOMDocument', 'loadHTML') && + !extension_loaded('domxml') + ) { + // check for DOM support, because while it's part of the + // core, it can be disabled compile time. Also, the PECL + // domxml extension overrides the default DOM, and is evil + // and nasty and we shan't bother to support it + $lexer = 'DOMLex'; + } else { + $lexer = 'DirectLex'; + } + + } while(0); } // do..while so we can break + + // instantiate recognized string names + switch ($lexer) { + case 'DOMLex': + $inst = new HTMLPurifier_Lexer_DOMLex(); + break; + case 'DirectLex': + $inst = new HTMLPurifier_Lexer_DirectLex(); + break; + case 'PH5P': + $inst = new HTMLPurifier_Lexer_PH5P(); + break; + default: + throw new HTMLPurifier_Exception("Cannot instantiate unrecognized Lexer type " . htmlspecialchars($lexer)); + } + } + + if (!$inst) throw new HTMLPurifier_Exception('No lexer was instantiated'); + + // once PHP DOM implements native line numbers, or we + // hack out something using XSLT, remove this stipulation + if ($needs_tracking && !$inst->tracksLineNumbers) { + throw new HTMLPurifier_Exception('Cannot use lexer that does not support line numbers with Core.MaintainLineNumbers or Core.CollectErrors (use DirectLex instead)'); + } + + return $inst; + + } + + // -- CONVENIENCE MEMBERS --------------------------------------------- + + public function __construct() { + $this->_entity_parser = new HTMLPurifier_EntityParser(); + } + + /** + * Most common entity to raw value conversion table for special entities. + */ + protected $_special_entity2str = + array( + '"' => '"', + '&' => '&', + '<' => '<', + '>' => '>', + ''' => "'", + ''' => "'", + ''' => "'" + ); + + /** + * Parses special entities into the proper characters. + * + * This string will translate escaped versions of the special characters + * into the correct ones. + * + * @warning + * You should be able to treat the output of this function as + * completely parsed, but that's only because all other entities should + * have been handled previously in substituteNonSpecialEntities() + * + * @param $string String character data to be parsed. + * @returns Parsed character data. + */ + public function parseData($string) { + + // following functions require at least one character + if ($string === '') return ''; + + // subtracts amps that cannot possibly be escaped + $num_amp = substr_count($string, '&') - substr_count($string, '& ') - + ($string[strlen($string)-1] === '&' ? 1 : 0); + + if (!$num_amp) return $string; // abort if no entities + $num_esc_amp = substr_count($string, '&'); + $string = strtr($string, $this->_special_entity2str); + + // code duplication for sake of optimization, see above + $num_amp_2 = substr_count($string, '&') - substr_count($string, '& ') - + ($string[strlen($string)-1] === '&' ? 1 : 0); + + if ($num_amp_2 <= $num_esc_amp) return $string; + + // hmm... now we have some uncommon entities. Use the callback. + $string = $this->_entity_parser->substituteSpecialEntities($string); + return $string; + } + + /** + * Lexes an HTML string into tokens. + * + * @param $string String HTML. + * @return HTMLPurifier_Token array representation of HTML. + */ + public function tokenizeHTML($string, $config, $context) { + trigger_error('Call to abstract class', E_USER_ERROR); + } + + /** + * Translates CDATA sections into regular sections (through escaping). + * + * @param $string HTML string to process. + * @returns HTML with CDATA sections escaped. + */ + protected static function escapeCDATA($string) { + return preg_replace_callback( + '//s', + array('HTMLPurifier_Lexer', 'CDATACallback'), + $string + ); + } + + /** + * Special CDATA case that is especially convoluted for )#si', + array($this, 'scriptCallback'), $html); + } + + $html = $this->normalize($html, $config, $context); + + $cursor = 0; // our location in the text + $inside_tag = false; // whether or not we're parsing the inside of a tag + $array = array(); // result array + + // This is also treated to mean maintain *column* numbers too + $maintain_line_numbers = $config->get('Core', 'MaintainLineNumbers'); + + if ($maintain_line_numbers === null) { + // automatically determine line numbering by checking + // if error collection is on + $maintain_line_numbers = $config->get('Core', 'CollectErrors'); + } + + if ($maintain_line_numbers) { + $current_line = 1; + $current_col = 0; + $length = strlen($html); + } else { + $current_line = false; + $current_col = false; + $length = false; + } + $context->register('CurrentLine', $current_line); + $context->register('CurrentCol', $current_col); + $nl = "\n"; + // how often to manually recalculate. This will ALWAYS be right, + // but it's pretty wasteful. Set to 0 to turn off + $synchronize_interval = $config->get('Core', 'DirectLexLineNumberSyncInterval'); + + $e = false; + if ($config->get('Core', 'CollectErrors')) { + $e =& $context->get('ErrorCollector'); + } + + // for testing synchronization + $loops = 0; + + while(++$loops) { + + // $cursor is either at the start of a token, or inside of + // a tag (i.e. there was a < immediately before it), as indicated + // by $inside_tag + + if ($maintain_line_numbers) { + + // $rcursor, however, is always at the start of a token. + $rcursor = $cursor - (int) $inside_tag; + + // Column number is cheap, so we calculate it every round. + // We're interested at the *end* of the newline string, so + // we need to add strlen($nl) == 1 to $nl_pos before subtracting it + // from our "rcursor" position. + $nl_pos = strrpos($html, $nl, $rcursor - $length); + $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1); + + // recalculate lines + if ( + $synchronize_interval && // synchronization is on + $cursor > 0 && // cursor is further than zero + $loops % $synchronize_interval === 0 // time to synchronize! + ) { + $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor); + } + + } + + $position_next_lt = strpos($html, '<', $cursor); + $position_next_gt = strpos($html, '>', $cursor); + + // triggers on "asdf" but not "asdf " + // special case to set up context + if ($position_next_lt === $cursor) { + $inside_tag = true; + $cursor++; + } + + if (!$inside_tag && $position_next_lt !== false) { + // We are not inside tag and there still is another tag to parse + $token = new + HTMLPurifier_Token_Text( + $this->parseData( + substr( + $html, $cursor, $position_next_lt - $cursor + ) + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor); + } + $array[] = $token; + $cursor = $position_next_lt + 1; + $inside_tag = true; + continue; + } elseif (!$inside_tag) { + // We are not inside tag but there are no more tags + // If we're already at the end, break + if ($cursor === strlen($html)) break; + // Create Text of rest of string + $token = new + HTMLPurifier_Token_Text( + $this->parseData( + substr( + $html, $cursor + ) + ) + ); + if ($maintain_line_numbers) $token->rawPosition($current_line, $current_col); + $array[] = $token; + break; + } elseif ($inside_tag && $position_next_gt !== false) { + // We are in tag and it is well formed + // Grab the internals of the tag + $strlen_segment = $position_next_gt - $cursor; + + if ($strlen_segment < 1) { + // there's nothing to process! + $token = new HTMLPurifier_Token_Text('<'); + $cursor++; + continue; + } + + $segment = substr($html, $cursor, $strlen_segment); + + if ($segment === false) { + // somehow, we attempted to access beyond the end of + // the string, defense-in-depth, reported by Nate Abele + break; + } + + // Check if it's a comment + if ( + substr($segment, 0, 3) === '!--' + ) { + // re-determine segment length, looking for --> + $position_comment_end = strpos($html, '-->', $cursor); + if ($position_comment_end === false) { + // uh oh, we have a comment that extends to + // infinity. Can't be helped: set comment + // end position to end of string + if ($e) $e->send(E_WARNING, 'Lexer: Unclosed comment'); + $position_comment_end = strlen($html); + $end = true; + } else { + $end = false; + } + $strlen_segment = $position_comment_end - $cursor; + $segment = substr($html, $cursor, $strlen_segment); + $token = new + HTMLPurifier_Token_Comment( + substr( + $segment, 3, $strlen_segment - 3 + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment); + } + $array[] = $token; + $cursor = $end ? $position_comment_end : $position_comment_end + 3; + $inside_tag = false; + continue; + } + + // Check if it's an end tag + $is_end_tag = (strpos($segment,'/') === 0); + if ($is_end_tag) { + $type = substr($segment, 1); + $token = new HTMLPurifier_Token_End($type); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + $cursor = $position_next_gt + 1; + continue; + } + + // Check leading character is alnum, if not, we may + // have accidently grabbed an emoticon. Translate into + // text and go our merry way + if (!ctype_alpha($segment[0])) { + // XML: $segment[0] !== '_' && $segment[0] !== ':' + if ($e) $e->send(E_NOTICE, 'Lexer: Unescaped lt'); + $token = new HTMLPurifier_Token_Text('<'); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + continue; + } + + // Check if it is explicitly self closing, if so, remove + // trailing slash. Remember, we could have a tag like
      , so + // any later token processing scripts must convert improperly + // classified EmptyTags from StartTags. + $is_self_closing = (strrpos($segment,'/') === $strlen_segment-1); + if ($is_self_closing) { + $strlen_segment--; + $segment = substr($segment, 0, $strlen_segment); + } + + // Check if there are any attributes + $position_first_space = strcspn($segment, $this->_whitespace); + + if ($position_first_space >= $strlen_segment) { + if ($is_self_closing) { + $token = new HTMLPurifier_Token_Empty($segment); + } else { + $token = new HTMLPurifier_Token_Start($segment); + } + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + $cursor = $position_next_gt + 1; + continue; + } + + // Grab out all the data + $type = substr($segment, 0, $position_first_space); + $attribute_string = + trim( + substr( + $segment, $position_first_space + ) + ); + if ($attribute_string) { + $attr = $this->parseAttributeString( + $attribute_string + , $config, $context + ); + } else { + $attr = array(); + } + + if ($is_self_closing) { + $token = new HTMLPurifier_Token_Empty($type, $attr); + } else { + $token = new HTMLPurifier_Token_Start($type, $attr); + } + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $cursor = $position_next_gt + 1; + $inside_tag = false; + continue; + } else { + // inside tag, but there's no ending > sign + if ($e) $e->send(E_WARNING, 'Lexer: Missing gt'); + $token = new + HTMLPurifier_Token_Text( + '<' . + $this->parseData( + substr($html, $cursor) + ) + ); + if ($maintain_line_numbers) $token->rawPosition($current_line, $current_col); + // no cursor scroll? Hmm... + $array[] = $token; + break; + } + break; + } + + $context->destroy('CurrentLine'); + $context->destroy('CurrentCol'); + return $array; + } + + /** + * PHP 5.0.x compatible substr_count that implements offset and length + */ + protected function substrCount($haystack, $needle, $offset, $length) { + static $oldVersion; + if ($oldVersion === null) { + $oldVersion = version_compare(PHP_VERSION, '5.1', '<'); + } + if ($oldVersion) { + $haystack = substr($haystack, $offset, $length); + return substr_count($haystack, $needle); + } else { + return substr_count($haystack, $needle, $offset, $length); + } + } + + /** + * Takes the inside of an HTML tag and makes an assoc array of attributes. + * + * @param $string Inside of tag excluding name. + * @returns Assoc array of attributes. + */ + public function parseAttributeString($string, $config, $context) { + $string = (string) $string; // quick typecast + + if ($string == '') return array(); // no attributes + + $e = false; + if ($config->get('Core', 'CollectErrors')) { + $e =& $context->get('ErrorCollector'); + } + + // let's see if we can abort as quickly as possible + // one equal sign, no spaces => one attribute + $num_equal = substr_count($string, '='); + $has_space = strpos($string, ' '); + if ($num_equal === 0 && !$has_space) { + // bool attribute + return array($string => $string); + } elseif ($num_equal === 1 && !$has_space) { + // only one attribute + list($key, $quoted_value) = explode('=', $string); + $quoted_value = trim($quoted_value); + if (!$key) { + if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); + return array(); + } + if (!$quoted_value) return array($key => ''); + $first_char = @$quoted_value[0]; + $last_char = @$quoted_value[strlen($quoted_value)-1]; + + $same_quote = ($first_char == $last_char); + $open_quote = ($first_char == '"' || $first_char == "'"); + + if ( $same_quote && $open_quote) { + // well behaved + $value = substr($quoted_value, 1, strlen($quoted_value) - 2); + } else { + // not well behaved + if ($open_quote) { + if ($e) $e->send(E_ERROR, 'Lexer: Missing end quote'); + $value = substr($quoted_value, 1); + } else { + $value = $quoted_value; + } + } + if ($value === false) $value = ''; + return array($key => $value); + } + + // setup loop environment + $array = array(); // return assoc array of attributes + $cursor = 0; // current position in string (moves forward) + $size = strlen($string); // size of the string (stays the same) + + // if we have unquoted attributes, the parser expects a terminating + // space, so let's guarantee that there's always a terminating space. + $string .= ' '; + + while(true) { + + if ($cursor >= $size) { + break; + } + + $cursor += ($value = strspn($string, $this->_whitespace, $cursor)); + // grab the key + + $key_begin = $cursor; //we're currently at the start of the key + + // scroll past all characters that are the key (not whitespace or =) + $cursor += strcspn($string, $this->_whitespace . '=', $cursor); + + $key_end = $cursor; // now at the end of the key + + $key = substr($string, $key_begin, $key_end - $key_begin); + + if (!$key) { + if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); + $cursor += strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop + continue; // empty key + } + + // scroll past all whitespace + $cursor += strspn($string, $this->_whitespace, $cursor); + + if ($cursor >= $size) { + $array[$key] = $key; + break; + } + + // if the next character is an equal sign, we've got a regular + // pair, otherwise, it's a bool attribute + $first_char = @$string[$cursor]; + + if ($first_char == '=') { + // key="value" + + $cursor++; + $cursor += strspn($string, $this->_whitespace, $cursor); + + if ($cursor === false) { + $array[$key] = ''; + break; + } + + // we might be in front of a quote right now + + $char = @$string[$cursor]; + + if ($char == '"' || $char == "'") { + // it's quoted, end bound is $char + $cursor++; + $value_begin = $cursor; + $cursor = strpos($string, $char, $cursor); + $value_end = $cursor; + } else { + // it's not quoted, end bound is whitespace + $value_begin = $cursor; + $cursor += strcspn($string, $this->_whitespace, $cursor); + $value_end = $cursor; + } + + // we reached a premature end + if ($cursor === false) { + $cursor = $size; + $value_end = $cursor; + } + + $value = substr($string, $value_begin, $value_end - $value_begin); + if ($value === false) $value = ''; + $array[$key] = $this->parseData($value); + $cursor++; + + } else { + // boolattr + if ($key !== '') { + $array[$key] = $key; + } else { + // purely theoretical + if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); + } + + } + } + return $array; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/PEARSax3.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/PEARSax3.php new file mode 100644 index 0000000..1f941a2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/PEARSax3.php @@ -0,0 +1,105 @@ +tokens = array(); + + $string = $this->normalize($string, $config, $context); + + $parser = new XML_HTMLSax3(); + $parser->set_object($this); + $parser->set_element_handler('openHandler','closeHandler'); + $parser->set_data_handler('dataHandler'); + $parser->set_escape_handler('escapeHandler'); + + // doesn't seem to work correctly for attributes + $parser->set_option('XML_OPTION_ENTITIES_PARSED', 1); + + $parser->parse($string); + + return $this->tokens; + + } + + /** + * Open tag event handler, interface is defined by PEAR package. + */ + public function openHandler(&$parser, $name, $attrs, $closed) { + // entities are not resolved in attrs + foreach ($attrs as $key => $attr) { + $attrs[$key] = $this->parseData($attr); + } + if ($closed) { + $this->tokens[] = new HTMLPurifier_Token_Empty($name, $attrs); + } else { + $this->tokens[] = new HTMLPurifier_Token_Start($name, $attrs); + } + return true; + } + + /** + * Close tag event handler, interface is defined by PEAR package. + */ + public function closeHandler(&$parser, $name) { + // HTMLSax3 seems to always send empty tags an extra close tag + // check and ignore if you see it: + // [TESTME] to make sure it doesn't overreach + if ($this->tokens[count($this->tokens)-1] instanceof HTMLPurifier_Token_Empty) { + return true; + } + $this->tokens[] = new HTMLPurifier_Token_End($name); + return true; + } + + /** + * Data event handler, interface is defined by PEAR package. + */ + public function dataHandler(&$parser, $data) { + $this->tokens[] = new HTMLPurifier_Token_Text($data); + return true; + } + + /** + * Escaped text handler, interface is defined by PEAR package. + */ + public function escapeHandler(&$parser, $data) { + if (strpos($data, '--') === 0) { + $this->tokens[] = new HTMLPurifier_Token_Comment($data); + } + // CDATA is handled elsewhere, but if it was handled here: + //if (strpos($data, '[CDATA[') === 0) { + // $this->tokens[] = new HTMLPurifier_Token_Text( + // substr($data, 7, strlen($data) - 9) ); + //} + return true; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/PH5P.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/PH5P.php new file mode 100644 index 0000000..81659e5 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Lexer/PH5P.php @@ -0,0 +1,3906 @@ +normalize($html, $config, $context); + $new_html = $this->wrapHTML($new_html, $config, $context); + try { + $parser = new HTML5($new_html); + $doc = $parser->save(); + } catch (DOMException $e) { + // Uh oh, it failed. Punt to DirectLex. + $lexer = new HTMLPurifier_Lexer_DirectLex(); + $context->register('PH5PError', $e); // save the error, so we can detect it + return $lexer->tokenizeHTML($html, $config, $context); // use original HTML + } + $tokens = array(); + $this->tokenizeDOM( + $doc->getElementsByTagName('html')->item(0)-> // + getElementsByTagName('body')->item(0)-> // + getElementsByTagName('div')->item(0) //
      + , $tokens); + return $tokens; + } + +} + +/* + +Copyright 2007 Jeroen van der Meer + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +class HTML5 { + private $data; + private $char; + private $EOF; + private $state; + private $tree; + private $token; + private $content_model; + private $escape = false; + private $entities = array('AElig;','AElig','AMP;','AMP','Aacute;','Aacute', + 'Acirc;','Acirc','Agrave;','Agrave','Alpha;','Aring;','Aring','Atilde;', + 'Atilde','Auml;','Auml','Beta;','COPY;','COPY','Ccedil;','Ccedil','Chi;', + 'Dagger;','Delta;','ETH;','ETH','Eacute;','Eacute','Ecirc;','Ecirc','Egrave;', + 'Egrave','Epsilon;','Eta;','Euml;','Euml','GT;','GT','Gamma;','Iacute;', + 'Iacute','Icirc;','Icirc','Igrave;','Igrave','Iota;','Iuml;','Iuml','Kappa;', + 'LT;','LT','Lambda;','Mu;','Ntilde;','Ntilde','Nu;','OElig;','Oacute;', + 'Oacute','Ocirc;','Ocirc','Ograve;','Ograve','Omega;','Omicron;','Oslash;', + 'Oslash','Otilde;','Otilde','Ouml;','Ouml','Phi;','Pi;','Prime;','Psi;', + 'QUOT;','QUOT','REG;','REG','Rho;','Scaron;','Sigma;','THORN;','THORN', + 'TRADE;','Tau;','Theta;','Uacute;','Uacute','Ucirc;','Ucirc','Ugrave;', + 'Ugrave','Upsilon;','Uuml;','Uuml','Xi;','Yacute;','Yacute','Yuml;','Zeta;', + 'aacute;','aacute','acirc;','acirc','acute;','acute','aelig;','aelig', + 'agrave;','agrave','alefsym;','alpha;','amp;','amp','and;','ang;','apos;', + 'aring;','aring','asymp;','atilde;','atilde','auml;','auml','bdquo;','beta;', + 'brvbar;','brvbar','bull;','cap;','ccedil;','ccedil','cedil;','cedil', + 'cent;','cent','chi;','circ;','clubs;','cong;','copy;','copy','crarr;', + 'cup;','curren;','curren','dArr;','dagger;','darr;','deg;','deg','delta;', + 'diams;','divide;','divide','eacute;','eacute','ecirc;','ecirc','egrave;', + 'egrave','empty;','emsp;','ensp;','epsilon;','equiv;','eta;','eth;','eth', + 'euml;','euml','euro;','exist;','fnof;','forall;','frac12;','frac12', + 'frac14;','frac14','frac34;','frac34','frasl;','gamma;','ge;','gt;','gt', + 'hArr;','harr;','hearts;','hellip;','iacute;','iacute','icirc;','icirc', + 'iexcl;','iexcl','igrave;','igrave','image;','infin;','int;','iota;', + 'iquest;','iquest','isin;','iuml;','iuml','kappa;','lArr;','lambda;','lang;', + 'laquo;','laquo','larr;','lceil;','ldquo;','le;','lfloor;','lowast;','loz;', + 'lrm;','lsaquo;','lsquo;','lt;','lt','macr;','macr','mdash;','micro;','micro', + 'middot;','middot','minus;','mu;','nabla;','nbsp;','nbsp','ndash;','ne;', + 'ni;','not;','not','notin;','nsub;','ntilde;','ntilde','nu;','oacute;', + 'oacute','ocirc;','ocirc','oelig;','ograve;','ograve','oline;','omega;', + 'omicron;','oplus;','or;','ordf;','ordf','ordm;','ordm','oslash;','oslash', + 'otilde;','otilde','otimes;','ouml;','ouml','para;','para','part;','permil;', + 'perp;','phi;','pi;','piv;','plusmn;','plusmn','pound;','pound','prime;', + 'prod;','prop;','psi;','quot;','quot','rArr;','radic;','rang;','raquo;', + 'raquo','rarr;','rceil;','rdquo;','real;','reg;','reg','rfloor;','rho;', + 'rlm;','rsaquo;','rsquo;','sbquo;','scaron;','sdot;','sect;','sect','shy;', + 'shy','sigma;','sigmaf;','sim;','spades;','sub;','sube;','sum;','sup1;', + 'sup1','sup2;','sup2','sup3;','sup3','sup;','supe;','szlig;','szlig','tau;', + 'there4;','theta;','thetasym;','thinsp;','thorn;','thorn','tilde;','times;', + 'times','trade;','uArr;','uacute;','uacute','uarr;','ucirc;','ucirc', + 'ugrave;','ugrave','uml;','uml','upsih;','upsilon;','uuml;','uuml','weierp;', + 'xi;','yacute;','yacute','yen;','yen','yuml;','yuml','zeta;','zwj;','zwnj;'); + + const PCDATA = 0; + const RCDATA = 1; + const CDATA = 2; + const PLAINTEXT = 3; + + const DOCTYPE = 0; + const STARTTAG = 1; + const ENDTAG = 2; + const COMMENT = 3; + const CHARACTR = 4; + const EOF = 5; + + public function __construct($data) { + $data = str_replace("\r\n", "\n", $data); + $data = str_replace("\r", null, $data); + + $this->data = $data; + $this->char = -1; + $this->EOF = strlen($data); + $this->tree = new HTML5TreeConstructer; + $this->content_model = self::PCDATA; + + $this->state = 'data'; + + while($this->state !== null) { + $this->{$this->state.'State'}(); + } + } + + public function save() { + return $this->tree->save(); + } + + private function char() { + return ($this->char < $this->EOF) + ? $this->data[$this->char] + : false; + } + + private function character($s, $l = 0) { + if($s + $l < $this->EOF) { + if($l === 0) { + return $this->data[$s]; + } else { + return substr($this->data, $s, $l); + } + } + } + + private function characters($char_class, $start) { + return preg_replace('#^(['.$char_class.']+).*#s', '\\1', substr($this->data, $start)); + } + + private function dataState() { + // Consume the next input character + $this->char++; + $char = $this->char(); + + if($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) { + /* U+0026 AMPERSAND (&) + When the content model flag is set to one of the PCDATA or RCDATA + states: switch to the entity data state. Otherwise: treat it as per + the "anything else" entry below. */ + $this->state = 'entityData'; + + } elseif($char === '-') { + /* If the content model flag is set to either the RCDATA state or + the CDATA state, and the escape flag is false, and there are at + least three characters before this one in the input stream, and the + last four characters in the input stream, including this one, are + U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, + and U+002D HYPHEN-MINUS (""), + set the escape flag to false. */ + if(($this->content_model === self::RCDATA || + $this->content_model === self::CDATA) && $this->escape === true && + $this->character($this->char, 3) === '-->') { + $this->escape = false; + } + + /* In any case, emit the input character as a character token. + Stay in the data state. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => $char + )); + + } elseif($this->char === $this->EOF) { + /* EOF + Emit an end-of-file token. */ + $this->EOF(); + + } elseif($this->content_model === self::PLAINTEXT) { + /* When the content model flag is set to the PLAINTEXT state + THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of + the text and emit it as a character token. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => substr($this->data, $this->char) + )); + + $this->EOF(); + + } else { + /* Anything else + THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that + otherwise would also be treated as a character token and emit it + as a single character token. Stay in the data state. */ + $len = strcspn($this->data, '<&', $this->char); + $char = substr($this->data, $this->char, $len); + $this->char += $len - 1; + + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => $char + )); + + $this->state = 'data'; + } + } + + private function entityDataState() { + // Attempt to consume an entity. + $entity = $this->entity(); + + // If nothing is returned, emit a U+0026 AMPERSAND character token. + // Otherwise, emit the character token that was returned. + $char = (!$entity) ? '&' : $entity; + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => $char + )); + + // Finally, switch to the data state. + $this->state = 'data'; + } + + private function tagOpenState() { + switch($this->content_model) { + case self::RCDATA: + case self::CDATA: + /* If the next input character is a U+002F SOLIDUS (/) character, + consume it and switch to the close tag open state. If the next + input character is not a U+002F SOLIDUS (/) character, emit a + U+003C LESS-THAN SIGN character token and switch to the data + state to process the next input character. */ + if($this->character($this->char + 1) === '/') { + $this->char++; + $this->state = 'closeTagOpen'; + + } else { + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => '<' + )); + + $this->state = 'data'; + } + break; + + case self::PCDATA: + // If the content model flag is set to the PCDATA state + // Consume the next input character: + $this->char++; + $char = $this->char(); + + if($char === '!') { + /* U+0021 EXCLAMATION MARK (!) + Switch to the markup declaration open state. */ + $this->state = 'markupDeclarationOpen'; + + } elseif($char === '/') { + /* U+002F SOLIDUS (/) + Switch to the close tag open state. */ + $this->state = 'closeTagOpen'; + + } elseif(preg_match('/^[A-Za-z]$/', $char)) { + /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z + Create a new start tag token, set its tag name to the lowercase + version of the input character (add 0x0020 to the character's code + point), then switch to the tag name state. (Don't emit the token + yet; further details will be filled in before it is emitted.) */ + $this->token = array( + 'name' => strtolower($char), + 'type' => self::STARTTAG, + 'attr' => array() + ); + + $this->state = 'tagName'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Parse error. Emit a U+003C LESS-THAN SIGN character token and a + U+003E GREATER-THAN SIGN character token. Switch to the data state. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => '<>' + )); + + $this->state = 'data'; + + } elseif($char === '?') { + /* U+003F QUESTION MARK (?) + Parse error. Switch to the bogus comment state. */ + $this->state = 'bogusComment'; + + } else { + /* Anything else + Parse error. Emit a U+003C LESS-THAN SIGN character token and + reconsume the current input character in the data state. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => '<' + )); + + $this->char--; + $this->state = 'data'; + } + break; + } + } + + private function closeTagOpenState() { + $next_node = strtolower($this->characters('A-Za-z', $this->char + 1)); + $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName; + + if(($this->content_model === self::RCDATA || $this->content_model === self::CDATA) && + (!$the_same || ($the_same && (!preg_match('/[\t\n\x0b\x0c >\/]/', + $this->character($this->char + 1 + strlen($next_node))) || $this->EOF === $this->char)))) { + /* If the content model flag is set to the RCDATA or CDATA states then + examine the next few characters. If they do not match the tag name of + the last start tag token emitted (case insensitively), or if they do but + they are not immediately followed by one of the following characters: + * U+0009 CHARACTER TABULATION + * U+000A LINE FEED (LF) + * U+000B LINE TABULATION + * U+000C FORM FEED (FF) + * U+0020 SPACE + * U+003E GREATER-THAN SIGN (>) + * U+002F SOLIDUS (/) + * EOF + ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character + token, a U+002F SOLIDUS character token, and switch to the data state + to process the next input character. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => 'state = 'data'; + + } else { + /* Otherwise, if the content model flag is set to the PCDATA state, + or if the next few characters do match that tag name, consume the + next input character: */ + $this->char++; + $char = $this->char(); + + if(preg_match('/^[A-Za-z]$/', $char)) { + /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z + Create a new end tag token, set its tag name to the lowercase version + of the input character (add 0x0020 to the character's code point), then + switch to the tag name state. (Don't emit the token yet; further details + will be filled in before it is emitted.) */ + $this->token = array( + 'name' => strtolower($char), + 'type' => self::ENDTAG + ); + + $this->state = 'tagName'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Parse error. Switch to the data state. */ + $this->state = 'data'; + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F + SOLIDUS character token. Reconsume the EOF character in the data state. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => 'char--; + $this->state = 'data'; + + } else { + /* Parse error. Switch to the bogus comment state. */ + $this->state = 'bogusComment'; + } + } + } + + private function tagNameState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } elseif($char === '/') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } else { + /* Anything else + Append the current input character to the current tag token's tag name. + Stay in the tag name state. */ + $this->token['name'] .= strtolower($char); + $this->state = 'tagName'; + } + } + + private function beforeAttributeNameState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($char === '/') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Stay in the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Start a new attribute in the current tag token. Set that attribute's + name to the current input character, and its value to the empty string. + Switch to the attribute name state. */ + $this->token['attr'][] = array( + 'name' => strtolower($char), + 'value' => null + ); + + $this->state = 'attributeName'; + } + } + + private function attributeNameState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute name state. */ + $this->state = 'afterAttributeName'; + + } elseif($char === '=') { + /* U+003D EQUALS SIGN (=) + Switch to the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($char === '/' && $this->character($this->char + 1) !== '>') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's name. + Stay in the attribute name state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['name'] .= strtolower($char); + + $this->state = 'attributeName'; + } + } + + private function afterAttributeNameState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the after attribute name state. */ + $this->state = 'afterAttributeName'; + + } elseif($char === '=') { + /* U+003D EQUALS SIGN (=) + Switch to the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($char === '/' && $this->character($this->char + 1) !== '>') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the + before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Start a new attribute in the current tag token. Set that attribute's + name to the current input character, and its value to the empty string. + Switch to the attribute name state. */ + $this->token['attr'][] = array( + 'name' => strtolower($char), + 'value' => null + ); + + $this->state = 'attributeName'; + } + } + + private function beforeAttributeValueState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif($char === '"') { + /* U+0022 QUOTATION MARK (") + Switch to the attribute value (double-quoted) state. */ + $this->state = 'attributeValueDoubleQuoted'; + + } elseif($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the attribute value (unquoted) state and reconsume + this input character. */ + $this->char--; + $this->state = 'attributeValueUnquoted'; + + } elseif($char === '\'') { + /* U+0027 APOSTROPHE (') + Switch to the attribute value (single-quoted) state. */ + $this->state = 'attributeValueSingleQuoted'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Switch to the attribute value (unquoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueUnquoted'; + } + } + + private function attributeValueDoubleQuotedState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if($char === '"') { + /* U+0022 QUOTATION MARK (") + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState('double'); + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the character + in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (double-quoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueDoubleQuoted'; + } + } + + private function attributeValueSingleQuotedState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if($char === '\'') { + /* U+0022 QUOTATION MARK (') + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState('single'); + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the character + in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (single-quoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueSingleQuoted'; + } + } + + private function attributeValueUnquotedState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState(); + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (unquoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueUnquoted'; + } + } + + private function entityInAttributeValueState() { + // Attempt to consume an entity. + $entity = $this->entity(); + + // If nothing is returned, append a U+0026 AMPERSAND character to the + // current attribute's value. Otherwise, emit the character token that + // was returned. + $char = (!$entity) + ? '&' + : $entity; + + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + } + + private function bogusCommentState() { + /* Consume every character up to the first U+003E GREATER-THAN SIGN + character (>) or the end of the file (EOF), whichever comes first. Emit + a comment token whose data is the concatenation of all the characters + starting from and including the character that caused the state machine + to switch into the bogus comment state, up to and including the last + consumed character before the U+003E character, if any, or up to the + end of the file otherwise. (If the comment was started by the end of + the file (EOF), the token is empty.) */ + $data = $this->characters('^>', $this->char); + $this->emitToken(array( + 'data' => $data, + 'type' => self::COMMENT + )); + + $this->char += strlen($data); + + /* Switch to the data state. */ + $this->state = 'data'; + + /* If the end of the file was reached, reconsume the EOF character. */ + if($this->char === $this->EOF) { + $this->char = $this->EOF - 1; + } + } + + private function markupDeclarationOpenState() { + /* If the next two characters are both U+002D HYPHEN-MINUS (-) + characters, consume those two characters, create a comment token whose + data is the empty string, and switch to the comment state. */ + if($this->character($this->char + 1, 2) === '--') { + $this->char += 2; + $this->state = 'comment'; + $this->token = array( + 'data' => null, + 'type' => self::COMMENT + ); + + /* Otherwise if the next seven chacacters are a case-insensitive match + for the word "DOCTYPE", then consume those characters and switch to the + DOCTYPE state. */ + } elseif(strtolower($this->character($this->char + 1, 7)) === 'doctype') { + $this->char += 7; + $this->state = 'doctype'; + + /* Otherwise, is is a parse error. Switch to the bogus comment state. + The next character that is consumed, if any, is the first character + that will be in the comment. */ + } else { + $this->char++; + $this->state = 'bogusComment'; + } + } + + private function commentState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + /* U+002D HYPHEN-MINUS (-) */ + if($char === '-') { + /* Switch to the comment dash state */ + $this->state = 'commentDash'; + + /* EOF */ + } elseif($this->char === $this->EOF) { + /* Parse error. Emit the comment token. Reconsume the EOF character + in the data state. */ + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + /* Anything else */ + } else { + /* Append the input character to the comment token's data. Stay in + the comment state. */ + $this->token['data'] .= $char; + } + } + + private function commentDashState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + /* U+002D HYPHEN-MINUS (-) */ + if($char === '-') { + /* Switch to the comment end state */ + $this->state = 'commentEnd'; + + /* EOF */ + } elseif($this->char === $this->EOF) { + /* Parse error. Emit the comment token. Reconsume the EOF character + in the data state. */ + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + /* Anything else */ + } else { + /* Append a U+002D HYPHEN-MINUS (-) character and the input + character to the comment token's data. Switch to the comment state. */ + $this->token['data'] .= '-'.$char; + $this->state = 'comment'; + } + } + + private function commentEndState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($char === '-') { + $this->token['data'] .= '-'; + + } elseif($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['data'] .= '--'.$char; + $this->state = 'comment'; + } + } + + private function doctypeState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + $this->state = 'beforeDoctypeName'; + + } else { + $this->char--; + $this->state = 'beforeDoctypeName'; + } + } + + private function beforeDoctypeNameState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + // Stay in the before DOCTYPE name state. + + } elseif(preg_match('/^[a-z]$/', $char)) { + $this->token = array( + 'name' => strtoupper($char), + 'type' => self::DOCTYPE, + 'error' => true + ); + + $this->state = 'doctypeName'; + + } elseif($char === '>') { + $this->emitToken(array( + 'name' => null, + 'type' => self::DOCTYPE, + 'error' => true + )); + + $this->state = 'data'; + + } elseif($this->char === $this->EOF) { + $this->emitToken(array( + 'name' => null, + 'type' => self::DOCTYPE, + 'error' => true + )); + + $this->char--; + $this->state = 'data'; + + } else { + $this->token = array( + 'name' => $char, + 'type' => self::DOCTYPE, + 'error' => true + ); + + $this->state = 'doctypeName'; + } + } + + private function doctypeNameState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + $this->state = 'AfterDoctypeName'; + + } elseif($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif(preg_match('/^[a-z]$/', $char)) { + $this->token['name'] .= strtoupper($char); + + } elseif($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['name'] .= $char; + } + + $this->token['error'] = ($this->token['name'] === 'HTML') + ? false + : true; + } + + private function afterDoctypeNameState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + // Stay in the DOCTYPE name state. + + } elseif($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['error'] = true; + $this->state = 'bogusDoctype'; + } + } + + private function bogusDoctypeState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + // Stay in the bogus DOCTYPE state. + } + } + + private function entity() { + $start = $this->char; + + // This section defines how to consume an entity. This definition is + // used when parsing entities in text and in attributes. + + // The behaviour depends on the identity of the next character (the + // one immediately after the U+0026 AMPERSAND character): + + switch($this->character($this->char + 1)) { + // U+0023 NUMBER SIGN (#) + case '#': + + // The behaviour further depends on the character after the + // U+0023 NUMBER SIGN: + switch($this->character($this->char + 1)) { + // U+0078 LATIN SMALL LETTER X + // U+0058 LATIN CAPITAL LETTER X + case 'x': + case 'X': + // Follow the steps below, but using the range of + // characters U+0030 DIGIT ZERO through to U+0039 DIGIT + // NINE, U+0061 LATIN SMALL LETTER A through to U+0066 + // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER + // A, through to U+0046 LATIN CAPITAL LETTER F (in other + // words, 0-9, A-F, a-f). + $char = 1; + $char_class = '0-9A-Fa-f'; + break; + + // Anything else + default: + // Follow the steps below, but using the range of + // characters U+0030 DIGIT ZERO through to U+0039 DIGIT + // NINE (i.e. just 0-9). + $char = 0; + $char_class = '0-9'; + break; + } + + // Consume as many characters as match the range of characters + // given above. + $this->char++; + $e_name = $this->characters($char_class, $this->char + $char + 1); + $entity = $this->character($start, $this->char); + $cond = strlen($e_name) > 0; + + // The rest of the parsing happens bellow. + break; + + // Anything else + default: + // Consume the maximum number of characters possible, with the + // consumed characters case-sensitively matching one of the + // identifiers in the first column of the entities table. + $e_name = $this->characters('0-9A-Za-z;', $this->char + 1); + $len = strlen($e_name); + + for($c = 1; $c <= $len; $c++) { + $id = substr($e_name, 0, $c); + $this->char++; + + if(in_array($id, $this->entities)) { + if ($e_name[$c-1] !== ';') { + if ($c < $len && $e_name[$c] == ';') { + $this->char++; // consume extra semicolon + } + } + $entity = $id; + break; + } + } + + $cond = isset($entity); + // The rest of the parsing happens bellow. + break; + } + + if(!$cond) { + // If no match can be made, then this is a parse error. No + // characters are consumed, and nothing is returned. + $this->char = $start; + return false; + } + + // Return a character token for the character corresponding to the + // entity name (as given by the second column of the entities table). + return html_entity_decode('&'.$entity.';', ENT_QUOTES, 'UTF-8'); + } + + private function emitToken($token) { + $emit = $this->tree->emitToken($token); + + if(is_int($emit)) { + $this->content_model = $emit; + + } elseif($token['type'] === self::ENDTAG) { + $this->content_model = self::PCDATA; + } + } + + private function EOF() { + $this->state = null; + $this->tree->emitToken(array( + 'type' => self::EOF + )); + } +} + +class HTML5TreeConstructer { + public $stack = array(); + + private $phase; + private $mode; + private $dom; + private $foster_parent = null; + private $a_formatting = array(); + + private $head_pointer = null; + private $form_pointer = null; + + private $scoping = array('button','caption','html','marquee','object','table','td','th'); + private $formatting = array('a','b','big','em','font','i','nobr','s','small','strike','strong','tt','u'); + private $special = array('address','area','base','basefont','bgsound', + 'blockquote','body','br','center','col','colgroup','dd','dir','div','dl', + 'dt','embed','fieldset','form','frame','frameset','h1','h2','h3','h4','h5', + 'h6','head','hr','iframe','image','img','input','isindex','li','link', + 'listing','menu','meta','noembed','noframes','noscript','ol','optgroup', + 'option','p','param','plaintext','pre','script','select','spacer','style', + 'tbody','textarea','tfoot','thead','title','tr','ul','wbr'); + + // The different phases. + const INIT_PHASE = 0; + const ROOT_PHASE = 1; + const MAIN_PHASE = 2; + const END_PHASE = 3; + + // The different insertion modes for the main phase. + const BEFOR_HEAD = 0; + const IN_HEAD = 1; + const AFTER_HEAD = 2; + const IN_BODY = 3; + const IN_TABLE = 4; + const IN_CAPTION = 5; + const IN_CGROUP = 6; + const IN_TBODY = 7; + const IN_ROW = 8; + const IN_CELL = 9; + const IN_SELECT = 10; + const AFTER_BODY = 11; + const IN_FRAME = 12; + const AFTR_FRAME = 13; + + // The different types of elements. + const SPECIAL = 0; + const SCOPING = 1; + const FORMATTING = 2; + const PHRASING = 3; + + const MARKER = 0; + + public function __construct() { + $this->phase = self::INIT_PHASE; + $this->mode = self::BEFOR_HEAD; + $this->dom = new DOMDocument; + + $this->dom->encoding = 'UTF-8'; + $this->dom->preserveWhiteSpace = true; + $this->dom->substituteEntities = true; + $this->dom->strictErrorChecking = false; + } + + // Process tag tokens + public function emitToken($token) { + switch($this->phase) { + case self::INIT_PHASE: return $this->initPhase($token); break; + case self::ROOT_PHASE: return $this->rootElementPhase($token); break; + case self::MAIN_PHASE: return $this->mainPhase($token); break; + case self::END_PHASE : return $this->trailingEndPhase($token); break; + } + } + + private function initPhase($token) { + /* Initially, the tree construction stage must handle each token + emitted from the tokenisation stage as follows: */ + + /* A DOCTYPE token that is marked as being in error + A comment token + A start tag token + An end tag token + A character token that is not one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE + An end-of-file token */ + if((isset($token['error']) && $token['error']) || + $token['type'] === HTML5::COMMENT || + $token['type'] === HTML5::STARTTAG || + $token['type'] === HTML5::ENDTAG || + $token['type'] === HTML5::EOF || + ($token['type'] === HTML5::CHARACTR && isset($token['data']) && + !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))) { + /* This specification does not define how to handle this case. In + particular, user agents may ignore the entirety of this specification + altogether for such documents, and instead invoke special parse modes + with a greater emphasis on backwards compatibility. */ + + $this->phase = self::ROOT_PHASE; + return $this->rootElementPhase($token); + + /* A DOCTYPE token marked as being correct */ + } elseif(isset($token['error']) && !$token['error']) { + /* Append a DocumentType node to the Document node, with the name + attribute set to the name given in the DOCTYPE token (which will be + "HTML"), and the other attributes specific to DocumentType objects + set to null, empty lists, or the empty string as appropriate. */ + $doctype = new DOMDocumentType(null, null, 'HTML'); + + /* Then, switch to the root element phase of the tree construction + stage. */ + $this->phase = self::ROOT_PHASE; + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif(isset($token['data']) && preg_match('/^[\t\n\x0b\x0c ]+$/', + $token['data'])) { + /* Append that character to the Document node. */ + $text = $this->dom->createTextNode($token['data']); + $this->dom->appendChild($text); + } + } + + private function rootElementPhase($token) { + /* After the initial phase, as each token is emitted from the tokenisation + stage, it must be processed as described in this section. */ + + /* A DOCTYPE token */ + if($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the Document object with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->dom->appendChild($comment); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append that character to the Document node. */ + $text = $this->dom->createTextNode($token['data']); + $this->dom->appendChild($text); + + /* A character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED + (FF), or U+0020 SPACE + A start tag token + An end tag token + An end-of-file token */ + } elseif(($token['type'] === HTML5::CHARACTR && + !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || + $token['type'] === HTML5::STARTTAG || + $token['type'] === HTML5::ENDTAG || + $token['type'] === HTML5::EOF) { + /* Create an HTMLElement node with the tag name html, in the HTML + namespace. Append it to the Document object. Switch to the main + phase and reprocess the current token. */ + $html = $this->dom->createElement('html'); + $this->dom->appendChild($html); + $this->stack[] = $html; + + $this->phase = self::MAIN_PHASE; + return $this->mainPhase($token); + } + } + + private function mainPhase($token) { + /* Tokens in the main phase must be handled as follows: */ + + /* A DOCTYPE token */ + if($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A start tag token with the tag name "html" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') { + /* If this start tag token was not the first start tag token, then + it is a parse error. */ + + /* For each attribute on the token, check to see if the attribute + is already present on the top element of the stack of open elements. + If it is not, add the attribute and its corresponding value to that + element. */ + foreach($token['attr'] as $attr) { + if(!$this->stack[0]->hasAttribute($attr['name'])) { + $this->stack[0]->setAttribute($attr['name'], $attr['value']); + } + } + + /* An end-of-file token */ + } elseif($token['type'] === HTML5::EOF) { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Anything else. */ + } else { + /* Depends on the insertion mode: */ + switch($this->mode) { + case self::BEFOR_HEAD: return $this->beforeHead($token); break; + case self::IN_HEAD: return $this->inHead($token); break; + case self::AFTER_HEAD: return $this->afterHead($token); break; + case self::IN_BODY: return $this->inBody($token); break; + case self::IN_TABLE: return $this->inTable($token); break; + case self::IN_CAPTION: return $this->inCaption($token); break; + case self::IN_CGROUP: return $this->inColumnGroup($token); break; + case self::IN_TBODY: return $this->inTableBody($token); break; + case self::IN_ROW: return $this->inRow($token); break; + case self::IN_CELL: return $this->inCell($token); break; + case self::IN_SELECT: return $this->inSelect($token); break; + case self::AFTER_BODY: return $this->afterBody($token); break; + case self::IN_FRAME: return $this->inFrameset($token); break; + case self::AFTR_FRAME: return $this->afterFrameset($token); break; + case self::END_PHASE: return $this->trailingEndPhase($token); break; + } + } + } + + private function beforeHead($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token with the tag name "head" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') { + /* Create an element for the token, append the new element to the + current node and push it onto the stack of open elements. */ + $element = $this->insertElement($token); + + /* Set the head element pointer to this new element node. */ + $this->head_pointer = $element; + + /* Change the insertion mode to "in head". */ + $this->mode = self::IN_HEAD; + + /* A start tag token whose tag name is one of: "base", "link", "meta", + "script", "style", "title". Or an end tag with the tag name "html". + Or a character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. Or any other start tag token */ + } elseif($token['type'] === HTML5::STARTTAG || + ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') || + ($token['type'] === HTML5::CHARACTR && !preg_match('/^[\t\n\x0b\x0c ]$/', + $token['data']))) { + /* Act as if a start tag token with the tag name "head" and no + attributes had been seen, then reprocess the current token. */ + $this->beforeHead(array( + 'name' => 'head', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + return $this->inHead($token); + + /* Any other end tag */ + } elseif($token['type'] === HTML5::ENDTAG) { + /* Parse error. Ignore the token. */ + } + } + + private function inHead($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. + + THIS DIFFERS FROM THE SPEC: If the current node is either a title, style + or script element, append the character to the current node regardless + of its content. */ + if(($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || ( + $token['type'] === HTML5::CHARACTR && in_array(end($this->stack)->nodeName, + array('title', 'style', 'script')))) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + } elseif($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('title', 'style', 'script'))) { + array_pop($this->stack); + return HTML5::PCDATA; + + /* A start tag with the tag name "title" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + } else { + $element = $this->insertElement($token); + } + + /* Switch the tokeniser's content model flag to the RCDATA state. */ + return HTML5::RCDATA; + + /* A start tag with the tag name "style" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + } else { + $this->insertElement($token); + } + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + + /* A start tag with the tag name "script" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') { + /* Create an element for the token. */ + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + + /* A start tag with the tag name "base", "link", or "meta" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('base', 'link', 'meta'))) { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + array_pop($this->stack); + + } else { + $this->insertElement($token); + } + + /* An end tag with the tag name "head" */ + } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') { + /* If the current node is a head element, pop the current node off + the stack of open elements. */ + if($this->head_pointer->isSameNode(end($this->stack))) { + array_pop($this->stack); + + /* Otherwise, this is a parse error. */ + } else { + // k + } + + /* Change the insertion mode to "after head". */ + $this->mode = self::AFTER_HEAD; + + /* A start tag with the tag name "head" or an end tag except "html". */ + } elseif(($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') || + ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* If the current node is a head element, act as if an end tag + token with the tag name "head" had been seen. */ + if($this->head_pointer->isSameNode(end($this->stack))) { + $this->inHead(array( + 'name' => 'head', + 'type' => HTML5::ENDTAG + )); + + /* Otherwise, change the insertion mode to "after head". */ + } else { + $this->mode = self::AFTER_HEAD; + } + + /* Then, reprocess the current token. */ + return $this->afterHead($token); + } + } + + private function afterHead($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token with the tag name "body" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') { + /* Insert a body element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in body". */ + $this->mode = self::IN_BODY; + + /* A start tag token with the tag name "frameset" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') { + /* Insert a frameset element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in frameset". */ + $this->mode = self::IN_FRAME; + + /* A start tag token whose tag name is one of: "base", "link", "meta", + "script", "style", "title" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('base', 'link', 'meta', 'script', 'style', 'title'))) { + /* Parse error. Switch the insertion mode back to "in head" and + reprocess the token. */ + $this->mode = self::IN_HEAD; + return $this->inHead($token); + + /* Anything else */ + } else { + /* Act as if a start tag token with the tag name "body" and no + attributes had been seen, and then reprocess the current token. */ + $this->afterHead(array( + 'name' => 'body', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + return $this->inBody($token); + } + } + + private function inBody($token) { + /* Handle the token as follows: */ + + switch($token['type']) { + /* A character token */ + case HTML5::CHARACTR: + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Append the token's character to the current node. */ + $this->insertText($token['data']); + break; + + /* A comment token */ + case HTML5::COMMENT: + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + break; + + case HTML5::STARTTAG: + switch($token['name']) { + /* A start tag token whose tag name is one of: "script", + "style" */ + case 'script': case 'style': + /* Process the token as if the insertion mode had been "in + head". */ + return $this->inHead($token); + break; + + /* A start tag token whose tag name is one of: "base", "link", + "meta", "title" */ + case 'base': case 'link': case 'meta': case 'title': + /* Parse error. Process the token as if the insertion mode + had been "in head". */ + return $this->inHead($token); + break; + + /* A start tag token with the tag name "body" */ + case 'body': + /* Parse error. If the second element on the stack of open + elements is not a body element, or, if the stack of open + elements has only one node on it, then ignore the token. + (innerHTML case) */ + if(count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') { + // Ignore + + /* Otherwise, for each attribute on the token, check to see + if the attribute is already present on the body element (the + second element) on the stack of open elements. If it is not, + add the attribute and its corresponding value to that + element. */ + } else { + foreach($token['attr'] as $attr) { + if(!$this->stack[1]->hasAttribute($attr['name'])) { + $this->stack[1]->setAttribute($attr['name'], $attr['value']); + } + } + } + break; + + /* A start tag whose tag name is one of: "address", + "blockquote", "center", "dir", "div", "dl", "fieldset", + "listing", "menu", "ol", "p", "ul" */ + case 'address': case 'blockquote': case 'center': case 'dir': + case 'div': case 'dl': case 'fieldset': case 'listing': + case 'menu': case 'ol': case 'p': case 'ul': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + break; + + /* A start tag whose tag name is "form" */ + case 'form': + /* If the form element pointer is not null, ignore the + token with a parse error. */ + if($this->form_pointer !== null) { + // Ignore. + + /* Otherwise: */ + } else { + /* If the stack of open elements has a p element in + scope, then act as if an end tag with the tag name p + had been seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token, and set the + form element pointer to point to the element created. */ + $element = $this->insertElement($token); + $this->form_pointer = $element; + } + break; + + /* A start tag whose tag name is "li", "dd" or "dt" */ + case 'li': case 'dd': case 'dt': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + $stack_length = count($this->stack) - 1; + + for($n = $stack_length; 0 <= $n; $n--) { + /* 1. Initialise node to be the current node (the + bottommost node of the stack). */ + $stop = false; + $node = $this->stack[$n]; + $cat = $this->getElementCategory($node->tagName); + + /* 2. If node is an li, dd or dt element, then pop all + the nodes from the current node up to node, including + node, then stop this algorithm. */ + if($token['name'] === $node->tagName || ($token['name'] !== 'li' + && ($node->tagName === 'dd' || $node->tagName === 'dt'))) { + for($x = $stack_length; $x >= $n ; $x--) { + array_pop($this->stack); + } + + break; + } + + /* 3. If node is not in the formatting category, and is + not in the phrasing category, and is not an address or + div element, then stop this algorithm. */ + if($cat !== self::FORMATTING && $cat !== self::PHRASING && + $node->tagName !== 'address' && $node->tagName !== 'div') { + break; + } + } + + /* Finally, insert an HTML element with the same tag + name as the token's. */ + $this->insertElement($token); + break; + + /* A start tag token whose tag name is "plaintext" */ + case 'plaintext': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + return HTML5::PLAINTEXT; + break; + + /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4", + "h5", "h6" */ + case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* If the stack of open elements has in scope an element whose + tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then + this is a parse error; pop elements from the stack until an + element with one of those tag names has been popped from the + stack. */ + while($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) { + array_pop($this->stack); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + break; + + /* A start tag whose tag name is "a" */ + case 'a': + /* If the list of active formatting elements contains + an element whose tag name is "a" between the end of the + list and the last marker on the list (or the start of + the list if there is no marker on the list), then this + is a parse error; act as if an end tag with the tag name + "a" had been seen, then remove that element from the list + of active formatting elements and the stack of open + elements if the end tag didn't already remove it (it + might not have if the element is not in table scope). */ + $leng = count($this->a_formatting); + + for($n = $leng - 1; $n >= 0; $n--) { + if($this->a_formatting[$n] === self::MARKER) { + break; + + } elseif($this->a_formatting[$n]->nodeName === 'a') { + $this->emitToken(array( + 'name' => 'a', + 'type' => HTML5::ENDTAG + )); + break; + } + } + + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $el = $this->insertElement($token); + + /* Add that element to the list of active formatting + elements. */ + $this->a_formatting[] = $el; + break; + + /* A start tag whose tag name is one of: "b", "big", "em", "font", + "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ + case 'b': case 'big': case 'em': case 'font': case 'i': + case 'nobr': case 's': case 'small': case 'strike': + case 'strong': case 'tt': case 'u': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $el = $this->insertElement($token); + + /* Add that element to the list of active formatting + elements. */ + $this->a_formatting[] = $el; + break; + + /* A start tag token whose tag name is "button" */ + case 'button': + /* If the stack of open elements has a button element in scope, + then this is a parse error; act as if an end tag with the tag + name "button" had been seen, then reprocess the token. (We don't + do that. Unnecessary.) */ + if($this->elementInScope('button')) { + $this->inBody(array( + 'name' => 'button', + 'type' => HTML5::ENDTAG + )); + } + + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + break; + + /* A start tag token whose tag name is one of: "marquee", "object" */ + case 'marquee': case 'object': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + break; + + /* A start tag token whose tag name is "xmp" */ + case 'xmp': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Switch the content model flag to the CDATA state. */ + return HTML5::CDATA; + break; + + /* A start tag whose tag name is "table" */ + case 'table': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in table". */ + $this->mode = self::IN_TABLE; + break; + + /* A start tag whose tag name is one of: "area", "basefont", + "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */ + case 'area': case 'basefont': case 'bgsound': case 'br': + case 'embed': case 'img': case 'param': case 'spacer': + case 'wbr': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "hr" */ + case 'hr': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "image" */ + case 'image': + /* Parse error. Change the token's tag name to "img" and + reprocess it. (Don't ask.) */ + $token['name'] = 'img'; + return $this->inBody($token); + break; + + /* A start tag whose tag name is "input" */ + case 'input': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an input element for the token. */ + $element = $this->insertElement($token, false); + + /* If the form element pointer is not null, then associate the + input element with the form element pointed to by the form + element pointer. */ + $this->form_pointer !== null + ? $this->form_pointer->appendChild($element) + : end($this->stack)->appendChild($element); + + /* Pop that input element off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "isindex" */ + case 'isindex': + /* Parse error. */ + // w/e + + /* If the form element pointer is not null, + then ignore the token. */ + if($this->form_pointer === null) { + /* Act as if a start tag token with the tag name "form" had + been seen. */ + $this->inBody(array( + 'name' => 'body', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + /* Act as if a start tag token with the tag name "hr" had + been seen. */ + $this->inBody(array( + 'name' => 'hr', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + /* Act as if a start tag token with the tag name "p" had + been seen. */ + $this->inBody(array( + 'name' => 'p', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + /* Act as if a start tag token with the tag name "label" + had been seen. */ + $this->inBody(array( + 'name' => 'label', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + /* Act as if a stream of character tokens had been seen. */ + $this->insertText('This is a searchable index. '. + 'Insert your search keywords here: '); + + /* Act as if a start tag token with the tag name "input" + had been seen, with all the attributes from the "isindex" + token, except with the "name" attribute set to the value + "isindex" (ignoring any explicit "name" attribute). */ + $attr = $token['attr']; + $attr[] = array('name' => 'name', 'value' => 'isindex'); + + $this->inBody(array( + 'name' => 'input', + 'type' => HTML5::STARTTAG, + 'attr' => $attr + )); + + /* Act as if a stream of character tokens had been seen + (see below for what they should say). */ + $this->insertText('This is a searchable index. '. + 'Insert your search keywords here: '); + + /* Act as if an end tag token with the tag name "label" + had been seen. */ + $this->inBody(array( + 'name' => 'label', + 'type' => HTML5::ENDTAG + )); + + /* Act as if an end tag token with the tag name "p" had + been seen. */ + $this->inBody(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + + /* Act as if a start tag token with the tag name "hr" had + been seen. */ + $this->inBody(array( + 'name' => 'hr', + 'type' => HTML5::ENDTAG + )); + + /* Act as if an end tag token with the tag name "form" had + been seen. */ + $this->inBody(array( + 'name' => 'form', + 'type' => HTML5::ENDTAG + )); + } + break; + + /* A start tag whose tag name is "textarea" */ + case 'textarea': + $this->insertElement($token); + + /* Switch the tokeniser's content model flag to the + RCDATA state. */ + return HTML5::RCDATA; + break; + + /* A start tag whose tag name is one of: "iframe", "noembed", + "noframes" */ + case 'iframe': case 'noembed': case 'noframes': + $this->insertElement($token); + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + break; + + /* A start tag whose tag name is "select" */ + case 'select': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in select". */ + $this->mode = self::IN_SELECT; + break; + + /* A start or end tag whose tag name is one of: "caption", "col", + "colgroup", "frame", "frameset", "head", "option", "optgroup", + "tbody", "td", "tfoot", "th", "thead", "tr". */ + case 'caption': case 'col': case 'colgroup': case 'frame': + case 'frameset': case 'head': case 'option': case 'optgroup': + case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead': + case 'tr': + // Parse error. Ignore the token. + break; + + /* A start or end tag whose tag name is one of: "event-source", + "section", "nav", "article", "aside", "header", "footer", + "datagrid", "command" */ + case 'event-source': case 'section': case 'nav': case 'article': + case 'aside': case 'header': case 'footer': case 'datagrid': + case 'command': + // Work in progress! + break; + + /* A start tag token not covered by the previous entries */ + default: + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + $this->insertElement($token, true, true); + break; + } + break; + + case HTML5::ENDTAG: + switch($token['name']) { + /* An end tag with the tag name "body" */ + case 'body': + /* If the second element in the stack of open elements is + not a body element, this is a parse error. Ignore the token. + (innerHTML case) */ + if(count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') { + // Ignore. + + /* If the current node is not the body element, then this + is a parse error. */ + } elseif(end($this->stack)->nodeName !== 'body') { + // Parse error. + } + + /* Change the insertion mode to "after body". */ + $this->mode = self::AFTER_BODY; + break; + + /* An end tag with the tag name "html" */ + case 'html': + /* Act as if an end tag with tag name "body" had been seen, + then, if that token wasn't ignored, reprocess the current + token. */ + $this->inBody(array( + 'name' => 'body', + 'type' => HTML5::ENDTAG + )); + + return $this->afterBody($token); + break; + + /* An end tag whose tag name is one of: "address", "blockquote", + "center", "dir", "div", "dl", "fieldset", "listing", "menu", + "ol", "pre", "ul" */ + case 'address': case 'blockquote': case 'center': case 'dir': + case 'div': case 'dl': case 'fieldset': case 'listing': + case 'menu': case 'ol': case 'pre': case 'ul': + /* If the stack of open elements has an element in scope + with the same tag name as that of the token, then generate + implied end tags. */ + if($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with + the same tag name as that of the token, then this + is a parse error. */ + // w/e + + /* If the stack of open elements has an element in + scope with the same tag name as that of the token, + then pop elements from this stack until an element + with that tag name has been popped from the stack. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is "form" */ + case 'form': + /* If the stack of open elements has an element in scope + with the same tag name as that of the token, then generate + implied end tags. */ + if($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + } + + if(end($this->stack)->nodeName !== $token['name']) { + /* Now, if the current node is not an element with the + same tag name as that of the token, then this is a parse + error. */ + // w/e + + } else { + /* Otherwise, if the current node is an element with + the same tag name as that of the token pop that element + from the stack. */ + array_pop($this->stack); + } + + /* In any case, set the form element pointer to null. */ + $this->form_pointer = null; + break; + + /* An end tag whose tag name is "p" */ + case 'p': + /* If the stack of open elements has a p element in scope, + then generate implied end tags, except for p elements. */ + if($this->elementInScope('p')) { + $this->generateImpliedEndTags(array('p')); + + /* If the current node is not a p element, then this is + a parse error. */ + // k + + /* If the stack of open elements has a p element in + scope, then pop elements from this stack until the stack + no longer has a p element in scope. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->elementInScope('p')) { + array_pop($this->stack); + + } else { + break; + } + } + } + break; + + /* An end tag whose tag name is "dd", "dt", or "li" */ + case 'dd': case 'dt': case 'li': + /* If the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then + generate implied end tags, except for elements with the + same tag name as the token. */ + if($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(array($token['name'])); + + /* If the current node is not an element with the same + tag name as the token, then this is a parse error. */ + // w/e + + /* If the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then + pop elements from this stack until an element with that + tag name has been popped from the stack. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4", + "h5", "h6" */ + case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': + $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); + + /* If the stack of open elements has in scope an element whose + tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then + generate implied end tags. */ + if($this->elementInScope($elements)) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with the same + tag name as that of the token, then this is a parse error. */ + // w/e + + /* If the stack of open elements has in scope an element + whose tag name is one of "h1", "h2", "h3", "h4", "h5", or + "h6", then pop elements from the stack until an element + with one of those tag names has been popped from the stack. */ + while($this->elementInScope($elements)) { + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is one of: "a", "b", "big", "em", + "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ + case 'a': case 'b': case 'big': case 'em': case 'font': + case 'i': case 'nobr': case 's': case 'small': case 'strike': + case 'strong': case 'tt': case 'u': + /* 1. Let the formatting element be the last element in + the list of active formatting elements that: + * is between the end of the list and the last scope + marker in the list, if any, or the start of the list + otherwise, and + * has the same tag name as the token. + */ + while(true) { + for($a = count($this->a_formatting) - 1; $a >= 0; $a--) { + if($this->a_formatting[$a] === self::MARKER) { + break; + + } elseif($this->a_formatting[$a]->tagName === $token['name']) { + $formatting_element = $this->a_formatting[$a]; + $in_stack = in_array($formatting_element, $this->stack, true); + $fe_af_pos = $a; + break; + } + } + + /* If there is no such node, or, if that node is + also in the stack of open elements but the element + is not in scope, then this is a parse error. Abort + these steps. The token is ignored. */ + if(!isset($formatting_element) || ($in_stack && + !$this->elementInScope($token['name']))) { + break; + + /* Otherwise, if there is such a node, but that node + is not in the stack of open elements, then this is a + parse error; remove the element from the list, and + abort these steps. */ + } elseif(isset($formatting_element) && !$in_stack) { + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + break; + } + + /* 2. Let the furthest block be the topmost node in the + stack of open elements that is lower in the stack + than the formatting element, and is not an element in + the phrasing or formatting categories. There might + not be one. */ + $fe_s_pos = array_search($formatting_element, $this->stack, true); + $length = count($this->stack); + + for($s = $fe_s_pos + 1; $s < $length; $s++) { + $category = $this->getElementCategory($this->stack[$s]->nodeName); + + if($category !== self::PHRASING && $category !== self::FORMATTING) { + $furthest_block = $this->stack[$s]; + } + } + + /* 3. If there is no furthest block, then the UA must + skip the subsequent steps and instead just pop all + the nodes from the bottom of the stack of open + elements, from the current node up to the formatting + element, and remove the formatting element from the + list of active formatting elements. */ + if(!isset($furthest_block)) { + for($n = $length - 1; $n >= $fe_s_pos; $n--) { + array_pop($this->stack); + } + + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + break; + } + + /* 4. Let the common ancestor be the element + immediately above the formatting element in the stack + of open elements. */ + $common_ancestor = $this->stack[$fe_s_pos - 1]; + + /* 5. If the furthest block has a parent node, then + remove the furthest block from its parent node. */ + if($furthest_block->parentNode !== null) { + $furthest_block->parentNode->removeChild($furthest_block); + } + + /* 6. Let a bookmark note the position of the + formatting element in the list of active formatting + elements relative to the elements on either side + of it in the list. */ + $bookmark = $fe_af_pos; + + /* 7. Let node and last node be the furthest block. + Follow these steps: */ + $node = $furthest_block; + $last_node = $furthest_block; + + while(true) { + for($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) { + /* 7.1 Let node be the element immediately + prior to node in the stack of open elements. */ + $node = $this->stack[$n]; + + /* 7.2 If node is not in the list of active + formatting elements, then remove node from + the stack of open elements and then go back + to step 1. */ + if(!in_array($node, $this->a_formatting, true)) { + unset($this->stack[$n]); + $this->stack = array_merge($this->stack); + + } else { + break; + } + } + + /* 7.3 Otherwise, if node is the formatting + element, then go to the next step in the overall + algorithm. */ + if($node === $formatting_element) { + break; + + /* 7.4 Otherwise, if last node is the furthest + block, then move the aforementioned bookmark to + be immediately after the node in the list of + active formatting elements. */ + } elseif($last_node === $furthest_block) { + $bookmark = array_search($node, $this->a_formatting, true) + 1; + } + + /* 7.5 If node has any children, perform a + shallow clone of node, replace the entry for + node in the list of active formatting elements + with an entry for the clone, replace the entry + for node in the stack of open elements with an + entry for the clone, and let node be the clone. */ + if($node->hasChildNodes()) { + $clone = $node->cloneNode(); + $s_pos = array_search($node, $this->stack, true); + $a_pos = array_search($node, $this->a_formatting, true); + + $this->stack[$s_pos] = $clone; + $this->a_formatting[$a_pos] = $clone; + $node = $clone; + } + + /* 7.6 Insert last node into node, first removing + it from its previous parent node if any. */ + if($last_node->parentNode !== null) { + $last_node->parentNode->removeChild($last_node); + } + + $node->appendChild($last_node); + + /* 7.7 Let last node be node. */ + $last_node = $node; + } + + /* 8. Insert whatever last node ended up being in + the previous step into the common ancestor node, + first removing it from its previous parent node if + any. */ + if($last_node->parentNode !== null) { + $last_node->parentNode->removeChild($last_node); + } + + $common_ancestor->appendChild($last_node); + + /* 9. Perform a shallow clone of the formatting + element. */ + $clone = $formatting_element->cloneNode(); + + /* 10. Take all of the child nodes of the furthest + block and append them to the clone created in the + last step. */ + while($furthest_block->hasChildNodes()) { + $child = $furthest_block->firstChild; + $furthest_block->removeChild($child); + $clone->appendChild($child); + } + + /* 11. Append that clone to the furthest block. */ + $furthest_block->appendChild($clone); + + /* 12. Remove the formatting element from the list + of active formatting elements, and insert the clone + into the list of active formatting elements at the + position of the aforementioned bookmark. */ + $fe_af_pos = array_search($formatting_element, $this->a_formatting, true); + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + + $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1); + $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting)); + $this->a_formatting = array_merge($af_part1, array($clone), $af_part2); + + /* 13. Remove the formatting element from the stack + of open elements, and insert the clone into the stack + of open elements immediately after (i.e. in a more + deeply nested position than) the position of the + furthest block in that stack. */ + $fe_s_pos = array_search($formatting_element, $this->stack, true); + $fb_s_pos = array_search($furthest_block, $this->stack, true); + unset($this->stack[$fe_s_pos]); + + $s_part1 = array_slice($this->stack, 0, $fb_s_pos); + $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack)); + $this->stack = array_merge($s_part1, array($clone), $s_part2); + + /* 14. Jump back to step 1 in this series of steps. */ + unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block); + } + break; + + /* An end tag token whose tag name is one of: "button", + "marquee", "object" */ + case 'button': case 'marquee': case 'object': + /* If the stack of open elements has an element in scope whose + tag name matches the tag name of the token, then generate implied + tags. */ + if($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with the same + tag name as the token, then this is a parse error. */ + // k + + /* Now, if the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then pop + elements from the stack until that element has been popped from + the stack, and clear the list of active formatting elements up + to the last marker. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + + $marker = end(array_keys($this->a_formatting, self::MARKER, true)); + + for($n = count($this->a_formatting) - 1; $n > $marker; $n--) { + array_pop($this->a_formatting); + } + } + break; + + /* Or an end tag whose tag name is one of: "area", "basefont", + "bgsound", "br", "embed", "hr", "iframe", "image", "img", + "input", "isindex", "noembed", "noframes", "param", "select", + "spacer", "table", "textarea", "wbr" */ + case 'area': case 'basefont': case 'bgsound': case 'br': + case 'embed': case 'hr': case 'iframe': case 'image': + case 'img': case 'input': case 'isindex': case 'noembed': + case 'noframes': case 'param': case 'select': case 'spacer': + case 'table': case 'textarea': case 'wbr': + // Parse error. Ignore the token. + break; + + /* An end tag token not covered by the previous entries */ + default: + for($n = count($this->stack) - 1; $n >= 0; $n--) { + /* Initialise node to be the current node (the bottommost + node of the stack). */ + $node = end($this->stack); + + /* If node has the same tag name as the end tag token, + then: */ + if($token['name'] === $node->nodeName) { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* If the tag name of the end tag token does not + match the tag name of the current node, this is a + parse error. */ + // k + + /* Pop all the nodes from the current node up to + node, including node, then stop this algorithm. */ + for($x = count($this->stack) - $n; $x >= $n; $x--) { + array_pop($this->stack); + } + + } else { + $category = $this->getElementCategory($node); + + if($category !== self::SPECIAL && $category !== self::SCOPING) { + /* Otherwise, if node is in neither the formatting + category nor the phrasing category, then this is a + parse error. Stop this algorithm. The end tag token + is ignored. */ + return false; + } + } + } + break; + } + break; + } + } + + private function inTable($token) { + $clear = array('html', 'table'); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $text = $this->dom->createTextNode($token['data']); + end($this->stack)->appendChild($text); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + end($this->stack)->appendChild($comment); + + /* A start tag whose tag name is "caption" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'caption') { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + + /* Insert an HTML element for the token, then switch the + insertion mode to "in caption". */ + $this->insertElement($token); + $this->mode = self::IN_CAPTION; + + /* A start tag whose tag name is "colgroup" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'colgroup') { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the + insertion mode to "in column group". */ + $this->insertElement($token); + $this->mode = self::IN_CGROUP; + + /* A start tag whose tag name is "col" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'col') { + $this->inTable(array( + 'name' => 'colgroup', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + $this->inColumnGroup($token); + + /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('tbody', 'tfoot', 'thead'))) { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the insertion + mode to "in table body". */ + $this->insertElement($token); + $this->mode = self::IN_TBODY; + + /* A start tag whose tag name is one of: "td", "th", "tr" */ + } elseif($token['type'] === HTML5::STARTTAG && + in_array($token['name'], array('td', 'th', 'tr'))) { + /* Act as if a start tag token with the tag name "tbody" had been + seen, then reprocess the current token. */ + $this->inTable(array( + 'name' => 'tbody', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + return $this->inTableBody($token); + + /* A start tag whose tag name is "table" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'table') { + /* Parse error. Act as if an end tag token with the tag name "table" + had been seen, then, if that token wasn't ignored, reprocess the + current token. */ + $this->inTable(array( + 'name' => 'table', + 'type' => HTML5::ENDTAG + )); + + return $this->mainPhase($token); + + /* An end tag whose tag name is "table" */ + } elseif($token['type'] === HTML5::ENDTAG && + $token['name'] === 'table') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if(!$this->elementInScope($token['name'], true)) { + return false; + + /* Otherwise: */ + } else { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Now, if the current node is not a table element, then this + is a parse error. */ + // w/e + + /* Pop elements from this stack until a table element has been + popped from the stack. */ + while(true) { + $current = end($this->stack)->nodeName; + array_pop($this->stack); + + if($current === 'table') { + break; + } + } + + /* Reset the insertion mode appropriately. */ + $this->resetInsertionMode(); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td', + 'tfoot', 'th', 'thead', 'tr'))) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* Parse error. Process the token as if the insertion mode was "in + body", with the following exception: */ + + /* If the current node is a table, tbody, tfoot, thead, or tr + element, then, whenever a node would be inserted into the current + node, it must instead be inserted into the foster parent element. */ + if(in_array(end($this->stack)->nodeName, + array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { + /* The foster parent element is the parent element of the last + table element in the stack of open elements, if there is a + table element and it has such a parent element. If there is no + table element in the stack of open elements (innerHTML case), + then the foster parent element is the first element in the + stack of open elements (the html element). Otherwise, if there + is a table element in the stack of open elements, but the last + table element in the stack of open elements has no parent, or + its parent node is not an element, then the foster parent + element is the element before the last table element in the + stack of open elements. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->stack[$n]->nodeName === 'table') { + $table = $this->stack[$n]; + break; + } + } + + if(isset($table) && $table->parentNode !== null) { + $this->foster_parent = $table->parentNode; + + } elseif(!isset($table)) { + $this->foster_parent = $this->stack[0]; + + } elseif(isset($table) && ($table->parentNode === null || + $table->parentNode->nodeType !== XML_ELEMENT_NODE)) { + $this->foster_parent = $this->stack[$n - 1]; + } + } + + $this->inBody($token); + } + } + + private function inCaption($token) { + /* An end tag whose tag name is "caption" */ + if($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore + + /* Otherwise: */ + } else { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Now, if the current node is not a caption element, then this + is a parse error. */ + // w/e + + /* Pop elements from this stack until a caption element has + been popped from the stack. */ + while(true) { + $node = end($this->stack)->nodeName; + array_pop($this->stack); + + if($node === 'caption') { + break; + } + } + + /* Clear the list of active formatting elements up to the last + marker. */ + $this->clearTheActiveFormattingElementsUpToTheLastMarker(); + + /* Switch the insertion mode to "in table". */ + $this->mode = self::IN_TABLE; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag + name is "table" */ + } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', + 'thead', 'tr'))) || ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'table')) { + /* Parse error. Act as if an end tag with the tag name "caption" + had been seen, then, if that token wasn't ignored, reprocess the + current token. */ + $this->inCaption(array( + 'name' => 'caption', + 'type' => HTML5::ENDTAG + )); + + return $this->inTable($token); + + /* An end tag whose tag name is one of: "body", "col", "colgroup", + "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th', + 'thead', 'tr'))) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in body". */ + $this->inBody($token); + } + } + + private function inColumnGroup($token) { + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $text = $this->dom->createTextNode($token['data']); + end($this->stack)->appendChild($text); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + end($this->stack)->appendChild($comment); + + /* A start tag whose tag name is "col" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') { + /* Insert a col element for the token. Immediately pop the current + node off the stack of open elements. */ + $this->insertElement($token); + array_pop($this->stack); + + /* An end tag whose tag name is "colgroup" */ + } elseif($token['type'] === HTML5::ENDTAG && + $token['name'] === 'colgroup') { + /* If the current node is the root html element, then this is a + parse error, ignore the token. (innerHTML case) */ + if(end($this->stack)->nodeName === 'html') { + // Ignore + + /* Otherwise, pop the current node (which will be a colgroup + element) from the stack of open elements. Switch the insertion + mode to "in table". */ + } else { + array_pop($this->stack); + $this->mode = self::IN_TABLE; + } + + /* An end tag whose tag name is "col" */ + } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Act as if an end tag with the tag name "colgroup" had been seen, + and then, if that token wasn't ignored, reprocess the current token. */ + $this->inColumnGroup(array( + 'name' => 'colgroup', + 'type' => HTML5::ENDTAG + )); + + return $this->inTable($token); + } + } + + private function inTableBody($token) { + $clear = array('tbody', 'tfoot', 'thead', 'html'); + + /* A start tag whose tag name is "tr" */ + if($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Insert a tr element for the token, then switch the insertion + mode to "in row". */ + $this->insertElement($token); + $this->mode = self::IN_ROW; + + /* A start tag whose tag name is one of: "th", "td" */ + } elseif($token['type'] === HTML5::STARTTAG && + ($token['name'] === 'th' || $token['name'] === 'td')) { + /* Parse error. Act as if a start tag with the tag name "tr" had + been seen, then reprocess the current token. */ + $this->inTableBody(array( + 'name' => 'tr', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + return $this->inRow($token); + + /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore + + /* Otherwise: */ + } else { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Pop the current node from the stack of open elements. Switch + the insertion mode to "in table". */ + array_pop($this->stack); + $this->mode = self::IN_TABLE; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */ + } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead'))) || + ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')) { + /* If the stack of open elements does not have a tbody, thead, or + tfoot element in table scope, this is a parse error. Ignore the + token. (innerHTML case) */ + if(!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Act as if an end tag with the same tag name as the current + node ("tbody", "tfoot", or "thead") had been seen, then + reprocess the current token. */ + $this->inTableBody(array( + 'name' => end($this->stack)->nodeName, + 'type' => HTML5::ENDTAG + )); + + return $this->mainPhase($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "td", "th", "tr" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in table". */ + $this->inTable($token); + } + } + + private function inRow($token) { + $clear = array('tr', 'html'); + + /* A start tag whose tag name is one of: "th", "td" */ + if($token['type'] === HTML5::STARTTAG && + ($token['name'] === 'th' || $token['name'] === 'td')) { + /* Clear the stack back to a table row context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the insertion + mode to "in cell". */ + $this->insertElement($token); + $this->mode = self::IN_CELL; + + /* Insert a marker at the end of the list of active formatting + elements. */ + $this->a_formatting[] = self::MARKER; + + /* An end tag whose tag name is "tr" */ + } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Clear the stack back to a table row context. */ + $this->clearStackToTableContext($clear); + + /* Pop the current node (which will be a tr element) from the + stack of open elements. Switch the insertion mode to "in table + body". */ + array_pop($this->stack); + $this->mode = self::IN_TBODY; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'))) { + /* Act as if an end tag with the tag name "tr" had been seen, then, + if that token wasn't ignored, reprocess the current token. */ + $this->inRow(array( + 'name' => 'tr', + 'type' => HTML5::ENDTAG + )); + + return $this->inCell($token); + + /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Otherwise, act as if an end tag with the tag name "tr" had + been seen, then reprocess the current token. */ + $this->inRow(array( + 'name' => 'tr', + 'type' => HTML5::ENDTAG + )); + + return $this->inCell($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "td", "th" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in table". */ + $this->inTable($token); + } + } + + private function inCell($token) { + /* An end tag whose tag name is one of: "td", "th" */ + if($token['type'] === HTML5::ENDTAG && + ($token['name'] === 'td' || $token['name'] === 'th')) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as that of the token, then this is a + parse error and the token must be ignored. */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Generate implied end tags, except for elements with the same + tag name as the token. */ + $this->generateImpliedEndTags(array($token['name'])); + + /* Now, if the current node is not an element with the same tag + name as the token, then this is a parse error. */ + // k + + /* Pop elements from this stack until an element with the same + tag name as the token has been popped from the stack. */ + while(true) { + $node = end($this->stack)->nodeName; + array_pop($this->stack); + + if($node === $token['name']) { + break; + } + } + + /* Clear the list of active formatting elements up to the last + marker. */ + $this->clearTheActiveFormattingElementsUpToTheLastMarker(); + + /* Switch the insertion mode to "in row". (The current node + will be a tr element at this point.) */ + $this->mode = self::IN_ROW; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', + 'thead', 'tr'))) { + /* If the stack of open elements does not have a td or th element + in table scope, then this is a parse error; ignore the token. + (innerHTML case) */ + if(!$this->elementInScope(array('td', 'th'), true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', + 'thead', 'tr'))) { + /* If the stack of open elements does not have a td or th element + in table scope, then this is a parse error; ignore the token. + (innerHTML case) */ + if(!$this->elementInScope(array('td', 'th'), true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('body', 'caption', 'col', 'colgroup', 'html'))) { + /* Parse error. Ignore the token. */ + + /* An end tag whose tag name is one of: "table", "tbody", "tfoot", + "thead", "tr" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as that of the token (which can only + happen for "tbody", "tfoot" and "thead", or, in the innerHTML case), + then this is a parse error and the token must be ignored. */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in body". */ + $this->inBody($token); + } + } + + private function inSelect($token) { + /* Handle the token as follows: */ + + /* A character token */ + if($token['type'] === HTML5::CHARACTR) { + /* Append the token's character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token whose tag name is "option" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'option') { + /* If the current node is an option element, act as if an end tag + with the tag name "option" had been seen. */ + if(end($this->stack)->nodeName === 'option') { + $this->inSelect(array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* A start tag token whose tag name is "optgroup" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'optgroup') { + /* If the current node is an option element, act as if an end tag + with the tag name "option" had been seen. */ + if(end($this->stack)->nodeName === 'option') { + $this->inSelect(array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + )); + } + + /* If the current node is an optgroup element, act as if an end tag + with the tag name "optgroup" had been seen. */ + if(end($this->stack)->nodeName === 'optgroup') { + $this->inSelect(array( + 'name' => 'optgroup', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* An end tag token whose tag name is "optgroup" */ + } elseif($token['type'] === HTML5::ENDTAG && + $token['name'] === 'optgroup') { + /* First, if the current node is an option element, and the node + immediately before it in the stack of open elements is an optgroup + element, then act as if an end tag with the tag name "option" had + been seen. */ + $elements_in_stack = count($this->stack); + + if($this->stack[$elements_in_stack - 1]->nodeName === 'option' && + $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup') { + $this->inSelect(array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + )); + } + + /* If the current node is an optgroup element, then pop that node + from the stack of open elements. Otherwise, this is a parse error, + ignore the token. */ + if($this->stack[$elements_in_stack - 1] === 'optgroup') { + array_pop($this->stack); + } + + /* An end tag token whose tag name is "option" */ + } elseif($token['type'] === HTML5::ENDTAG && + $token['name'] === 'option') { + /* If the current node is an option element, then pop that node + from the stack of open elements. Otherwise, this is a parse error, + ignore the token. */ + if(end($this->stack)->nodeName === 'option') { + array_pop($this->stack); + } + + /* An end tag whose tag name is "select" */ + } elseif($token['type'] === HTML5::ENDTAG && + $token['name'] === 'select') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if(!$this->elementInScope($token['name'], true)) { + // w/e + + /* Otherwise: */ + } else { + /* Pop elements from the stack of open elements until a select + element has been popped from the stack. */ + while(true) { + $current = end($this->stack)->nodeName; + array_pop($this->stack); + + if($current === 'select') { + break; + } + } + + /* Reset the insertion mode appropriately. */ + $this->resetInsertionMode(); + } + + /* A start tag whose tag name is "select" */ + } elseif($token['name'] === 'select' && + $token['type'] === HTML5::STARTTAG) { + /* Parse error. Act as if the token had been an end tag with the + tag name "select" instead. */ + $this->inSelect(array( + 'name' => 'select', + 'type' => HTML5::ENDTAG + )); + + /* An end tag whose tag name is one of: "caption", "table", "tbody", + "tfoot", "thead", "tr", "td", "th" */ + } elseif(in_array($token['name'], array('caption', 'table', 'tbody', + 'tfoot', 'thead', 'tr', 'td', 'th')) && $token['type'] === HTML5::ENDTAG) { + /* Parse error. */ + // w/e + + /* If the stack of open elements has an element in table scope with + the same tag name as that of the token, then act as if an end tag + with the tag name "select" had been seen, and reprocess the token. + Otherwise, ignore the token. */ + if($this->elementInScope($token['name'], true)) { + $this->inSelect(array( + 'name' => 'select', + 'type' => HTML5::ENDTAG + )); + + $this->mainPhase($token); + } + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function afterBody($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Process the token as it would be processed if the insertion mode + was "in body". */ + $this->inBody($token); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the first element in the stack of open + elements (the html element), with the data attribute set to the + data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->stack[0]->appendChild($comment); + + /* An end tag with the tag name "html" */ + } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') { + /* If the parser was originally created in order to handle the + setting of an element's innerHTML attribute, this is a parse error; + ignore the token. (The element will be an html element in this + case.) (innerHTML case) */ + + /* Otherwise, switch to the trailing end phase. */ + $this->phase = self::END_PHASE; + + /* Anything else */ + } else { + /* Parse error. Set the insertion mode to "in body" and reprocess + the token. */ + $this->mode = self::IN_BODY; + return $this->inBody($token); + } + } + + private function inFrameset($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag with the tag name "frameset" */ + } elseif($token['name'] === 'frameset' && + $token['type'] === HTML5::STARTTAG) { + $this->insertElement($token); + + /* An end tag with the tag name "frameset" */ + } elseif($token['name'] === 'frameset' && + $token['type'] === HTML5::ENDTAG) { + /* If the current node is the root html element, then this is a + parse error; ignore the token. (innerHTML case) */ + if(end($this->stack)->nodeName === 'html') { + // Ignore + + } else { + /* Otherwise, pop the current node from the stack of open + elements. */ + array_pop($this->stack); + + /* If the parser was not originally created in order to handle + the setting of an element's innerHTML attribute (innerHTML case), + and the current node is no longer a frameset element, then change + the insertion mode to "after frameset". */ + $this->mode = self::AFTR_FRAME; + } + + /* A start tag with the tag name "frame" */ + } elseif($token['name'] === 'frame' && + $token['type'] === HTML5::STARTTAG) { + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + + /* A start tag with the tag name "noframes" */ + } elseif($token['name'] === 'noframes' && + $token['type'] === HTML5::STARTTAG) { + /* Process the token as if the insertion mode had been "in body". */ + $this->inBody($token); + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function afterFrameset($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* An end tag with the tag name "html" */ + } elseif($token['name'] === 'html' && + $token['type'] === HTML5::ENDTAG) { + /* Switch to the trailing end phase. */ + $this->phase = self::END_PHASE; + + /* A start tag with the tag name "noframes" */ + } elseif($token['name'] === 'noframes' && + $token['type'] === HTML5::STARTTAG) { + /* Process the token as if the insertion mode had been "in body". */ + $this->inBody($token); + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function trailingEndPhase($token) { + /* After the main phase, as each token is emitted from the tokenisation + stage, it must be processed as described in this section. */ + + /* A DOCTYPE token */ + if($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the Document object with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->dom->appendChild($comment); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Process the token as it would be processed in the main phase. */ + $this->mainPhase($token); + + /* A character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. Or a start tag token. Or an end tag token. */ + } elseif(($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || + $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG) { + /* Parse error. Switch back to the main phase and reprocess the + token. */ + $this->phase = self::MAIN_PHASE; + return $this->mainPhase($token); + + /* An end-of-file token */ + } elseif($token['type'] === HTML5::EOF) { + /* OMG DONE!! */ + } + } + + private function insertElement($token, $append = true, $check = false) { + // Proprietary workaround for libxml2's limitations with tag names + if ($check) { + // Slightly modified HTML5 tag-name modification, + // removing anything that's not an ASCII letter, digit, or hyphen + $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']); + // Remove leading hyphens and numbers + $token['name'] = ltrim($token['name'], '-0..9'); + // In theory, this should ever be needed, but just in case + if ($token['name'] === '') $token['name'] = 'span'; // arbitrary generic choice + } + + $el = $this->dom->createElement($token['name']); + + foreach($token['attr'] as $attr) { + if(!$el->hasAttribute($attr['name'])) { + $el->setAttribute($attr['name'], $attr['value']); + } + } + + $this->appendToRealParent($el); + $this->stack[] = $el; + + return $el; + } + + private function insertText($data) { + $text = $this->dom->createTextNode($data); + $this->appendToRealParent($text); + } + + private function insertComment($data) { + $comment = $this->dom->createComment($data); + $this->appendToRealParent($comment); + } + + private function appendToRealParent($node) { + if($this->foster_parent === null) { + end($this->stack)->appendChild($node); + + } elseif($this->foster_parent !== null) { + /* If the foster parent element is the parent element of the + last table element in the stack of open elements, then the new + node must be inserted immediately before the last table element + in the stack of open elements in the foster parent element; + otherwise, the new node must be appended to the foster parent + element. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->stack[$n]->nodeName === 'table' && + $this->stack[$n]->parentNode !== null) { + $table = $this->stack[$n]; + break; + } + } + + if(isset($table) && $this->foster_parent->isSameNode($table->parentNode)) + $this->foster_parent->insertBefore($node, $table); + else + $this->foster_parent->appendChild($node); + + $this->foster_parent = null; + } + } + + private function elementInScope($el, $table = false) { + if(is_array($el)) { + foreach($el as $element) { + if($this->elementInScope($element, $table)) { + return true; + } + } + + return false; + } + + $leng = count($this->stack); + + for($n = 0; $n < $leng; $n++) { + /* 1. Initialise node to be the current node (the bottommost node of + the stack). */ + $node = $this->stack[$leng - 1 - $n]; + + if($node->tagName === $el) { + /* 2. If node is the target node, terminate in a match state. */ + return true; + + } elseif($node->tagName === 'table') { + /* 3. Otherwise, if node is a table element, terminate in a failure + state. */ + return false; + + } elseif($table === true && in_array($node->tagName, array('caption', 'td', + 'th', 'button', 'marquee', 'object'))) { + /* 4. Otherwise, if the algorithm is the "has an element in scope" + variant (rather than the "has an element in table scope" variant), + and node is one of the following, terminate in a failure state. */ + return false; + + } elseif($node === $node->ownerDocument->documentElement) { + /* 5. Otherwise, if node is an html element (root element), terminate + in a failure state. (This can only happen if the node is the topmost + node of the stack of open elements, and prevents the next step from + being invoked if there are no more elements in the stack.) */ + return false; + } + + /* Otherwise, set node to the previous entry in the stack of open + elements and return to step 2. (This will never fail, since the loop + will always terminate in the previous step if the top of the stack + is reached.) */ + } + } + + private function reconstructActiveFormattingElements() { + /* 1. If there are no entries in the list of active formatting elements, + then there is nothing to reconstruct; stop this algorithm. */ + $formatting_elements = count($this->a_formatting); + + if($formatting_elements === 0) { + return false; + } + + /* 3. Let entry be the last (most recently added) element in the list + of active formatting elements. */ + $entry = end($this->a_formatting); + + /* 2. If the last (most recently added) entry in the list of active + formatting elements is a marker, or if it is an element that is in the + stack of open elements, then there is nothing to reconstruct; stop this + algorithm. */ + if($entry === self::MARKER || in_array($entry, $this->stack, true)) { + return false; + } + + for($a = $formatting_elements - 1; $a >= 0; true) { + /* 4. If there are no entries before entry in the list of active + formatting elements, then jump to step 8. */ + if($a === 0) { + $step_seven = false; + break; + } + + /* 5. Let entry be the entry one earlier than entry in the list of + active formatting elements. */ + $a--; + $entry = $this->a_formatting[$a]; + + /* 6. If entry is neither a marker nor an element that is also in + thetack of open elements, go to step 4. */ + if($entry === self::MARKER || in_array($entry, $this->stack, true)) { + break; + } + } + + while(true) { + /* 7. Let entry be the element one later than entry in the list of + active formatting elements. */ + if(isset($step_seven) && $step_seven === true) { + $a++; + $entry = $this->a_formatting[$a]; + } + + /* 8. Perform a shallow clone of the element entry to obtain clone. */ + $clone = $entry->cloneNode(); + + /* 9. Append clone to the current node and push it onto the stack + of open elements so that it is the new current node. */ + end($this->stack)->appendChild($clone); + $this->stack[] = $clone; + + /* 10. Replace the entry for entry in the list with an entry for + clone. */ + $this->a_formatting[$a] = $clone; + + /* 11. If the entry for clone in the list of active formatting + elements is not the last entry in the list, return to step 7. */ + if(end($this->a_formatting) !== $clone) { + $step_seven = true; + } else { + break; + } + } + } + + private function clearTheActiveFormattingElementsUpToTheLastMarker() { + /* When the steps below require the UA to clear the list of active + formatting elements up to the last marker, the UA must perform the + following steps: */ + + while(true) { + /* 1. Let entry be the last (most recently added) entry in the list + of active formatting elements. */ + $entry = end($this->a_formatting); + + /* 2. Remove entry from the list of active formatting elements. */ + array_pop($this->a_formatting); + + /* 3. If entry was a marker, then stop the algorithm at this point. + The list has been cleared up to the last marker. */ + if($entry === self::MARKER) { + break; + } + } + } + + private function generateImpliedEndTags($exclude = array()) { + /* When the steps below require the UA to generate implied end tags, + then, if the current node is a dd element, a dt element, an li element, + a p element, a td element, a th element, or a tr element, the UA must + act as if an end tag with the respective tag name had been seen and + then generate implied end tags again. */ + $node = end($this->stack); + $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude); + + while(in_array(end($this->stack)->nodeName, $elements)) { + array_pop($this->stack); + } + } + + private function getElementCategory($node) { + $name = $node->tagName; + if(in_array($name, $this->special)) + return self::SPECIAL; + + elseif(in_array($name, $this->scoping)) + return self::SCOPING; + + elseif(in_array($name, $this->formatting)) + return self::FORMATTING; + + else + return self::PHRASING; + } + + private function clearStackToTableContext($elements) { + /* When the steps above require the UA to clear the stack back to a + table context, it means that the UA must, while the current node is not + a table element or an html element, pop elements from the stack of open + elements. If this causes any elements to be popped from the stack, then + this is a parse error. */ + while(true) { + $node = end($this->stack)->nodeName; + + if(in_array($node, $elements)) { + break; + } else { + array_pop($this->stack); + } + } + } + + private function resetInsertionMode() { + /* 1. Let last be false. */ + $last = false; + $leng = count($this->stack); + + for($n = $leng - 1; $n >= 0; $n--) { + /* 2. Let node be the last node in the stack of open elements. */ + $node = $this->stack[$n]; + + /* 3. If node is the first node in the stack of open elements, then + set last to true. If the element whose innerHTML attribute is being + set is neither a td element nor a th element, then set node to the + element whose innerHTML attribute is being set. (innerHTML case) */ + if($this->stack[0]->isSameNode($node)) { + $last = true; + } + + /* 4. If node is a select element, then switch the insertion mode to + "in select" and abort these steps. (innerHTML case) */ + if($node->nodeName === 'select') { + $this->mode = self::IN_SELECT; + break; + + /* 5. If node is a td or th element, then switch the insertion mode + to "in cell" and abort these steps. */ + } elseif($node->nodeName === 'td' || $node->nodeName === 'th') { + $this->mode = self::IN_CELL; + break; + + /* 6. If node is a tr element, then switch the insertion mode to + "in row" and abort these steps. */ + } elseif($node->nodeName === 'tr') { + $this->mode = self::IN_ROW; + break; + + /* 7. If node is a tbody, thead, or tfoot element, then switch the + insertion mode to "in table body" and abort these steps. */ + } elseif(in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) { + $this->mode = self::IN_TBODY; + break; + + /* 8. If node is a caption element, then switch the insertion mode + to "in caption" and abort these steps. */ + } elseif($node->nodeName === 'caption') { + $this->mode = self::IN_CAPTION; + break; + + /* 9. If node is a colgroup element, then switch the insertion mode + to "in column group" and abort these steps. (innerHTML case) */ + } elseif($node->nodeName === 'colgroup') { + $this->mode = self::IN_CGROUP; + break; + + /* 10. If node is a table element, then switch the insertion mode + to "in table" and abort these steps. */ + } elseif($node->nodeName === 'table') { + $this->mode = self::IN_TABLE; + break; + + /* 11. If node is a head element, then switch the insertion mode + to "in body" ("in body"! not "in head"!) and abort these steps. + (innerHTML case) */ + } elseif($node->nodeName === 'head') { + $this->mode = self::IN_BODY; + break; + + /* 12. If node is a body element, then switch the insertion mode to + "in body" and abort these steps. */ + } elseif($node->nodeName === 'body') { + $this->mode = self::IN_BODY; + break; + + /* 13. If node is a frameset element, then switch the insertion + mode to "in frameset" and abort these steps. (innerHTML case) */ + } elseif($node->nodeName === 'frameset') { + $this->mode = self::IN_FRAME; + break; + + /* 14. If node is an html element, then: if the head element + pointer is null, switch the insertion mode to "before head", + otherwise, switch the insertion mode to "after head". In either + case, abort these steps. (innerHTML case) */ + } elseif($node->nodeName === 'html') { + $this->mode = ($this->head_pointer === null) + ? self::BEFOR_HEAD + : self::AFTER_HEAD; + + break; + + /* 15. If last is true, then set the insertion mode to "in body" + and abort these steps. (innerHTML case) */ + } elseif($last) { + $this->mode = self::IN_BODY; + break; + } + } + } + + private function closeCell() { + /* If the stack of open elements has a td or th element in table scope, + then act as if an end tag token with that tag name had been seen. */ + foreach(array('td', 'th') as $cell) { + if($this->elementInScope($cell, true)) { + $this->inCell(array( + 'name' => $cell, + 'type' => HTML5::ENDTAG + )); + + break; + } + } + } + + public function save() { + return $this->dom; + } +} +?> diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/PercentEncoder.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/PercentEncoder.php new file mode 100644 index 0000000..61c45b1 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/PercentEncoder.php @@ -0,0 +1,97 @@ +preserve[$i] = true; // digits + for ($i = 65; $i <= 90; $i++) $this->preserve[$i] = true; // upper-case + for ($i = 97; $i <= 122; $i++) $this->preserve[$i] = true; // lower-case + $this->preserve[45] = true; // Dash - + $this->preserve[46] = true; // Period . + $this->preserve[95] = true; // Underscore _ + $this->preserve[126]= true; // Tilde ~ + + // extra letters not to escape + if ($preserve !== false) { + for ($i = 0, $c = strlen($preserve); $i < $c; $i++) { + $this->preserve[ord($preserve[$i])] = true; + } + } + } + + /** + * Our replacement for urlencode, it encodes all non-reserved characters, + * as well as any extra characters that were instructed to be preserved. + * @note + * Assumes that the string has already been normalized, making any + * and all percent escape sequences valid. Percents will not be + * re-escaped, regardless of their status in $preserve + * @param $string String to be encoded + * @return Encoded string. + */ + public function encode($string) { + $ret = ''; + for ($i = 0, $c = strlen($string); $i < $c; $i++) { + if ($string[$i] !== '%' && !isset($this->preserve[$int = ord($string[$i])]) ) { + $ret .= '%' . sprintf('%02X', $int); + } else { + $ret .= $string[$i]; + } + } + return $ret; + } + + /** + * Fix up percent-encoding by decoding unreserved characters and normalizing. + * @warning This function is affected by $preserve, even though the + * usual desired behavior is for this not to preserve those + * characters. Be careful when reusing instances of PercentEncoder! + * @param $string String to normalize + */ + public function normalize($string) { + if ($string == '') return ''; + $parts = explode('%', $string); + $ret = array_shift($parts); + foreach ($parts as $part) { + $length = strlen($part); + if ($length < 2) { + $ret .= '%25' . $part; + continue; + } + $encoding = substr($part, 0, 2); + $text = substr($part, 2); + if (!ctype_xdigit($encoding)) { + $ret .= '%25' . $part; + continue; + } + $int = hexdec($encoding); + if (isset($this->preserve[$int])) { + $ret .= chr($int) . $text; + continue; + } + $encoding = strtoupper($encoding); + $ret .= '%' . $encoding . $text; + } + return $ret; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer.php new file mode 100644 index 0000000..f4b69b5 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer.php @@ -0,0 +1,167 @@ +getAll(); + $context = new HTMLPurifier_Context(); + $this->generator = new HTMLPurifier_Generator($config, $context); + } + + /** + * Main function that renders object or aspect of that object + * @note Parameters vary depending on printer + */ + // function render() {} + + /** + * Returns a start tag + * @param $tag Tag name + * @param $attr Attribute array + */ + protected function start($tag, $attr = array()) { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Start($tag, $attr ? $attr : array()) + ); + } + + /** + * Returns an end teg + * @param $tag Tag name + */ + protected function end($tag) { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_End($tag) + ); + } + + /** + * Prints a complete element with content inside + * @param $tag Tag name + * @param $contents Element contents + * @param $attr Tag attributes + * @param $escape Bool whether or not to escape contents + */ + protected function element($tag, $contents, $attr = array(), $escape = true) { + return $this->start($tag, $attr) . + ($escape ? $this->escape($contents) : $contents) . + $this->end($tag); + } + + protected function elementEmpty($tag, $attr = array()) { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Empty($tag, $attr) + ); + } + + protected function text($text) { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Text($text) + ); + } + + /** + * Prints a simple key/value row in a table. + * @param $name Key + * @param $value Value + */ + protected function row($name, $value) { + if (is_bool($value)) $value = $value ? 'On' : 'Off'; + return + $this->start('tr') . "\n" . + $this->element('th', $name) . "\n" . + $this->element('td', $value) . "\n" . + $this->end('tr') + ; + } + + /** + * Escapes a string for HTML output. + * @param $string String to escape + */ + protected function escape($string) { + $string = HTMLPurifier_Encoder::cleanUTF8($string); + $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); + return $string; + } + + /** + * Takes a list of strings and turns them into a single list + * @param $array List of strings + * @param $polite Bool whether or not to add an end before the last + */ + protected function listify($array, $polite = false) { + if (empty($array)) return 'None'; + $ret = ''; + $i = count($array); + foreach ($array as $value) { + $i--; + $ret .= $value; + if ($i > 0 && !($polite && $i == 1)) $ret .= ', '; + if ($polite && $i == 1) $ret .= 'and '; + } + return $ret; + } + + /** + * Retrieves the class of an object without prefixes, as well as metadata + * @param $obj Object to determine class of + * @param $prefix Further prefix to remove + */ + protected function getClass($obj, $sec_prefix = '') { + static $five = null; + if ($five === null) $five = version_compare(PHP_VERSION, '5', '>='); + $prefix = 'HTMLPurifier_' . $sec_prefix; + if (!$five) $prefix = strtolower($prefix); + $class = str_replace($prefix, '', get_class($obj)); + $lclass = strtolower($class); + $class .= '('; + switch ($lclass) { + case 'enum': + $values = array(); + foreach ($obj->valid_values as $value => $bool) { + $values[] = $value; + } + $class .= implode(', ', $values); + break; + case 'css_composite': + $values = array(); + foreach ($obj->defs as $def) { + $values[] = $this->getClass($def, $sec_prefix); + } + $class .= implode(', ', $values); + break; + case 'css_multiple': + $class .= $this->getClass($obj->single, $sec_prefix) . ', '; + $class .= $obj->max; + break; + } + $class .= ')'; + return $class; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/CSSDefinition.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/CSSDefinition.php new file mode 100644 index 0000000..ebdbdec --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/CSSDefinition.php @@ -0,0 +1,37 @@ +def = $config->getCSSDefinition(); + $ret = ''; + + $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); + $ret .= $this->start('table'); + + $ret .= $this->element('caption', 'Properties ($info)'); + + $ret .= $this->start('thead'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Property', array('class' => 'heavy')); + $ret .= $this->element('th', 'Definition', array('class' => 'heavy', 'style' => 'width:auto;')); + $ret .= $this->end('tr'); + $ret .= $this->end('thead'); + + ksort($this->def->info); + foreach ($this->def->info as $property => $obj) { + $name = $this->getClass($obj, 'AttrDef_'); + $ret .= $this->row($property, $name); + } + + $ret .= $this->end('table'); + $ret .= $this->end('div'); + + return $ret; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.css b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.css new file mode 100644 index 0000000..a37396a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.css @@ -0,0 +1,8 @@ + +.hp-config {} + +.hp-config tbody th {text-align:right; padding-right:0.5em;} +.hp-config thead, .hp-config .namespace {background:#3C578C; color:#FFF;} +.hp-config .namespace th {text-align:center;} +.hp-config .verbose {display:none;} +.hp-config .controls {text-align:center;} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.js b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.js new file mode 100644 index 0000000..41932b8 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.js @@ -0,0 +1,3 @@ +function toggleWriteability(id_of_patient, checked) { + document.getElementById(id_of_patient).disabled = checked; +} \ No newline at end of file diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.php new file mode 100644 index 0000000..c6876fe --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/ConfigForm.php @@ -0,0 +1,367 @@ +docURL = $doc_url; + $this->name = $name; + $this->compress = $compress; + // initialize sub-printers + $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default(); + $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool(); + } + + /** + * Sets default column and row size for textareas in sub-printers + * @param $cols Integer columns of textarea, null to use default + * @param $rows Integer rows of textarea, null to use default + */ + public function setTextareaDimensions($cols = null, $rows = null) { + if ($cols) $this->fields['default']->cols = $cols; + if ($rows) $this->fields['default']->rows = $rows; + } + + /** + * Retrieves styling, in case it is not accessible by webserver + */ + public static function getCSS() { + return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css'); + } + + /** + * Retrieves JavaScript, in case it is not accessible by webserver + */ + public static function getJavaScript() { + return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js'); + } + + /** + * Returns HTML output for a configuration form + * @param $config Configuration object of current form state, or an array + * where [0] has an HTML namespace and [1] is being rendered. + * @param $allowed Optional namespace(s) and directives to restrict form to. + */ + public function render($config, $allowed = true, $render_controls = true) { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + + $this->config = $config; + $this->genConfig = $gen_config; + $this->prepareGenerator($gen_config); + + $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def); + $all = array(); + foreach ($allowed as $key) { + list($ns, $directive) = $key; + $all[$ns][$directive] = $config->get($ns, $directive); + } + + $ret = ''; + $ret .= $this->start('table', array('class' => 'hp-config')); + $ret .= $this->start('thead'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive')); + $ret .= $this->element('th', 'Value', array('class' => 'hp-value')); + $ret .= $this->end('tr'); + $ret .= $this->end('thead'); + foreach ($all as $ns => $directives) { + $ret .= $this->renderNamespace($ns, $directives); + } + if ($render_controls) { + $ret .= $this->start('tbody'); + $ret .= $this->start('tr'); + $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls')); + $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit')); + $ret .= '[Reset]'; + $ret .= $this->end('td'); + $ret .= $this->end('tr'); + $ret .= $this->end('tbody'); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders a single namespace + * @param $ns String namespace name + * @param $directive Associative array of directives to values + */ + protected function renderNamespace($ns, $directives) { + $ret = ''; + $ret .= $this->start('tbody', array('class' => 'namespace')); + $ret .= $this->start('tr'); + $ret .= $this->element('th', $ns, array('colspan' => 2)); + $ret .= $this->end('tr'); + $ret .= $this->end('tbody'); + $ret .= $this->start('tbody'); + foreach ($directives as $directive => $value) { + $ret .= $this->start('tr'); + $ret .= $this->start('th'); + if ($this->docURL) { + $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL); + $ret .= $this->start('a', array('href' => $url)); + } + $attr = array('for' => "{$this->name}:$ns.$directive"); + + // crop directive name if it's too long + if (!$this->compress || (strlen($directive) < $this->compress)) { + $directive_disp = $directive; + } else { + $directive_disp = substr($directive, 0, $this->compress - 2) . '...'; + $attr['title'] = $directive; + } + + $ret .= $this->element( + 'label', + $directive_disp, + // component printers must create an element with this id + $attr + ); + if ($this->docURL) $ret .= $this->end('a'); + $ret .= $this->end('th'); + + $ret .= $this->start('td'); + $def = $this->config->def->info[$ns][$directive]; + if (is_int($def)) { + $allow_null = $def < 0; + $type = abs($def); + } else { + $type = $def->type; + $allow_null = isset($def->allow_null); + } + if (!isset($this->fields[$type])) $type = 0; // default + $type_obj = $this->fields[$type]; + if ($allow_null) { + $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj); + } + $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config)); + $ret .= $this->end('td'); + $ret .= $this->end('tr'); + } + $ret .= $this->end('tbody'); + return $ret; + } + +} + +/** + * Printer decorator for directives that accept null + */ +class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer { + /** + * Printer being decorated + */ + protected $obj; + /** + * @param $obj Printer to decorate + */ + public function __construct($obj) { + parent::__construct(); + $this->obj = $obj; + } + public function render($ns, $directive, $value, $name, $config) { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + + $ret = ''; + $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' Null/Disabled'); + $ret .= $this->end('label'); + $attr = array( + 'type' => 'checkbox', + 'value' => '1', + 'class' => 'null-toggle', + 'name' => "$name"."[Null_$ns.$directive]", + 'id' => "$name:Null_$ns.$directive", + 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!! + ); + if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) { + // modify inline javascript slightly + $attr['onclick'] = "toggleWriteability('$name:Yes_$ns.$directive',checked);toggleWriteability('$name:No_$ns.$directive',checked)"; + } + if ($value === null) $attr['checked'] = 'checked'; + $ret .= $this->elementEmpty('input', $attr); + $ret .= $this->text(' or '); + $ret .= $this->elementEmpty('br'); + $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config)); + return $ret; + } +} + +/** + * Swiss-army knife configuration form field printer + */ +class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer { + public $cols = 18; + public $rows = 5; + public function render($ns, $directive, $value, $name, $config) { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + // this should probably be split up a little + $ret = ''; + $def = $config->def->info[$ns][$directive]; + if (is_int($def)) { + $type = abs($def); + } else { + $type = $def->type; + } + if (is_array($value)) { + switch ($type) { + case HTMLPurifier_VarParser::LOOKUP: + $array = $value; + $value = array(); + foreach ($array as $val => $b) { + $value[] = $val; + } + case HTMLPurifier_VarParser::ALIST: + $value = implode(PHP_EOL, $value); + break; + case HTMLPurifier_VarParser::HASH: + $nvalue = ''; + foreach ($value as $i => $v) { + $nvalue .= "$i:$v" . PHP_EOL; + } + $value = $nvalue; + break; + default: + $value = ''; + } + } + if ($type === HTMLPurifier_VarParser::MIXED) { + return 'Not supported'; + $value = serialize($value); + } + $attr = array( + 'name' => "$name"."[$ns.$directive]", + 'id' => "$name:$ns.$directive" + ); + if ($value === null) $attr['disabled'] = 'disabled'; + if (isset($def->allowed)) { + $ret .= $this->start('select', $attr); + foreach ($def->allowed as $val => $b) { + $attr = array(); + if ($value == $val) $attr['selected'] = 'selected'; + $ret .= $this->element('option', $val, $attr); + } + $ret .= $this->end('select'); + } elseif ( + $type === HTMLPurifier_VarParser::TEXT || + $type === HTMLPurifier_VarParser::ITEXT || + $type === HTMLPurifier_VarParser::ALIST || + $type === HTMLPurifier_VarParser::HASH || + $type === HTMLPurifier_VarParser::LOOKUP + ) { + $attr['cols'] = $this->cols; + $attr['rows'] = $this->rows; + $ret .= $this->start('textarea', $attr); + $ret .= $this->text($value); + $ret .= $this->end('textarea'); + } else { + $attr['value'] = $value; + $attr['type'] = 'text'; + $ret .= $this->elementEmpty('input', $attr); + } + return $ret; + } +} + +/** + * Bool form field printer + */ +class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer { + public function render($ns, $directive, $value, $name, $config) { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + $ret = ''; + $ret .= $this->start('div', array('id' => "$name:$ns.$directive")); + + $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' Yes'); + $ret .= $this->end('label'); + + $attr = array( + 'type' => 'radio', + 'name' => "$name"."[$ns.$directive]", + 'id' => "$name:Yes_$ns.$directive", + 'value' => '1' + ); + if ($value === true) $attr['checked'] = 'checked'; + if ($value === null) $attr['disabled'] = 'disabled'; + $ret .= $this->elementEmpty('input', $attr); + + $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' No'); + $ret .= $this->end('label'); + + $attr = array( + 'type' => 'radio', + 'name' => "$name"."[$ns.$directive]", + 'id' => "$name:No_$ns.$directive", + 'value' => '0' + ); + if ($value === false) $attr['checked'] = 'checked'; + if ($value === null) $attr['disabled'] = 'disabled'; + $ret .= $this->elementEmpty('input', $attr); + + $ret .= $this->end('div'); + + return $ret; + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/HTMLDefinition.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/HTMLDefinition.php new file mode 100644 index 0000000..a6b5dc5 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Printer/HTMLDefinition.php @@ -0,0 +1,271 @@ +config =& $config; + + $this->def = $config->getHTMLDefinition(); + + $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); + + $ret .= $this->renderDoctype(); + $ret .= $this->renderEnvironment(); + $ret .= $this->renderContentSets(); + $ret .= $this->renderInfo(); + + $ret .= $this->end('div'); + + return $ret; + } + + /** + * Renders the Doctype table + */ + protected function renderDoctype() { + $doctype = $this->def->doctype; + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Doctype'); + $ret .= $this->row('Name', $doctype->name); + $ret .= $this->row('XML', $doctype->xml ? 'Yes' : 'No'); + $ret .= $this->row('Default Modules', implode($doctype->modules, ', ')); + $ret .= $this->row('Default Tidy Modules', implode($doctype->tidyModules, ', ')); + $ret .= $this->end('table'); + return $ret; + } + + + /** + * Renders environment table, which is miscellaneous info + */ + protected function renderEnvironment() { + $def = $this->def; + + $ret = ''; + + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Environment'); + + $ret .= $this->row('Parent of fragment', $def->info_parent); + $ret .= $this->renderChildren($def->info_parent_def->child); + $ret .= $this->row('Block wrap name', $def->info_block_wrapper); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Global attributes'); + $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr),0,0); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Tag transforms'); + $list = array(); + foreach ($def->info_tag_transform as $old => $new) { + $new = $this->getClass($new, 'TagTransform_'); + $list[] = "<$old> with $new"; + } + $ret .= $this->element('td', $this->listify($list)); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Pre-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre)); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Post-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post)); + $ret .= $this->end('tr'); + + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders the Content Sets table + */ + protected function renderContentSets() { + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Content Sets'); + foreach ($this->def->info_content_sets as $name => $lookup) { + $ret .= $this->heavyHeader($name); + $ret .= $this->start('tr'); + $ret .= $this->element('td', $this->listifyTagLookup($lookup)); + $ret .= $this->end('tr'); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders the Elements ($info) table + */ + protected function renderInfo() { + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Elements ($info)'); + ksort($this->def->info); + $ret .= $this->heavyHeader('Allowed tags', 2); + $ret .= $this->start('tr'); + $ret .= $this->element('td', $this->listifyTagLookup($this->def->info), array('colspan' => 2)); + $ret .= $this->end('tr'); + foreach ($this->def->info as $name => $def) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', "<$name>", array('class'=>'heavy', 'colspan' => 2)); + $ret .= $this->end('tr'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Inline content'); + $ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No'); + $ret .= $this->end('tr'); + if (!empty($def->excludes)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Excludes'); + $ret .= $this->element('td', $this->listifyTagLookup($def->excludes)); + $ret .= $this->end('tr'); + } + if (!empty($def->attr_transform_pre)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Pre-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre)); + $ret .= $this->end('tr'); + } + if (!empty($def->attr_transform_post)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Post-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post)); + $ret .= $this->end('tr'); + } + if (!empty($def->auto_close)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Auto closed by'); + $ret .= $this->element('td', $this->listifyTagLookup($def->auto_close)); + $ret .= $this->end('tr'); + } + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Allowed attributes'); + $ret .= $this->element('td',$this->listifyAttr($def->attr), array(), 0); + $ret .= $this->end('tr'); + + if (!empty($def->required_attr)) { + $ret .= $this->row('Required attributes', $this->listify($def->required_attr)); + } + + $ret .= $this->renderChildren($def->child); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders a row describing the allowed children of an element + * @param $def HTMLPurifier_ChildDef of pertinent element + */ + protected function renderChildren($def) { + $context = new HTMLPurifier_Context(); + $ret = ''; + $ret .= $this->start('tr'); + $elements = array(); + $attr = array(); + if (isset($def->elements)) { + if ($def->type == 'strictblockquote') { + $def->validateChildren(array(), $this->config, $context); + } + $elements = $def->elements; + } + if ($def->type == 'chameleon') { + $attr['rowspan'] = 2; + } elseif ($def->type == 'empty') { + $elements = array(); + } elseif ($def->type == 'table') { + $elements = array_flip(array('col', 'caption', 'colgroup', 'thead', + 'tfoot', 'tbody', 'tr')); + } + $ret .= $this->element('th', 'Allowed children', $attr); + + if ($def->type == 'chameleon') { + + $ret .= $this->element('td', + 'Block: ' . + $this->escape($this->listifyTagLookup($def->block->elements)),0,0); + $ret .= $this->end('tr'); + $ret .= $this->start('tr'); + $ret .= $this->element('td', + 'Inline: ' . + $this->escape($this->listifyTagLookup($def->inline->elements)),0,0); + + } elseif ($def->type == 'custom') { + + $ret .= $this->element('td', ''.ucfirst($def->type).': ' . + $def->dtd_regex); + + } else { + $ret .= $this->element('td', + ''.ucfirst($def->type).': ' . + $this->escape($this->listifyTagLookup($elements)),0,0); + } + $ret .= $this->end('tr'); + return $ret; + } + + /** + * Listifies a tag lookup table. + * @param $array Tag lookup array in form of array('tagname' => true) + */ + protected function listifyTagLookup($array) { + ksort($array); + $list = array(); + foreach ($array as $name => $discard) { + if ($name !== '#PCDATA' && !isset($this->def->info[$name])) continue; + $list[] = $name; + } + return $this->listify($list); + } + + /** + * Listifies a list of objects by retrieving class names and internal state + * @param $array List of objects + * @todo Also add information about internal state + */ + protected function listifyObjectList($array) { + ksort($array); + $list = array(); + foreach ($array as $discard => $obj) { + $list[] = $this->getClass($obj, 'AttrTransform_'); + } + return $this->listify($list); + } + + /** + * Listifies a hash of attributes to AttrDef classes + * @param $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef) + */ + protected function listifyAttr($array) { + ksort($array); + $list = array(); + foreach ($array as $name => $obj) { + if ($obj === false) continue; + $list[] = "$name = " . $this->getClass($obj, 'AttrDef_') . ''; + } + return $this->listify($list); + } + + /** + * Creates a heavy header row + */ + protected function heavyHeader($text, $num = 1) { + $ret = ''; + $ret .= $this->start('tr'); + $ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy')); + $ret .= $this->end('tr'); + return $ret; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy.php new file mode 100644 index 0000000..6b5530b --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy.php @@ -0,0 +1,25 @@ +strategies as $strategy) { + $tokens = $strategy->execute($tokens, $config, $context); + } + return $tokens; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/Core.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/Core.php new file mode 100644 index 0000000..8cb08da --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/Core.php @@ -0,0 +1,17 @@ +strategies[] = new HTMLPurifier_Strategy_RemoveForeignElements(); + $this->strategies[] = new HTMLPurifier_Strategy_MakeWellFormed(); + $this->strategies[] = new HTMLPurifier_Strategy_FixNesting(); + $this->strategies[] = new HTMLPurifier_Strategy_ValidateAttributes(); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/FixNesting.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/FixNesting.php new file mode 100644 index 0000000..f36a41b --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/FixNesting.php @@ -0,0 +1,328 @@ +getHTMLDefinition(); + + // insert implicit "parent" node, will be removed at end. + // DEFINITION CALL + $parent_name = $definition->info_parent; + array_unshift($tokens, new HTMLPurifier_Token_Start($parent_name)); + $tokens[] = new HTMLPurifier_Token_End($parent_name); + + // setup the context variable 'IsInline', for chameleon processing + // is 'false' when we are not inline, 'true' when it must always + // be inline, and an integer when it is inline for a certain + // branch of the document tree + $is_inline = $definition->info_parent_def->descendants_are_inline; + $context->register('IsInline', $is_inline); + + // setup error collector + $e =& $context->get('ErrorCollector', true); + + //####################################################################// + // Loop initialization + + // stack that contains the indexes of all parents, + // $stack[count($stack)-1] being the current parent + $stack = array(); + + // stack that contains all elements that are excluded + // it is organized by parent elements, similar to $stack, + // but it is only populated when an element with exclusions is + // processed, i.e. there won't be empty exclusions. + $exclude_stack = array(); + + // variable that contains the start token while we are processing + // nodes. This enables error reporting to do its job + $start_token = false; + $context->register('CurrentToken', $start_token); + + //####################################################################// + // Loop + + // iterate through all start nodes. Determining the start node + // is complicated so it has been omitted from the loop construct + for ($i = 0, $size = count($tokens) ; $i < $size; ) { + + //################################################################// + // Gather information on children + + // child token accumulator + $child_tokens = array(); + + // scroll to the end of this node, report number, and collect + // all children + for ($j = $i, $depth = 0; ; $j++) { + if ($tokens[$j] instanceof HTMLPurifier_Token_Start) { + $depth++; + // skip token assignment on first iteration, this is the + // token we currently are on + if ($depth == 1) continue; + } elseif ($tokens[$j] instanceof HTMLPurifier_Token_End) { + $depth--; + // skip token assignment on last iteration, this is the + // end token of the token we're currently on + if ($depth == 0) break; + } + $child_tokens[] = $tokens[$j]; + } + + // $i is index of start token + // $j is index of end token + + $start_token = $tokens[$i]; // to make token available via CurrentToken + + //################################################################// + // Gather information on parent + + // calculate parent information + if ($count = count($stack)) { + $parent_index = $stack[$count-1]; + $parent_name = $tokens[$parent_index]->name; + if ($parent_index == 0) { + $parent_def = $definition->info_parent_def; + } else { + $parent_def = $definition->info[$parent_name]; + } + } else { + // processing as if the parent were the "root" node + // unknown info, it won't be used anyway, in the future, + // we may want to enforce one element only (this is + // necessary for HTML Purifier to clean entire documents + $parent_index = $parent_name = $parent_def = null; + } + + // calculate context + if ($is_inline === false) { + // check if conditions make it inline + if (!empty($parent_def) && $parent_def->descendants_are_inline) { + $is_inline = $count - 1; + } + } else { + // check if we're out of inline + if ($count === $is_inline) { + $is_inline = false; + } + } + + //################################################################// + // Determine whether element is explicitly excluded SGML-style + + // determine whether or not element is excluded by checking all + // parent exclusions. The array should not be very large, two + // elements at most. + $excluded = false; + if (!empty($exclude_stack)) { + foreach ($exclude_stack as $lookup) { + if (isset($lookup[$tokens[$i]->name])) { + $excluded = true; + // no need to continue processing + break; + } + } + } + + //################################################################// + // Perform child validation + + if ($excluded) { + // there is an exclusion, remove the entire node + $result = false; + $excludes = array(); // not used, but good to initialize anyway + } else { + // DEFINITION CALL + if ($i === 0) { + // special processing for the first node + $def = $definition->info_parent_def; + } else { + $def = $definition->info[$tokens[$i]->name]; + + } + + if (!empty($def->child)) { + // have DTD child def validate children + $result = $def->child->validateChildren( + $child_tokens, $config, $context); + } else { + // weird, no child definition, get rid of everything + $result = false; + } + + // determine whether or not this element has any exclusions + $excludes = $def->excludes; + } + + // $result is now a bool or array + + //################################################################// + // Process result by interpreting $result + + if ($result === true || $child_tokens === $result) { + // leave the node as is + + // register start token as a parental node start + $stack[] = $i; + + // register exclusions if there are any + if (!empty($excludes)) $exclude_stack[] = $excludes; + + // move cursor to next possible start node + $i++; + + } elseif($result === false) { + // remove entire node + + if ($e) { + if ($excluded) { + $e->send(E_ERROR, 'Strategy_FixNesting: Node excluded'); + } else { + $e->send(E_ERROR, 'Strategy_FixNesting: Node removed'); + } + } + + // calculate length of inner tokens and current tokens + $length = $j - $i + 1; + + // perform removal + array_splice($tokens, $i, $length); + + // update size + $size -= $length; + + // there is no start token to register, + // current node is now the next possible start node + // unless it turns out that we need to do a double-check + + // this is a rought heuristic that covers 100% of HTML's + // cases and 99% of all other cases. A child definition + // that would be tricked by this would be something like: + // ( | a b c) where it's all or nothing. Fortunately, + // our current implementation claims that that case would + // not allow empty, even if it did + if (!$parent_def->child->allow_empty) { + // we need to do a double-check + $i = $parent_index; + array_pop($stack); + } + + // PROJECTED OPTIMIZATION: Process all children elements before + // reprocessing parent node. + + } else { + // replace node with $result + + // calculate length of inner tokens + $length = $j - $i - 1; + + if ($e) { + if (empty($result) && $length) { + $e->send(E_ERROR, 'Strategy_FixNesting: Node contents removed'); + } else { + $e->send(E_WARNING, 'Strategy_FixNesting: Node reorganized'); + } + } + + // perform replacement + array_splice($tokens, $i + 1, $length, $result); + + // update size + $size -= $length; + $size += count($result); + + // register start token as a parental node start + $stack[] = $i; + + // register exclusions if there are any + if (!empty($excludes)) $exclude_stack[] = $excludes; + + // move cursor to next possible start node + $i++; + + } + + //################################################################// + // Scroll to next start node + + // We assume, at this point, that $i is the index of the token + // that is the first possible new start point for a node. + + // Test if the token indeed is a start tag, if not, move forward + // and test again. + $size = count($tokens); + while ($i < $size and !$tokens[$i] instanceof HTMLPurifier_Token_Start) { + if ($tokens[$i] instanceof HTMLPurifier_Token_End) { + // pop a token index off the stack if we ended a node + array_pop($stack); + // pop an exclusion lookup off exclusion stack if + // we ended node and that node had exclusions + if ($i == 0 || $i == $size - 1) { + // use specialized var if it's the super-parent + $s_excludes = $definition->info_parent_def->excludes; + } else { + $s_excludes = $definition->info[$tokens[$i]->name]->excludes; + } + if ($s_excludes) { + array_pop($exclude_stack); + } + } + $i++; + } + + } + + //####################################################################// + // Post-processing + + // remove implicit parent tokens at the beginning and end + array_shift($tokens); + array_pop($tokens); + + // remove context variables + $context->destroy('IsInline'); + $context->destroy('CurrentToken'); + + //####################################################################// + // Return + + return $tokens; + + } + +} + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/MakeWellFormed.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/MakeWellFormed.php new file mode 100644 index 0000000..be32655 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/MakeWellFormed.php @@ -0,0 +1,431 @@ +getHTMLDefinition(); + + // local variables + $generator = new HTMLPurifier_Generator($config, $context); + $escape_invalid_tags = $config->get('Core', 'EscapeInvalidTags'); + $e = $context->get('ErrorCollector', true); + $t = false; // token index + $i = false; // injector index + $token = false; // the current token + $reprocess = false; // whether or not to reprocess the same token + $stack = array(); + + // member variables + $this->stack =& $stack; + $this->t =& $t; + $this->tokens =& $tokens; + $this->config = $config; + $this->context = $context; + + // context variables + $context->register('CurrentNesting', $stack); + $context->register('InputIndex', $t); + $context->register('InputTokens', $tokens); + $context->register('CurrentToken', $token); + + // -- begin INJECTOR -- + + $this->injectors = array(); + + $injectors = $config->getBatch('AutoFormat'); + $def_injectors = $definition->info_injector; + $custom_injectors = $injectors['Custom']; + unset($injectors['Custom']); // special case + foreach ($injectors as $injector => $b) { + $injector = "HTMLPurifier_Injector_$injector"; + if (!$b) continue; + $this->injectors[] = new $injector; + } + foreach ($def_injectors as $injector) { + // assumed to be objects + $this->injectors[] = $injector; + } + foreach ($custom_injectors as $injector) { + if (is_string($injector)) { + $injector = "HTMLPurifier_Injector_$injector"; + $injector = new $injector; + } + $this->injectors[] = $injector; + } + + // give the injectors references to the definition and context + // variables for performance reasons + foreach ($this->injectors as $ix => $injector) { + $error = $injector->prepare($config, $context); + if (!$error) continue; + array_splice($this->injectors, $ix, 1); // rm the injector + trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING); + } + + // -- end INJECTOR -- + + // a note on punting: + // In order to reduce code duplication, whenever some code needs + // to make HTML changes in order to make things "correct", the + // new HTML gets sent through the purifier, regardless of its + // status. This means that if we add a start token, because it + // was totally necessary, we don't have to update nesting; we just + // punt ($reprocess = true; continue;) and it does that for us. + + // isset is in loop because $tokens size changes during loop exec + for ( + $t = 0; + $t == 0 || isset($tokens[$t - 1]); + // only increment if we don't need to reprocess + $reprocess ? $reprocess = false : $t++ + ) { + + // check for a rewind + if (is_int($i) && $i >= 0) { + // possibility: disable rewinding if the current token has a + // rewind set on it already. This would offer protection from + // infinite loop, but might hinder some advanced rewinding. + $rewind_to = $this->injectors[$i]->getRewind(); + if (is_int($rewind_to) && $rewind_to < $t) { + if ($rewind_to < 0) $rewind_to = 0; + while ($t > $rewind_to) { + $t--; + $prev = $tokens[$t]; + // indicate that other injectors should not process this token, + // but we need to reprocess it + unset($prev->skip[$i]); + $prev->rewind = $i; + if ($prev instanceof HTMLPurifier_Token_Start) array_pop($this->stack); + elseif ($prev instanceof HTMLPurifier_Token_End) $this->stack[] = $prev->start; + } + } + $i = false; + } + + // handle case of document end + if (!isset($tokens[$t])) { + // kill processing if stack is empty + if (empty($this->stack)) break; + + // peek + $top_nesting = array_pop($this->stack); + $this->stack[] = $top_nesting; + + // send error + if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) { + $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting); + } + + // append, don't splice, since this is the end + $tokens[] = new HTMLPurifier_Token_End($top_nesting->name); + + // punt! + $reprocess = true; + continue; + } + + // if all goes well, this token will be passed through unharmed + $token = $tokens[$t]; + + //echo '
      '; + //printTokens($tokens, $t); + //var_dump($this->stack); + + // quick-check: if it's not a tag, no need to process + if (empty($token->is_tag)) { + if ($token instanceof HTMLPurifier_Token_Text) { + foreach ($this->injectors as $i => $injector) { + if (isset($token->skip[$i])) continue; + if ($token->rewind !== null && $token->rewind !== $i) continue; + $injector->handleText($token); + $this->processToken($token, $i); + $reprocess = true; + break; + } + } + // another possibility is a comment + continue; + } + + if (isset($definition->info[$token->name])) { + $type = $definition->info[$token->name]->child->type; + } else { + $type = false; // Type is unknown, treat accordingly + } + + // quick tag checks: anything that's *not* an end tag + $ok = false; + if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) { + // claims to be a start tag but is empty + $token = new HTMLPurifier_Token_Empty($token->name, $token->attr); + $ok = true; + } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) { + // claims to be empty but really is a start tag + $this->swap(new HTMLPurifier_Token_End($token->name)); + $this->insertBefore(new HTMLPurifier_Token_Start($token->name, $token->attr)); + // punt (since we had to modify the input stream in a non-trivial way) + $reprocess = true; + continue; + } elseif ($token instanceof HTMLPurifier_Token_Empty) { + // real empty token + $ok = true; + } elseif ($token instanceof HTMLPurifier_Token_Start) { + // start tag + + // ...unless they also have to close their parent + if (!empty($this->stack)) { + + $parent = array_pop($this->stack); + $this->stack[] = $parent; + + if (isset($definition->info[$parent->name])) { + $elements = $definition->info[$parent->name]->child->getNonAutoCloseElements($config); + $autoclose = !isset($elements[$token->name]); + } else { + $autoclose = false; + } + + if ($autoclose) { + if ($e) $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent); + // insert parent end tag before this tag + $new_token = new HTMLPurifier_Token_End($parent->name); + $new_token->start = $parent; + $this->insertBefore($new_token); + $reprocess = true; + continue; + } + + } + $ok = true; + } + + if ($ok) { + foreach ($this->injectors as $i => $injector) { + if (isset($token->skip[$i])) continue; + if ($token->rewind !== null && $token->rewind !== $i) continue; + $injector->handleElement($token); + $this->processToken($token, $i); + $reprocess = true; + break; + } + if (!$reprocess) { + // ah, nothing interesting happened; do normal processing + $this->swap($token); + if ($token instanceof HTMLPurifier_Token_Start) { + $this->stack[] = $token; + } elseif ($token instanceof HTMLPurifier_Token_End) { + throw new HTMLPurifier_Exception('Improper handling of end tag in start code; possible error in MakeWellFormed'); + } + } + continue; + } + + // sanity check: we should be dealing with a closing tag + if (!$token instanceof HTMLPurifier_Token_End) { + throw new HTMLPurifier_Exception('Unaccounted for tag token in input stream, bug in HTML Purifier'); + } + + // make sure that we have something open + if (empty($this->stack)) { + if ($escape_invalid_tags) { + if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text'); + $this->swap(new HTMLPurifier_Token_Text( + $generator->generateFromToken($token) + )); + } else { + $this->remove(); + if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed'); + } + $reprocess = true; + continue; + } + + // first, check for the simplest case: everything closes neatly. + // Eventually, everything passes through here; if there are problems + // we modify the input stream accordingly and then punt, so that + // the tokens get processed again. + $current_parent = array_pop($this->stack); + if ($current_parent->name == $token->name) { + $token->start = $current_parent; + foreach ($this->injectors as $i => $injector) { + if (isset($token->skip[$i])) continue; + if ($token->rewind !== null && $token->rewind !== $i) continue; + $injector->handleEnd($token); + $this->processToken($token, $i); + $this->stack[] = $current_parent; + $reprocess = true; + break; + } + continue; + } + + // okay, so we're trying to close the wrong tag + + // undo the pop previous pop + $this->stack[] = $current_parent; + + // scroll back the entire nest, trying to find our tag. + // (feature could be to specify how far you'd like to go) + $size = count($this->stack); + // -2 because -1 is the last element, but we already checked that + $skipped_tags = false; + for ($j = $size - 2; $j >= 0; $j--) { + if ($this->stack[$j]->name == $token->name) { + $skipped_tags = array_slice($this->stack, $j); + break; + } + } + + // we didn't find the tag, so remove + if ($skipped_tags === false) { + if ($escape_invalid_tags) { + $this->swap(new HTMLPurifier_Token_Text( + $generator->generateFromToken($token) + )); + if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text'); + } else { + $this->remove(); + if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed'); + } + $reprocess = true; + continue; + } + + // do errors, in REVERSE $j order: a,b,c with
      + $c = count($skipped_tags); + if ($e) { + for ($j = $c - 1; $j > 0; $j--) { + // notice we exclude $j == 0, i.e. the current ending tag, from + // the errors... + if (!isset($skipped_tags[$j]->armor['MakeWellFormed_TagClosedError'])) { + $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$j]); + } + } + } + + // insert tags, in FORWARD $j order: c,b,a with
      + for ($j = 1; $j < $c; $j++) { + // ...as well as from the insertions + $new_token = new HTMLPurifier_Token_End($skipped_tags[$j]->name); + $new_token->start = $skipped_tags[$j]; + $this->insertBefore($new_token); + } + $reprocess = true; + continue; + } + + $context->destroy('CurrentNesting'); + $context->destroy('InputTokens'); + $context->destroy('InputIndex'); + $context->destroy('CurrentToken'); + + unset($this->injectors, $this->stack, $this->tokens, $this->t); + return $tokens; + } + + /** + * Processes arbitrary token values for complicated substitution patterns. + * In general: + * + * If $token is an array, it is a list of tokens to substitute for the + * current token. These tokens then get individually processed. If there + * is a leading integer in the list, that integer determines how many + * tokens from the stream should be removed. + * + * If $token is a regular token, it is swapped with the current token. + * + * If $token is false, the current token is deleted. + * + * If $token is an integer, that number of tokens (with the first token + * being the current one) will be deleted. + * + * @param $token Token substitution value + * @param $injector Injector that performed the substitution; default is if + * this is not an injector related operation. + */ + protected function processToken($token, $injector = -1) { + + // normalize forms of token + if (is_object($token)) $token = array(1, $token); + if (is_int($token)) $token = array($token); + if ($token === false) $token = array(1); + if (!is_array($token)) throw new HTMLPurifier_Exception('Invalid token type from injector'); + if (!is_int($token[0])) array_unshift($token, 1); + if ($token[0] === 0) throw new HTMLPurifier_Exception('Deleting zero tokens is not valid'); + + // $token is now an array with the following form: + // array(number nodes to delete, new node 1, new node 2, ...) + + $delete = array_shift($token); + $old = array_splice($this->tokens, $this->t, $delete, $token); + + if ($injector > -1) { + // determine appropriate skips + $oldskip = isset($old[0]) ? $old[0]->skip : array(); + foreach ($token as $object) { + $object->skip = $oldskip; + $object->skip[$injector] = true; + } + } + + } + + /** + * Inserts a token before the current token. Cursor now points to this token + */ + private function insertBefore($token) { + array_splice($this->tokens, $this->t, 0, array($token)); + } + + /** + * Removes current token. Cursor now points to new token occupying previously + * occupied space. + */ + private function remove() { + array_splice($this->tokens, $this->t, 1); + } + + /** + * Swap current token with new token. Cursor points to new token (no change). + */ + private function swap($token) { + $this->tokens[$this->t] = $token; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/RemoveForeignElements.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/RemoveForeignElements.php new file mode 100644 index 0000000..7be86ad --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/RemoveForeignElements.php @@ -0,0 +1,170 @@ +getHTMLDefinition(); + $generator = new HTMLPurifier_Generator($config, $context); + $result = array(); + + $escape_invalid_tags = $config->get('Core', 'EscapeInvalidTags'); + $remove_invalid_img = $config->get('Core', 'RemoveInvalidImg'); + + // currently only used to determine if comments should be kept + $trusted = $config->get('HTML', 'Trusted'); + + $remove_script_contents = $config->get('Core', 'RemoveScriptContents'); + $hidden_elements = $config->get('Core', 'HiddenElements'); + + // remove script contents compatibility + if ($remove_script_contents === true) { + $hidden_elements['script'] = true; + } elseif ($remove_script_contents === false && isset($hidden_elements['script'])) { + unset($hidden_elements['script']); + } + + $attr_validator = new HTMLPurifier_AttrValidator(); + + // removes tokens until it reaches a closing tag with its value + $remove_until = false; + + // converts comments into text tokens when this is equal to a tag name + $textify_comments = false; + + $token = false; + $context->register('CurrentToken', $token); + + $e = false; + if ($config->get('Core', 'CollectErrors')) { + $e =& $context->get('ErrorCollector'); + } + + foreach($tokens as $token) { + if ($remove_until) { + if (empty($token->is_tag) || $token->name !== $remove_until) { + continue; + } + } + if (!empty( $token->is_tag )) { + // DEFINITION CALL + + // before any processing, try to transform the element + if ( + isset($definition->info_tag_transform[$token->name]) + ) { + $original_name = $token->name; + // there is a transformation for this tag + // DEFINITION CALL + $token = $definition-> + info_tag_transform[$token->name]-> + transform($token, $config, $context); + if ($e) $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', $original_name); + } + + if (isset($definition->info[$token->name])) { + + // mostly everything's good, but + // we need to make sure required attributes are in order + if ( + ($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) && + $definition->info[$token->name]->required_attr && + ($token->name != 'img' || $remove_invalid_img) // ensure config option still works + ) { + $attr_validator->validateToken($token, $config, $context); + $ok = true; + foreach ($definition->info[$token->name]->required_attr as $name) { + if (!isset($token->attr[$name])) { + $ok = false; + break; + } + } + if (!$ok) { + if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Missing required attribute', $name); + continue; + } + $token->armor['ValidateAttributes'] = true; + } + + if (isset($hidden_elements[$token->name]) && $token instanceof HTMLPurifier_Token_Start) { + $textify_comments = $token->name; + } elseif ($token->name === $textify_comments && $token instanceof HTMLPurifier_Token_End) { + $textify_comments = false; + } + + } elseif ($escape_invalid_tags) { + // invalid tag, generate HTML representation and insert in + if ($e) $e->send(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text'); + $token = new HTMLPurifier_Token_Text( + $generator->generateFromToken($token) + ); + } else { + // check if we need to destroy all of the tag's children + // CAN BE GENERICIZED + if (isset($hidden_elements[$token->name])) { + if ($token instanceof HTMLPurifier_Token_Start) { + $remove_until = $token->name; + } elseif ($token instanceof HTMLPurifier_Token_Empty) { + // do nothing: we're still looking + } else { + $remove_until = false; + } + if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed'); + } else { + if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed'); + } + continue; + } + } elseif ($token instanceof HTMLPurifier_Token_Comment) { + // textify comments in script tags when they are allowed + if ($textify_comments !== false) { + $data = $token->data; + $token = new HTMLPurifier_Token_Text($data); + } elseif ($trusted) { + // keep, but perform comment cleaning + if ($e) { + // perform check whether or not there's a trailing hyphen + if (substr($token->data, -1) == '-') { + $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed'); + } + } + $token->data = rtrim($token->data, '-'); + $found_double_hyphen = false; + while (strpos($token->data, '--') !== false) { + if ($e && !$found_double_hyphen) { + $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Hyphens in comment collapsed'); + } + $found_double_hyphen = true; // prevent double-erroring + $token->data = str_replace('--', '-', $token->data); + } + } else { + // strip comments + if ($e) $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); + continue; + } + } elseif ($token instanceof HTMLPurifier_Token_Text) { + } else { + continue; + } + $result[] = $token; + } + if ($remove_until && $e) { + // we removed tokens until the end, throw error + $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', $remove_until); + } + + $context->destroy('CurrentToken'); + + return $result; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/ValidateAttributes.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/ValidateAttributes.php new file mode 100644 index 0000000..2b9430f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Strategy/ValidateAttributes.php @@ -0,0 +1,38 @@ +register('CurrentToken', $token); + + foreach ($tokens as $key => $token) { + + // only process tokens that have attributes, + // namely start and empty tags + if (!$token instanceof HTMLPurifier_Token_Start && !$token instanceof HTMLPurifier_Token_Empty) continue; + + // skip tokens that are armored + if (!empty($token->armor['ValidateAttributes'])) continue; + + // note that we have no facilities here for removing tokens + $validator->validateToken($token, $config, $context); + + $tokens[$key] = $token; // for PHP 4 + } + $context->destroy('CurrentToken'); + + return $tokens; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/StringHash.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/StringHash.php new file mode 100644 index 0000000..1e94245 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/StringHash.php @@ -0,0 +1,37 @@ +accessed[$index] = true; + return parent::offsetGet($index); + } + + /** + * Returns a lookup array of all array indexes that have been accessed. + * @return Array in form array($index => true). + */ + public function getAccessed() { + return $this->accessed; + } + + /** + * Resets the access array. + */ + public function resetAccessed() { + $this->accessed = array(); + } +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/StringHashParser.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/StringHashParser.php new file mode 100644 index 0000000..e7d83a9 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/StringHashParser.php @@ -0,0 +1,104 @@ + 'DefaultKeyValue', + * 'KEY' => 'Value', + * 'KEY2' => 'Value2', + * 'MULTILINE-KEY' => "Multiline\nvalue.\n", + * ) + * + * We use this as an easy to use file-format for configuration schema + * files, but the class itself is usage agnostic. + * + * You can use ---- to forcibly terminate parsing of a single string-hash; + * this marker is used in multi string-hashes to delimit boundaries. + */ +class HTMLPurifier_StringHashParser +{ + + public $default = 'ID'; + + /** + * Parses a file that contains a single string-hash. + */ + public function parseFile($file) { + if (!file_exists($file)) return false; + $fh = fopen($file, 'r'); + if (!$fh) return false; + $ret = $this->parseHandle($fh); + fclose($fh); + return $ret; + } + + /** + * Parses a file that contains multiple string-hashes delimited by '----' + */ + public function parseMultiFile($file) { + if (!file_exists($file)) return false; + $ret = array(); + $fh = fopen($file, 'r'); + if (!$fh) return false; + while (!feof($fh)) { + $ret[] = $this->parseHandle($fh); + } + fclose($fh); + return $ret; + } + + /** + * Internal parser that acepts a file handle. + * @note While it's possible to simulate in-memory parsing by using + * custom stream wrappers, if such a use-case arises we should + * factor out the file handle into its own class. + * @param $fh File handle with pointer at start of valid string-hash + * block. + */ + protected function parseHandle($fh) { + $state = false; + $single = false; + $ret = array(); + do { + $line = fgets($fh); + if ($line === false) break; + $line = rtrim($line, "\n\r"); + if (!$state && $line === '') continue; + if ($line === '----') break; + if (strncmp('--', $line, 2) === 0) { + // Multiline declaration + $state = trim($line, '- '); + if (!isset($ret[$state])) $ret[$state] = ''; + continue; + } elseif (!$state) { + $single = true; + if (strpos($line, ':') !== false) { + // Single-line declaration + list($state, $line) = explode(': ', $line, 2); + } else { + // Use default declaration + $state = $this->default; + } + } + if ($single) { + $ret[$state] = $line; + $single = false; + $state = false; + } else { + $ret[$state] .= "$line\n"; + } + } while (!feof($fh)); + return $ret; + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform.php new file mode 100644 index 0000000..e0a9121 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform.php @@ -0,0 +1,35 @@ + 'xx-small', + '1' => 'xx-small', + '2' => 'small', + '3' => 'medium', + '4' => 'large', + '5' => 'x-large', + '6' => 'xx-large', + '7' => '300%', + '-1' => 'smaller', + '-2' => '60%', + '+1' => 'larger', + '+2' => '150%', + '+3' => '200%', + '+4' => '300%' + ); + + public function transform($tag, $config, $context) { + + if ($tag instanceof HTMLPurifier_Token_End) { + $new_tag = clone $tag; + $new_tag->name = $this->transform_to; + return $new_tag; + } + + $attr = $tag->attr; + $prepend_style = ''; + + // handle color transform + if (isset($attr['color'])) { + $prepend_style .= 'color:' . $attr['color'] . ';'; + unset($attr['color']); + } + + // handle face transform + if (isset($attr['face'])) { + $prepend_style .= 'font-family:' . $attr['face'] . ';'; + unset($attr['face']); + } + + // handle size transform + if (isset($attr['size'])) { + // normalize large numbers + if ($attr['size']{0} == '+' || $attr['size']{0} == '-') { + $size = (int) $attr['size']; + if ($size < -2) $attr['size'] = '-2'; + if ($size > 4) $attr['size'] = '+4'; + } else { + $size = (int) $attr['size']; + if ($size > 7) $attr['size'] = '7'; + } + if (isset($this->_size_lookup[$attr['size']])) { + $prepend_style .= 'font-size:' . + $this->_size_lookup[$attr['size']] . ';'; + } + unset($attr['size']); + } + + if ($prepend_style) { + $attr['style'] = isset($attr['style']) ? + $prepend_style . $attr['style'] : + $prepend_style; + } + + $new_tag = clone $tag; + $new_tag->name = $this->transform_to; + $new_tag->attr = $attr; + + return $new_tag; + + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform/Simple.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform/Simple.php new file mode 100644 index 0000000..abc9f0a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TagTransform/Simple.php @@ -0,0 +1,34 @@ +transform_to = $transform_to; + $this->style = $style; + } + + public function transform($tag, $config, $context) { + $new_tag = clone $tag; + $new_tag->name = $this->transform_to; + if (!is_null($this->style) && + ($new_tag instanceof HTMLPurifier_Token_Start || $new_tag instanceof HTMLPurifier_Token_Empty) + ) { + $this->prependCSS($new_tag->attr, $this->style); + } + return $new_tag; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token.php new file mode 100644 index 0000000..fdcaef0 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token.php @@ -0,0 +1,54 @@ +line = $l; + $this->col = $c; + } + + /** + * Convenience function for DirectLex settings line/col position. + */ + public function rawPosition($l, $c) { + if ($c === -1) $l++; + $this->line = $l; + $this->col = $c; + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Comment.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Comment.php new file mode 100644 index 0000000..bc4862f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Comment.php @@ -0,0 +1,20 @@ +data = $data; + $this->line = $line; + $this->col = $col; + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Empty.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Empty.php new file mode 100644 index 0000000..3cc5efd --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Empty.php @@ -0,0 +1,9 @@ +!empty($obj->is_tag) + * without having to use a function call is_a(). + */ + public $is_tag = true; + + /** + * The lower-case name of the tag, like 'a', 'b' or 'blockquote'. + * + * @note Strictly speaking, XML tags are case sensitive, so we shouldn't + * be lower-casing them, but these tokens cater to HTML tags, which are + * insensitive. + */ + public $name; + + /** + * Associative array of the tag's attributes. + */ + public $attr = array(); + + /** + * Non-overloaded constructor, which lower-cases passed tag name. + * + * @param $name String name. + * @param $attr Associative array of attributes. + */ + public function __construct($name, $attr = array(), $line = null, $col = null) { + $this->name = ctype_lower($name) ? $name : strtolower($name); + foreach ($attr as $key => $value) { + // normalization only necessary when key is not lowercase + if (!ctype_lower($key)) { + $new_key = strtolower($key); + if (!isset($attr[$new_key])) { + $attr[$new_key] = $attr[$key]; + } + if ($new_key !== $key) { + unset($attr[$key]); + } + } + } + $this->attr = $attr; + $this->line = $line; + $this->col = $col; + } +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Text.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Text.php new file mode 100644 index 0000000..ed46fe8 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/Token/Text.php @@ -0,0 +1,31 @@ +data = $data; + $this->is_whitespace = ctype_space($data); + $this->line = $line; + $this->col = $col; + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TokenFactory.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TokenFactory.php new file mode 100644 index 0000000..a7378df --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/TokenFactory.php @@ -0,0 +1,93 @@ +p_start = new HTMLPurifier_Token_Start('', array()); + $this->p_end = new HTMLPurifier_Token_End(''); + $this->p_empty = new HTMLPurifier_Token_Empty('', array()); + $this->p_text = new HTMLPurifier_Token_Text(''); + $this->p_comment= new HTMLPurifier_Token_Comment(''); + } + + /** + * Creates a HTMLPurifier_Token_Start. + * @param $name Tag name + * @param $attr Associative array of attributes + * @return Generated HTMLPurifier_Token_Start + */ + public function createStart($name, $attr = array()) { + $p = clone $this->p_start; + $p->__construct($name, $attr); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_End. + * @param $name Tag name + * @return Generated HTMLPurifier_Token_End + */ + public function createEnd($name) { + $p = clone $this->p_end; + $p->__construct($name); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Empty. + * @param $name Tag name + * @param $attr Associative array of attributes + * @return Generated HTMLPurifier_Token_Empty + */ + public function createEmpty($name, $attr = array()) { + $p = clone $this->p_empty; + $p->__construct($name, $attr); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Text. + * @param $data Data of text token + * @return Generated HTMLPurifier_Token_Text + */ + public function createText($data) { + $p = clone $this->p_text; + $p->__construct($data); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Comment. + * @param $data Data of comment token + * @return Generated HTMLPurifier_Token_Comment + */ + public function createComment($data) { + $p = clone $this->p_comment; + $p->__construct($data); + return $p; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URI.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URI.php new file mode 100644 index 0000000..38bdc83 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URI.php @@ -0,0 +1,172 @@ +scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme); + $this->userinfo = $userinfo; + $this->host = $host; + $this->port = is_null($port) ? $port : (int) $port; + $this->path = $path; + $this->query = $query; + $this->fragment = $fragment; + } + + /** + * Retrieves a scheme object corresponding to the URI's scheme/default + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + * @return Scheme object appropriate for validating this URI + */ + public function getSchemeObj($config, $context) { + $registry = HTMLPurifier_URISchemeRegistry::instance(); + if ($this->scheme !== null) { + $scheme_obj = $registry->getScheme($this->scheme, $config, $context); + if (!$scheme_obj) return false; // invalid scheme, clean it out + } else { + // no scheme: retrieve the default one + $def = $config->getDefinition('URI'); + $scheme_obj = $registry->getScheme($def->defaultScheme, $config, $context); + if (!$scheme_obj) { + // something funky happened to the default scheme object + trigger_error( + 'Default scheme object "' . $def->defaultScheme . '" was not readable', + E_USER_WARNING + ); + return false; + } + } + return $scheme_obj; + } + + /** + * Generic validation method applicable for all schemes. May modify + * this URI in order to get it into a compliant form. + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + * @return True if validation/filtering succeeds, false if failure + */ + public function validate($config, $context) { + + // ABNF definitions from RFC 3986 + $chars_sub_delims = '!$&\'()*+,;='; + $chars_gen_delims = ':/?#[]@'; + $chars_pchar = $chars_sub_delims . ':@'; + + // validate scheme (MUST BE FIRST!) + if (!is_null($this->scheme) && is_null($this->host)) { + $def = $config->getDefinition('URI'); + if ($def->defaultScheme === $this->scheme) { + $this->scheme = null; + } + } + + // validate host + if (!is_null($this->host)) { + $host_def = new HTMLPurifier_AttrDef_URI_Host(); + $this->host = $host_def->validate($this->host, $config, $context); + if ($this->host === false) $this->host = null; + } + + // validate username + if (!is_null($this->userinfo)) { + $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':'); + $this->userinfo = $encoder->encode($this->userinfo); + } + + // validate port + if (!is_null($this->port)) { + if ($this->port < 1 || $this->port > 65535) $this->port = null; + } + + // validate path + $path_parts = array(); + $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/'); + if (!is_null($this->host)) { + // path-abempty (hier and relative) + $this->path = $segments_encoder->encode($this->path); + } elseif ($this->path !== '' && $this->path[0] === '/') { + // path-absolute (hier and relative) + if (strlen($this->path) >= 2 && $this->path[1] === '/') { + // This shouldn't ever happen! + $this->path = ''; + } else { + $this->path = $segments_encoder->encode($this->path); + } + } elseif (!is_null($this->scheme) && $this->path !== '') { + // path-rootless (hier) + // Short circuit evaluation means we don't need to check nz + $this->path = $segments_encoder->encode($this->path); + } elseif (is_null($this->scheme) && $this->path !== '') { + // path-noscheme (relative) + // (once again, not checking nz) + $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@'); + $c = strpos($this->path, '/'); + if ($c !== false) { + $this->path = + $segment_nc_encoder->encode(substr($this->path, 0, $c)) . + $segments_encoder->encode(substr($this->path, $c)); + } else { + $this->path = $segment_nc_encoder->encode($this->path); + } + } else { + // path-empty (hier and relative) + $this->path = ''; // just to be safe + } + + // qf = query and fragment + $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?'); + + if (!is_null($this->query)) { + $this->query = $qf_encoder->encode($this->query); + } + + if (!is_null($this->fragment)) { + $this->fragment = $qf_encoder->encode($this->fragment); + } + + return true; + + } + + /** + * Convert URI back to string + * @return String URI appropriate for output + */ + public function toString() { + // reconstruct authority + $authority = null; + if (!is_null($this->host)) { + $authority = ''; + if(!is_null($this->userinfo)) $authority .= $this->userinfo . '@'; + $authority .= $this->host; + if(!is_null($this->port)) $authority .= ':' . $this->port; + } + + // reconstruct the result + $result = ''; + if (!is_null($this->scheme)) $result .= $this->scheme . ':'; + if (!is_null($authority)) $result .= '//' . $authority; + $result .= $this->path; + if (!is_null($this->query)) $result .= '?' . $this->query; + if (!is_null($this->fragment)) $result .= '#' . $this->fragment; + + return $result; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIDefinition.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIDefinition.php new file mode 100644 index 0000000..cf8974b --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIDefinition.php @@ -0,0 +1,91 @@ +registerFilter(new HTMLPurifier_URIFilter_DisableExternal()); + $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources()); + $this->registerFilter(new HTMLPurifier_URIFilter_HostBlacklist()); + $this->registerFilter(new HTMLPurifier_URIFilter_MakeAbsolute()); + $this->registerFilter(new HTMLPurifier_URIFilter_Munge()); + } + + public function registerFilter($filter) { + $this->registeredFilters[$filter->name] = $filter; + } + + public function addFilter($filter, $config) { + $r = $filter->prepare($config); + if ($r === false) return; // null is ok, for backwards compat + if ($filter->post) { + $this->postFilters[$filter->name] = $filter; + } else { + $this->filters[$filter->name] = $filter; + } + } + + protected function doSetup($config) { + $this->setupMemberVariables($config); + $this->setupFilters($config); + } + + protected function setupFilters($config) { + foreach ($this->registeredFilters as $name => $filter) { + $conf = $config->get('URI', $name); + if ($conf !== false && $conf !== null) { + $this->addFilter($filter, $config); + } + } + unset($this->registeredFilters); + } + + protected function setupMemberVariables($config) { + $this->host = $config->get('URI', 'Host'); + $base_uri = $config->get('URI', 'Base'); + if (!is_null($base_uri)) { + $parser = new HTMLPurifier_URIParser(); + $this->base = $parser->parse($base_uri); + $this->defaultScheme = $this->base->scheme; + if (is_null($this->host)) $this->host = $this->base->host; + } + if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI', 'DefaultScheme'); + } + + public function filter(&$uri, $config, $context) { + foreach ($this->filters as $name => $f) { + $result = $f->filter($uri, $config, $context); + if (!$result) return false; + } + return true; + } + + public function postFilter(&$uri, $config, $context) { + foreach ($this->postFilters as $name => $f) { + $result = $f->filter($uri, $config, $context); + if (!$result) return false; + } + return true; + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter.php new file mode 100644 index 0000000..3b6cb3d --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter.php @@ -0,0 +1,43 @@ +getDefinition('URI')->host; + if ($our_host !== null) $this->ourHostParts = array_reverse(explode('.', $our_host)); + } + public function filter(&$uri, $config, $context) { + if (is_null($uri->host)) return true; + if ($this->ourHostParts === false) return false; + $host_parts = array_reverse(explode('.', $uri->host)); + foreach ($this->ourHostParts as $i => $x) { + if (!isset($host_parts[$i])) return false; + if ($host_parts[$i] != $this->ourHostParts[$i]) return false; + } + return true; + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/DisableExternalResources.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/DisableExternalResources.php new file mode 100644 index 0000000..eca5558 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/DisableExternalResources.php @@ -0,0 +1,11 @@ +get('EmbeddedURI', true)) return true; + return parent::filter($uri, $config, $context); + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/HostBlacklist.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/HostBlacklist.php new file mode 100644 index 0000000..9ff821f --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/HostBlacklist.php @@ -0,0 +1,19 @@ +blacklist = $config->get('URI', 'HostBlacklist'); + return true; + } + public function filter(&$uri, $config, $context) { + foreach($this->blacklist as $blacklisted_host_fragment) { + if (strpos($uri->host, $blacklisted_host_fragment) !== false) { + return false; + } + } + return true; + } +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/MakeAbsolute.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/MakeAbsolute.php new file mode 100644 index 0000000..0762756 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/MakeAbsolute.php @@ -0,0 +1,113 @@ +getDefinition('URI'); + $this->base = $def->base; + if (is_null($this->base)) { + trigger_error('URI.MakeAbsolute is being ignored due to lack of value for URI.Base configuration', E_USER_WARNING); + return false; + } + $this->base->fragment = null; // fragment is invalid for base URI + $stack = explode('/', $this->base->path); + array_pop($stack); // discard last segment + $stack = $this->_collapseStack($stack); // do pre-parsing + $this->basePathStack = $stack; + return true; + } + public function filter(&$uri, $config, $context) { + if (is_null($this->base)) return true; // abort early + if ( + $uri->path === '' && is_null($uri->scheme) && + is_null($uri->host) && is_null($uri->query) && is_null($uri->fragment) + ) { + // reference to current document + $uri = clone $this->base; + return true; + } + if (!is_null($uri->scheme)) { + // absolute URI already: don't change + if (!is_null($uri->host)) return true; + $scheme_obj = $uri->getSchemeObj($config, $context); + if (!$scheme_obj) { + // scheme not recognized + return false; + } + if (!$scheme_obj->hierarchical) { + // non-hierarchal URI with explicit scheme, don't change + return true; + } + // special case: had a scheme but always is hierarchical and had no authority + } + if (!is_null($uri->host)) { + // network path, don't bother + return true; + } + if ($uri->path === '') { + $uri->path = $this->base->path; + } elseif ($uri->path[0] !== '/') { + // relative path, needs more complicated processing + $stack = explode('/', $uri->path); + $new_stack = array_merge($this->basePathStack, $stack); + if ($new_stack[0] !== '' && !is_null($this->base->host)) { + array_unshift($new_stack, ''); + } + $new_stack = $this->_collapseStack($new_stack); + $uri->path = implode('/', $new_stack); + } else { + // absolute path, but still we should collapse + $uri->path = implode('/', $this->_collapseStack(explode('/', $uri->path))); + } + // re-combine + $uri->scheme = $this->base->scheme; + if (is_null($uri->userinfo)) $uri->userinfo = $this->base->userinfo; + if (is_null($uri->host)) $uri->host = $this->base->host; + if (is_null($uri->port)) $uri->port = $this->base->port; + return true; + } + + /** + * Resolve dots and double-dots in a path stack + */ + private function _collapseStack($stack) { + $result = array(); + $is_folder = false; + for ($i = 0; isset($stack[$i]); $i++) { + $is_folder = false; + // absorb an internally duplicated slash + if ($stack[$i] == '' && $i && isset($stack[$i+1])) continue; + if ($stack[$i] == '..') { + if (!empty($result)) { + $segment = array_pop($result); + if ($segment === '' && empty($result)) { + // error case: attempted to back out too far: + // restore the leading slash + $result[] = ''; + } elseif ($segment === '..') { + $result[] = '..'; // cannot remove .. with .. + } + } else { + // relative path, preserve the double-dots + $result[] = '..'; + } + $is_folder = true; + continue; + } + if ($stack[$i] == '.') { + // silently absorb + $is_folder = true; + continue; + } + $result[] = $stack[$i]; + } + if ($is_folder) $result[] = ''; + return $result; + } +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/Munge.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/Munge.php new file mode 100644 index 0000000..cd2c2dd --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIFilter/Munge.php @@ -0,0 +1,52 @@ +target = $config->get('URI', $this->name); + $this->parser = new HTMLPurifier_URIParser(); + $this->doEmbed = $config->get('URI', 'MungeResources'); + $this->secretKey = $config->get('URI', 'MungeSecretKey'); + return true; + } + public function filter(&$uri, $config, $context) { + if ($context->get('EmbeddedURI', true) && !$this->doEmbed) return true; + + $scheme_obj = $uri->getSchemeObj($config, $context); + if (!$scheme_obj) return true; // ignore unknown schemes, maybe another postfilter did it + if (is_null($uri->host) || empty($scheme_obj->browsable)) { + return true; + } + + $this->makeReplace($uri, $config, $context); + $this->replace = array_map('rawurlencode', $this->replace); + + $new_uri = strtr($this->target, $this->replace); + $new_uri = $this->parser->parse($new_uri); + // don't redirect if the target host is the same as the + // starting host + if ($uri->host === $new_uri->host) return true; + $uri = $new_uri; // overwrite + return true; + } + + protected function makeReplace($uri, $config, $context) { + $string = $uri->toString(); + // always available + $this->replace['%s'] = $string; + $this->replace['%r'] = $context->get('EmbeddedURI', true); + $token = $context->get('CurrentToken', true); + $this->replace['%n'] = $token ? $token->name : null; + $this->replace['%m'] = $context->get('CurrentAttr', true); + $this->replace['%p'] = $context->get('CurrentCSSProperty', true); + // not always available + if ($this->secretKey) $this->replace['%t'] = sha1($this->secretKey . ':' . $string); + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIParser.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIParser.php new file mode 100644 index 0000000..3b575f5 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIParser.php @@ -0,0 +1,69 @@ +percentEncoder = new HTMLPurifier_PercentEncoder(); + } + + /** + * Parses a URI. + * @param $uri string URI to parse + * @return HTMLPurifier_URI representation of URI. This representation has + * not been validated yet and may not conform to RFC. + */ + public function parse($uri) { + + $uri = $this->percentEncoder->normalize($uri); + + // Regexp is as per Appendix B. + // Note that ["<>] are an addition to the RFC's recommended + // characters, because they represent external delimeters. + $r_URI = '!'. + '(([^:/?#"<>]+):)?'. // 2. Scheme + '(//([^/?#"<>]*))?'. // 4. Authority + '([^?#"<>]*)'. // 5. Path + '(\?([^#"<>]*))?'. // 7. Query + '(#([^"<>]*))?'. // 8. Fragment + '!'; + + $matches = array(); + $result = preg_match($r_URI, $uri, $matches); + + if (!$result) return false; // *really* invalid URI + + // seperate out parts + $scheme = !empty($matches[1]) ? $matches[2] : null; + $authority = !empty($matches[3]) ? $matches[4] : null; + $path = $matches[5]; // always present, can be empty + $query = !empty($matches[6]) ? $matches[7] : null; + $fragment = !empty($matches[8]) ? $matches[9] : null; + + // further parse authority + if ($authority !== null) { + $r_authority = "/^((.+?)@)?(\[[^\]]+\]|[^:]*)(:(\d*))?/"; + $matches = array(); + preg_match($r_authority, $authority, $matches); + $userinfo = !empty($matches[1]) ? $matches[2] : null; + $host = !empty($matches[3]) ? $matches[3] : ''; + $port = !empty($matches[4]) ? (int) $matches[5] : null; + } else { + $port = $host = $userinfo = null; + } + + return new HTMLPurifier_URI( + $scheme, $userinfo, $host, $port, $path, $query, $fragment); + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme.php new file mode 100644 index 0000000..e01a1a8 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme.php @@ -0,0 +1,41 @@ +, resolves edge cases + * with making relative URIs absolute + */ + public $hierarchical = false; + + /** + * Validates the components of a URI + * @note This implementation should be called by children if they define + * a default port, as it does port processing. + * @param $uri Instance of HTMLPurifier_URI + * @param $config HTMLPurifier_Config object + * @param $context HTMLPurifier_Context object + * @return Bool success or failure + */ + public function validate(&$uri, $config, $context) { + if ($this->default_port == $uri->port) $uri->port = null; + return true; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/ftp.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/ftp.php new file mode 100644 index 0000000..6a205d8 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/ftp.php @@ -0,0 +1,42 @@ +query = null; + + // typecode check + $semicolon_pos = strrpos($uri->path, ';'); // reverse + if ($semicolon_pos !== false) { + $type = substr($uri->path, $semicolon_pos + 1); // no semicolon + $uri->path = substr($uri->path, 0, $semicolon_pos); + $type_ret = ''; + if (strpos($type, '=') !== false) { + // figure out whether or not the declaration is correct + list($key, $typecode) = explode('=', $type, 2); + if ($key !== 'type') { + // invalid key, tack it back on encoded + $uri->path .= '%3B' . $type; + } elseif ($typecode === 'a' || $typecode === 'i' || $typecode === 'd') { + $type_ret = ";type=$typecode"; + } + } else { + $uri->path .= '%3B' . $type; + } + $uri->path = str_replace(';', '%3B', $uri->path); + $uri->path .= $type_ret; + } + + return true; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/http.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/http.php new file mode 100644 index 0000000..710662a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/http.php @@ -0,0 +1,19 @@ +userinfo = null; + return true; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/https.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/https.php new file mode 100644 index 0000000..28e00ff --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/https.php @@ -0,0 +1,11 @@ +userinfo = null; + $uri->host = null; + $uri->port = null; + // we need to validate path against RFC 2368's addr-spec + return true; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/news.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/news.php new file mode 100644 index 0000000..6f22360 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/news.php @@ -0,0 +1,21 @@ +userinfo = null; + $uri->host = null; + $uri->port = null; + $uri->query = null; + // typecode check needed on path + return true; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/nntp.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/nntp.php new file mode 100644 index 0000000..590ec6a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URIScheme/nntp.php @@ -0,0 +1,19 @@ +userinfo = null; + $uri->query = null; + return true; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URISchemeRegistry.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URISchemeRegistry.php new file mode 100644 index 0000000..2e6dfc2 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/URISchemeRegistry.php @@ -0,0 +1,69 @@ +get('URI', 'AllowedSchemes'); + if (!$config->get('URI', 'OverrideAllowedSchemes') && + !isset($allowed_schemes[$scheme]) + ) { + return $null; + } + + if (isset($this->schemes[$scheme])) return $this->schemes[$scheme]; + if (!isset($allowed_schemes[$scheme])) return $null; + + $class = 'HTMLPurifier_URIScheme_' . $scheme; + if (!class_exists($class)) return $null; + $this->schemes[$scheme] = new $class(); + return $this->schemes[$scheme]; + } + + /** + * Registers a custom scheme to the cache, bypassing reflection. + * @param $scheme Scheme name + * @param $scheme_obj HTMLPurifier_URIScheme object + */ + public function register($scheme, $scheme_obj) { + $this->schemes[$scheme] = $scheme_obj; + } + +} + + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/UnitConverter.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/UnitConverter.php new file mode 100644 index 0000000..5eebf6a --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/UnitConverter.php @@ -0,0 +1,252 @@ + array( + 'px' => 3, // This is as per CSS 2.1 and Firefox. Your mileage may vary + 'pt' => 4, + 'pc' => 48, + 'in' => 288, + self::METRIC => array('pt', '0.352777778', 'mm'), + ), + self::METRIC => array( + 'mm' => 1, + 'cm' => 10, + self::ENGLISH => array('mm', '2.83464567', 'pt'), + ), + ); + + /** + * Minimum bcmath precision for output. + */ + protected $outputPrecision; + + /** + * Bcmath precision for internal calculations. + */ + protected $internalPrecision; + + /** + * Whether or not BCMath is available + */ + private $bcmath; + + public function __construct($output_precision = 4, $internal_precision = 10, $force_no_bcmath = false) { + $this->outputPrecision = $output_precision; + $this->internalPrecision = $internal_precision; + $this->bcmath = !$force_no_bcmath && function_exists('bcmul'); + } + + /** + * Converts a length object of one unit into another unit. + * @param HTMLPurifier_Length $length + * Instance of HTMLPurifier_Length to convert. You must validate() + * it before passing it here! + * @param string $to_unit + * Unit to convert to. + * @note + * About precision: This conversion function pays very special + * attention to the incoming precision of values and attempts + * to maintain a number of significant figure. Results are + * fairly accurate up to nine digits. Some caveats: + * - If a number is zero-padded as a result of this significant + * figure tracking, the zeroes will be eliminated. + * - If a number contains less than four sigfigs ($outputPrecision) + * and this causes some decimals to be excluded, those + * decimals will be added on. + */ + public function convert($length, $to_unit) { + + if (!$length->isValid()) return false; + + $n = $length->getN(); + $unit = $length->getUnit(); + + if ($n === '0' || $unit === false) { + return new HTMLPurifier_Length('0', false); + } + + $state = $dest_state = false; + foreach (self::$units as $k => $x) { + if (isset($x[$unit])) $state = $k; + if (isset($x[$to_unit])) $dest_state = $k; + } + if (!$state || !$dest_state) return false; + + // Some calculations about the initial precision of the number; + // this will be useful when we need to do final rounding. + $sigfigs = $this->getSigFigs($n); + if ($sigfigs < $this->outputPrecision) $sigfigs = $this->outputPrecision; + + // BCMath's internal precision deals only with decimals. Use + // our default if the initial number has no decimals, or increase + // it by how ever many decimals, thus, the number of guard digits + // will always be greater than or equal to internalPrecision. + $log = (int) floor(log(abs($n), 10)); + $cp = ($log < 0) ? $this->internalPrecision - $log : $this->internalPrecision; // internal precision + + for ($i = 0; $i < 2; $i++) { + + // Determine what unit IN THIS SYSTEM we need to convert to + if ($dest_state === $state) { + // Simple conversion + $dest_unit = $to_unit; + } else { + // Convert to the smallest unit, pending a system shift + $dest_unit = self::$units[$state][$dest_state][0]; + } + + // Do the conversion if necessary + if ($dest_unit !== $unit) { + $factor = $this->div(self::$units[$state][$unit], self::$units[$state][$dest_unit], $cp); + $n = $this->mul($n, $factor, $cp); + $unit = $dest_unit; + } + + // Output was zero, so bail out early. Shouldn't ever happen. + if ($n === '') { + $n = '0'; + $unit = $to_unit; + break; + } + + // It was a simple conversion, so bail out + if ($dest_state === $state) { + break; + } + + if ($i !== 0) { + // Conversion failed! Apparently, the system we forwarded + // to didn't have this unit. This should never happen! + return false; + } + + // Pre-condition: $i == 0 + + // Perform conversion to next system of units + $n = $this->mul($n, self::$units[$state][$dest_state][1], $cp); + $unit = self::$units[$state][$dest_state][2]; + $state = $dest_state; + + // One more loop around to convert the unit in the new system. + + } + + // Post-condition: $unit == $to_unit + if ($unit !== $to_unit) return false; + + // Useful for debugging: + //echo "
      n";
      +        //echo "$n\nsigfigs = $sigfigs\nnew_log = $new_log\nlog = $log\nrp = $rp\n
      \n"; + + $n = $this->round($n, $sigfigs); + if (strpos($n, '.') !== false) $n = rtrim($n, '0'); + $n = rtrim($n, '.'); + + return new HTMLPurifier_Length($n, $unit); + } + + /** + * Returns the number of significant figures in a string number. + * @param string $n Decimal number + * @return int number of sigfigs + */ + public function getSigFigs($n) { + $n = ltrim($n, '0+-'); + $dp = strpos($n, '.'); // decimal position + if ($dp === false) { + $sigfigs = strlen(rtrim($n, '0')); + } else { + $sigfigs = strlen(ltrim($n, '0.')); // eliminate extra decimal character + if ($dp !== 0) $sigfigs--; + } + return $sigfigs; + } + + /** + * Adds two numbers, using arbitrary precision when available. + */ + private function add($s1, $s2, $scale) { + if ($this->bcmath) return bcadd($s1, $s2, $scale); + else return $this->scale($s1 + $s2, $scale); + } + + /** + * Multiples two numbers, using arbitrary precision when available. + */ + private function mul($s1, $s2, $scale) { + if ($this->bcmath) return bcmul($s1, $s2, $scale); + else return $this->scale($s1 * $s2, $scale); + } + + /** + * Divides two numbers, using arbitrary precision when available. + */ + private function div($s1, $s2, $scale) { + if ($this->bcmath) return bcdiv($s1, $s2, $scale); + else return $this->scale($s1 / $s2, $scale); + } + + /** + * Rounds a number according to the number of sigfigs it should have, + * using arbitrary precision when available. + */ + private function round($n, $sigfigs) { + $new_log = (int) floor(log(abs($n), 10)); // Number of digits left of decimal - 1 + $rp = $sigfigs - $new_log - 1; // Number of decimal places needed + $neg = $n < 0 ? '-' : ''; // Negative sign + if ($this->bcmath) { + if ($rp >= 0) { + $n = bcadd($n, $neg . '0.' . str_repeat('0', $rp) . '5', $rp + 1); + $n = bcdiv($n, '1', $rp); + } else { + // This algorithm partially depends on the standardized + // form of numbers that comes out of bcmath. + $n = bcadd($n, $neg . '5' . str_repeat('0', $new_log - $sigfigs), 0); + $n = substr($n, 0, $sigfigs + strlen($neg)) . str_repeat('0', $new_log - $sigfigs + 1); + } + return $n; + } else { + return $this->scale(round($n, $sigfigs - $new_log - 1), $rp + 1); + } + } + + /** + * Scales a float to $scale digits right of decimal point, like BCMath. + */ + private function scale($r, $scale) { + if ($scale < 0) { + // The f sprintf type doesn't support negative numbers, so we + // need to cludge things manually. First get the string. + $r = sprintf('%.0f', (float) $r); + // Due to floating point precision loss, $r will more than likely + // look something like 4652999999999.9234. We grab one more digit + // than we need to precise from $r and then use that to round + // appropriately. + $precise = (string) round(substr($r, 0, strlen($r) + $scale), -1); + // Now we return it, truncating the zero that was rounded off. + return substr($precise, 0, -1) . str_repeat('0', -$scale + 1); + } + return sprintf('%.' . $scale . 'f', (float) $r); + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser.php new file mode 100644 index 0000000..a0cd2cf --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser.php @@ -0,0 +1,152 @@ + self::STRING, + 'istring' => self::ISTRING, + 'text' => self::TEXT, + 'itext' => self::ITEXT, + 'int' => self::INT, + 'float' => self::FLOAT, + 'bool' => self::BOOL, + 'lookup' => self::LOOKUP, + 'list' => self::ALIST, + 'hash' => self::HASH, + 'mixed' => self::MIXED + ); + + /** + * Lookup table of types that are string, and can have aliases or + * allowed value lists. + */ + static public $stringTypes = array( + self::STRING => true, + self::ISTRING => true, + self::TEXT => true, + self::ITEXT => true, + ); + + /** + * Validate a variable according to type. Throws + * HTMLPurifier_VarParserException if invalid. + * It may return NULL as a valid type if $allow_null is true. + * + * @param $var Variable to validate + * @param $type Type of variable, see HTMLPurifier_VarParser->types + * @param $allow_null Whether or not to permit null as a value + * @return Validated and type-coerced variable + */ + final public function parse($var, $type, $allow_null = false) { + if (is_string($type)) { + if (!isset(HTMLPurifier_VarParser::$types[$type])) { + throw new HTMLPurifier_VarParserException("Invalid type '$type'"); + } else { + $type = HTMLPurifier_VarParser::$types[$type]; + } + } + $var = $this->parseImplementation($var, $type, $allow_null); + if ($allow_null && $var === null) return null; + // These are basic checks, to make sure nothing horribly wrong + // happened in our implementations. + switch ($type) { + case (self::STRING): + case (self::ISTRING): + case (self::TEXT): + case (self::ITEXT): + if (!is_string($var)) break; + if ($type == self::ISTRING || $type == self::ITEXT) $var = strtolower($var); + return $var; + case (self::INT): + if (!is_int($var)) break; + return $var; + case (self::FLOAT): + if (!is_float($var)) break; + return $var; + case (self::BOOL): + if (!is_bool($var)) break; + return $var; + case (self::LOOKUP): + case (self::ALIST): + case (self::HASH): + if (!is_array($var)) break; + if ($type === self::LOOKUP) { + foreach ($var as $k) if ($k !== true) $this->error('Lookup table contains value other than true'); + } elseif ($type === self::ALIST) { + $keys = array_keys($var); + if (array_keys($keys) !== $keys) $this->error('Indices for list are not uniform'); + } + return $var; + case (self::MIXED): + return $var; + default: + $this->errorInconsistent(get_class($this), $type); + } + $this->errorGeneric($var, $type); + } + + /** + * Actually implements the parsing. Base implementation is to not + * do anything to $var. Subclasses should overload this! + */ + protected function parseImplementation($var, $type, $allow_null) { + return $var; + } + + /** + * Throws an exception. + */ + protected function error($msg) { + throw new HTMLPurifier_VarParserException($msg); + } + + /** + * Throws an inconsistency exception. + * @note This should not ever be called. It would be called if we + * extend the allowed values of HTMLPurifier_VarParser without + * updating subclasses. + */ + protected function errorInconsistent($class, $type) { + throw new HTMLPurifier_Exception("Inconsistency in $class: ".HTMLPurifier_VarParser::getTypeName($type)." not implemented"); + } + + /** + * Generic error for if a type didn't work. + */ + protected function errorGeneric($var, $type) { + $vtype = gettype($var); + $this->error("Expected type ".HTMLPurifier_VarParser::getTypeName($type).", got $vtype"); + } + + static public function getTypeName($type) { + static $lookup; + if (!$lookup) { + // Lazy load the alternative lookup table + $lookup = array_flip(HTMLPurifier_VarParser::$types); + } + if (!isset($lookup[$type])) return 'unknown'; + return $lookup[$type]; + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser/Flexible.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser/Flexible.php new file mode 100644 index 0000000..c7e2990 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser/Flexible.php @@ -0,0 +1,94 @@ + $j) $var[$i] = trim($j); + if ($type === self::HASH) { + // key:value,key2:value2 + $nvar = array(); + foreach ($var as $keypair) { + $c = explode(':', $keypair, 2); + if (!isset($c[1])) continue; + $nvar[$c[0]] = $c[1]; + } + $var = $nvar; + } + } + if (!is_array($var)) break; + $keys = array_keys($var); + if ($keys === array_keys($keys)) { + if ($type == self::ALIST) return $var; + elseif ($type == self::LOOKUP) { + $new = array(); + foreach ($var as $key) { + $new[$key] = true; + } + return $new; + } else break; + } + if ($type === self::LOOKUP) { + foreach ($var as $key => $value) { + $var[$key] = true; + } + } + return $var; + default: + $this->errorInconsistent(__CLASS__, $type); + } + $this->errorGeneric($var, $type); + } + +} diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser/Native.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser/Native.php new file mode 100644 index 0000000..546c3b9 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParser/Native.php @@ -0,0 +1,25 @@ +evalExpression($var); + } + + protected function evalExpression($expr) { + $var = null; + $result = eval("\$var = $expr;"); + if ($result === false) { + throw new HTMLPurifier_VarParserException("Fatal error in evaluated code"); + } + return $var; + } + +} + diff --git a/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParserException.php b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParserException.php new file mode 100644 index 0000000..9572e33 --- /dev/null +++ b/dvwa/external/phpids/0.6/lib/IDS/vendors/htmlpurifier/HTMLPurifier/VarParserException.php @@ -0,0 +1,9 @@ +path = dirname(__FILE__) . '/../../lib/IDS/Config/Config.ini'; + $this->init = IDS_Init::init($this->path); + } + + function testCachingNone() { + $this->init->config['Caching']['caching'] = 'none'; + $this->assertFalse(IDS_Caching::factory($this->init, 'storage')); + } + + function testCachingFile() { + $this->init->config['Caching']['caching'] = 'file'; + $this->init->config['Caching']['expiration_time'] = 0; + $this->assertTrue(IDS_Caching::factory($this->init, 'storage') instanceof IDS_Caching_File); + } + + function testCachingFileSetCache() { + $this->init->config['Caching']['caching'] = 'file'; + $this->init->config['Caching']['expiration_time'] = 0; + $cache = IDS_Caching::factory($this->init, 'storage'); + $cache = $cache->setCache(array(1,2,3,4)); + $this->assertTrue($cache instanceof IDS_Caching_File); + } + + function testCachingFileGetCache() { + $this->init->config['Caching']['caching'] = 'file'; + $this->init->config['Caching']['path'] = dirname(__FILE__) . '/../../lib/IDS/tmp/default_filter.cache'; + $this->init->config['Caching']['expiration_time'] = 0; + $cache = IDS_Caching::factory($this->init, 'storage'); + $cache = $cache->setCache(array(1,2,3,4)); + $this->assertEquals($cache->getCache(), array(1,2,3,4)); + } + + function testCachingSession() { + $this->init->config['Caching']['caching'] = 'session'; + $this->assertTrue(IDS_Caching::factory($this->init, 'storage') instanceof IDS_Caching_Session); + } + + function testCachingSessionSetCache() { + $this->init->config['Caching']['caching'] = 'session'; + + $cache = IDS_Caching::factory($this->init, 'storage'); + $cache = $cache->setCache(array(1,2,3,4)); + $this->assertTrue($cache instanceof IDS_Caching_Session); + } + + function testCachingSessionGetCache() { + $this->init->config['Caching']['caching'] = 'session'; + + $cache = IDS_Caching::factory($this->init, 'storage'); + $cache = $cache->setCache(array(1,2,3,4)); + $this->assertEquals($cache->getCache(), array(1,2,3,4)); + } + + function testCachingSessionGetCacheDestroyed() { + $this->init->config['Caching']['caching'] = 'session'; + + $cache = IDS_Caching::factory($this->init, 'storage'); + $cache = $cache->setCache(array(1,2,3,4)); + $_SESSION['PHPIDS']['storage'] = null; + $this->assertFalse($cache->getCache()); + } + + function tearDown() { + @unlink(dirname(__FILE__) . '/../../lib/IDS/tmp/default_filter.cache'); + @unlink(dirname(__FILE__) . '/../../lib/IDS/tmp/memcache.timestamp'); + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/tests/IDS/EventTest.php b/dvwa/external/phpids/0.6/tests/IDS/EventTest.php new file mode 100644 index 0000000..da75660 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/IDS/EventTest.php @@ -0,0 +1,85 @@ +event = new IDS_Event("handled_key", "my val", + array( + new IDS_Filter(1, '^test$', 'my description', array('tag1', 'tag2'), 10), + new IDS_Filter(1, '^test2$', 'my other desc', array('tag2', 'tag3'), 4) + ) + ); + } + + public function testName() + { + $this->assertEquals('handled_key', $this->event->getName()); + $this->assertEquals("my val", $this->event->getValue()); + } + + public function testValueAggregation() + { + $this->assertEquals(14, $this->event->getImpact()); + $this->assertEquals(array('tag1', 'tag2', 'tag3'), $this->event->getTags()); + } + + public function testIterator() + { + $regexps = array('^test$', '^test2$'); + foreach ($this->event as $key => $filter) + $this->assertEquals($regexps[$key], $filter->getRule()); + foreach ($this->event->getFilters() as $key => $filter) + $this->assertEquals($regexps[$key], $filter->getRule()); + } + + public function testCount() + { + $this->assertEquals(2, count($this->event)); + } + + public function testCopy() + { + $filters = $this->event->getFilters(); + $filter[] = "foo"; + $this->assertEquals(2, count($this->event)); + } + + public function testIteratorAggregate() + { + $this->assertType('IteratorAggregate', $this->event); + $this->assertType('IteratorAggregate', $this->event->getIterator()); + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/tests/IDS/ExceptionTest.php b/dvwa/external/phpids/0.6/tests/IDS/ExceptionTest.php new file mode 100644 index 0000000..84d5764 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/IDS/ExceptionTest.php @@ -0,0 +1,112 @@ +report = new IDS_Report(array( + new IDS_Event("key_a", 'val_b', + array( + new IDS_Filter(1, '^test_a1$', 'desc_a1', array('tag_a1', 'tag_a2'), 1), + new IDS_Filter(1, '^test_a2$', 'desc_a2', array('tag_a2', 'tag_a3'), 2) + ) + ), + new IDS_Event('key_b', 'val_b', + array( + new IDS_Filter(1, '^test_b1$', 'desc_b1', array('tag_b1', 'tag_b2'), 3), + new IDS_FIlter(1, '^test_b2$', 'desc_b2', array('tag_b2', 'tag_b3'), 4), + ) + ) + )); + + $this->path = dirname(__FILE__) . '/../../lib/IDS/Config/Config.ini'; + $this->init = IDS_Init::init($this->path); + } + + public function testEventConstructorExceptions1() { + $this->setExpectedException('InvalidArgumentException'); + new IDS_Event(array(1,2), 'val_b', + array( + new IDS_Filter(1, '^test_a1$', 'desc_a1', array('tag_a1', 'tag_a2'), 1), + new IDS_Filter(1, '^test_a2$', 'desc_a2', array('tag_a2', 'tag_a3'), 2) + ) + ); + } + + public function testEventConstructorExceptions2() { + $this->setExpectedException('InvalidArgumentException'); + new IDS_Event("key_a", array(1,2), + array( + new IDS_Filter(1, '^test_a1$', 'desc_a1', array('tag_a1', 'tag_a2'), 1), + new IDS_Filter(1, '^test_a2$', 'desc_a2', array('tag_a2', 'tag_a3'), 2) + ) + ); + } + + public function testEventConstructorExceptions3() { + $this->setExpectedException('InvalidArgumentException'); + new IDS_Event("key_a", 'val_b', array(1,2)); + } + + public function testGetEventException() { + $this->setExpectedException('InvalidArgumentException'); + $this->assertEquals($this->report->getEvent(array(1,2,3)), $this->getExpectedException()); + } + + public function testHasEventException() { + $this->setExpectedException('InvalidArgumentException'); + $this->assertEquals($this->report->hasEvent(array(1,2,3)), $this->getExpectedException()); + } + + public function testInitConfigWrongPathException() { + $this->setExpectedException('Exception'); + $this->assertEquals(IDS_Init::init('IDS/Config/Config.ini.wrong'), $this->getExpectedException()); + } + + public function testWrongXmlFilterPathException() { + $this->setExpectedException('Exception'); + $this->init->config['General']['filter_type'] = 'xml'; + $this->init->config['General']['filter_path'] = 'IDS/wrong_path'; + $this->assertEquals(new IDS_Monitor(array('test', 'bla'), $this->init), $this->getExpectedException()); + } + + public function tearDown() { + $this->init->config['General']['filter_type'] = 'xml'; + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/tests/IDS/FilterTest.php b/dvwa/external/phpids/0.6/tests/IDS/FilterTest.php new file mode 100644 index 0000000..4d284cd --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/IDS/FilterTest.php @@ -0,0 +1,97 @@ +path = dirname(__FILE__) . '/../../lib/IDS/Config/Config.ini'; + $this->init = IDS_Init::init($this->path); + } + + public function testObjectConstruction() + { + $filter = new IDS_Filter(1, '^test$', 'My description', array('foo', 'bar'), 12); + + $this->assertTrue($filter->match('test')); + $this->assertEquals("My description", $filter->getDescription(), "Should return description"); + $this->assertEquals(array("foo", "bar"), $filter->getTags(), "Should return array/list of tags"); + $this->assertEquals('^test$', $filter->getRule()); + $this->assertEquals(12, $filter->getImpact()); + } + + public function testModificator() + { + $filter = new IDS_Filter(1, '^te.st$', 'My description', array('tag1', 'tag2'), 1); + + // Default must be + // ... case-insensitive + $this->assertTrue($filter->match('TE1ST')); + // ... dot all (\n is matched by .) + $this->assertTrue($filter->match("TE\nST")); + // .. "$" is end only #has changed since modifiers are ims + $this->assertTrue($filter->match("TE1ST\n")); + + } + + public function testExceptions() + { + $filter = new IDS_Filter(1, '^test$', 'My description', array('foo', 'bar'), 10); + + try { + $filter->match(1); + $this->fail("Expected Exception"); + } catch (Exception $e) {} + + + try { + $filter = new IDS_Filter(1, '^test$', 'my desc', array('foo'), 'test'); + $this->fail("Expected Exception"); + } catch (Exception $e) {} + + try { + $filter = new IDS_Filter(1, 1, 'my desc', array("foo"), 'bla'); + $this->fail("Excpected Exception"); + } catch (Exception $e) {} + + } + + public function testFilterSetFilterSet() { + + $this->init->config['General']['filter_type'] = 'xml'; + $this->init->config['General']['filter_path'] = dirname(__FILE__) . '/../../lib/IDS/default_filter.xml'; + $this->storage = new IDS_Filter_Storage($this->init); + $filter = array(); + $filter[] = new IDS_Filter(1, 'test', 'test2', array(), 1); + $this->assertTrue($this->storage->setFilterSet($filter) instanceof IDS_Filter_Storage); + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/tests/IDS/InitTest.php b/dvwa/external/phpids/0.6/tests/IDS/InitTest.php new file mode 100644 index 0000000..cf95eb6 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/IDS/InitTest.php @@ -0,0 +1,90 @@ +path = dirname(__FILE__) . '/../../lib/IDS/Config/Config.ini'; + $this->init = IDS_Init::init($this->path); + } + + function testInit() { + $this->assertTrue($this->init instanceof IDS_Init); + } + + function testInitConfig() { + $keys = array('General', 'Logging', 'Caching'); + $this->assertEquals($keys, array_keys($this->init->config)); + } + + function testInitClone() { + $config2 = clone $this->init; + $this->assertEquals($config2, $this->init); + } + + function testInitGetConfigPath() { + $this->assertEquals($this->init->getConfigPath(), $this->path); + } + + function testInitSetConfigOverwrite() { + $this->init->setConfig(array('General' => array('filter_type' => 'json')), true); + $this->assertEquals($this->init->config['General']['filter_type'], 'json'); + + $this->init->setConfig( + array('General' => array('exceptions' => array('foo'))), + true + ); + $this->assertSame( + array('foo', '__utmc'), + $this->init->config['General']['exceptions'] + ); + } + + function testInitSetConfigNoOverwrite() { + $this->init->setConfig(array('General' => array('filter_type' => 'xml')), true); + $this->init->setConfig(array('General' => array('filter_type' => 'json'))); + $this->assertEquals($this->init->config['General']['filter_type'], 'xml'); + } + + function testInitGetConfig() { + $data = $this->init->getConfig(); + $this->assertEquals($this->init->config, $data); + } + + function testInstanciatingInitObjectWithoutPassingConfigFile() + { + $init = IDS_Init::init(); + $this->assertType('IDS_Init', $init); + $this->assertSame($init, IDS_Init::init()); + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/tests/IDS/MonitorTest.php b/dvwa/external/phpids/0.6/tests/IDS/MonitorTest.php new file mode 100644 index 0000000..f32850e --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/IDS/MonitorTest.php @@ -0,0 +1,1389 @@ +init = IDS_Init::init($path); + $this->init->config['General']['filter_path'] = dirname(__FILE__) . '/../../lib/IDS/default_filter.xml'; + $this->init->config['General']['tmp_path'] = dirname(__FILE__) . '/../../lib/IDS/tmp'; + $this->init->config['Caching']['path'] = dirname(__FILE__) . '/../../lib/IDS/tmp/default_filter.cache'; + } + + public function testGetHTML() { + $test = new IDS_Monitor( + array('user' => 'admin

      headline

      copytext

      '; + $exploits['html_7'] = ''; + $exploits['html_8'] = '1'; + $exploits['html_8'] = '\' OR 1=1--'; + + $this->init->config['General']['HTML_Purifier_Cache'] = dirname(__FILE__) . '/../../lib/IDS/tmp/'; + $test = new IDS_Monitor( + $exploits, + $this->init + ); + $test->setHtml(array_keys($exploits)); + $result = $test->run(); + $this->assertFalse($result->hasEvent(1)); + $this->assertEquals(163, $result->getImpact()); + } + + public function testAllowedHTMLScanningNegative() { + $exploits = array(); + $exploits['html_1'] = 'Google'; + $exploits['html_2'] = '
      Test
      test
      '; + $exploits['html_3'] = ' + + + + +
      +   FEEDBACK on my thesis on Session Management: SESSION FIXATION + 81 euronymous + 06/01/2008 04:05AM 
      + Last Post by euronymous +
      '; + $exploits['html_4'] = ''; + $exploits['html_5'] = '

      headline

      copytext

      +

      bodytext © 2008

      test +

      '; + $exploits['html_6'] = '
      '; + + $this->init->config['General']['HTML_Purifier_Cache'] = dirname(__FILE__) . '/../../lib/IDS/tmp/'; + $test = new IDS_Monitor( + $exploits, + $this->init + ); + $test->setHtml(array_keys($exploits)); + $result = $test->run(); + $this->assertFalse($result->hasEvent(1)); + $this->assertEquals(0, $result->getImpact()); + } + + public function testJSONScanning() { + + $exploits = array(); + $exploits['json_1'] = '{"a":"b","c":[">", 111, "eval(name)"]}'; + $test = new IDS_Monitor( + $exploits, + $this->init + ); + $test->setJson(array_keys($exploits)); + $result = $test->run(); + $this->assertEquals(32, $result->getImpact()); + } + + public function testForFalseAlerts() { + + $exploits = array(); + $exploits[] = 'war bereits als Gastgeber automatisch für das Turnier qualifiziert. Die restlichen 15 Endrundenplätze wurden zwischen Juni + 2005 und Mai 2007 ermittelt. Hierbei waren mit Ausnahme der UEFA-Zone die jeweiligen Kontinentalmeisterschaften gleichzeitig + das Qualifikationsturnier für die Weltmeisterschaft. Die UEFA stellt bei der Endrunde fünf Mannschaften. Die Teilnehmer wurden in + einer Qualifikationsphase ermittelt, die am 9. Juli 2005 startete und am 30. September 2006 endete. Hierbei wurden die 25 Mannschaften der Kategorie A in fünf + Gruppen zu je 5 Mannschaften eingeteilt, wobei sich die fünf Gruppensieger für die Endrunde qualifizierten. Das erste europäische Ticket löste Norwegen am 27. + August 2006. Am 24. September folgte Schweden, drei Tage später konnten sich auch der amtierende Weltmeister Deutschland und Dänemark für die Endrunde qualifizieren. + England sicherte sich am 30. September 2006 das letzte Ticket gegen Frankreich. Die Mannschaften der Kategorie B spielten lediglich um den Aufstieg in die A-Kategorie. + Dem südamerikanischen Fußballverband CONMEBOL standen zwei Startpätze zu. Sie wurden bei der Sudamericano Femenino 2006, welche vom 10. bis 26. November 2006 + im argentinischen Mar del Plata ausgetragen wurde, vergeben. Argentinien gewann das Turnier überraschend vor Brasilien. Beide Mannschaften qualifizierten sich + für die Endrunde. Die zwei nordamerikanischen Teilnehmer wurden beim CONCACAF Women\'s Gold Cup 2006 in den Vereinigten Staaten ermittelt. Das Turnier fand in + der Zeit vom 19. bis zum 30. November 2006 in Carson und Miami statt. Sieger wurde das US-amerikanische Team vor Kanada. Die drittplatzierten Mexikanerinnen + spielten gegen den Asien-Vierten Japan um einen weiteren Startplatz, scheiterten aber in den Play-Off-Spielen. Die Afrikameisterschaft der Frauen wurde vom 28. + Oktober bis zum 11. November 2006 in Nigeria ausgetragen. Die Mannschaft der Gastgeber setzte sich im Finale gegen Ghana durch. Beide Mannschaften werden den + afrikanischen Fußballverband bei der WM vertreten. Die Asienmeisterschaft der Frauen fand im Juli 2006 in Australien statt. Neben den Chinesinnen, die sich mit + einem Sieg über den Gastgeber den Titel sicherten, qualifizierten sich zudem die Australierinnen sowie die drittplatzierten Nordkoreanerinnen für die Endrunde. + Japan setzte sich wie 2003 in den Play-Off-Spielen gegen Mexiko (2:0 und 1:2) durch. Ozeanien hat einen direkten Startplatz, + der bei der Ozeanischen Frauenfußballmeisterschaft im April 2007 vergeben wurde. Neuseeland bezwang Papua-Neuguinea mit 7:0 und sicherte sich damit + das Ticket für die Weltmeisterschaft.'; + $exploits[] = 'Thatcher föddes som Margaret Hilda Roberts i staden Grantham i Lincolnshire, England. Hennes far var Alfred Roberts, som ägde en speceriaffär i + staden, var aktiv i lokalpolitiken (och hade ämbetet alderman), samt var metodistisk lekmannapredikant. Roberts kom från en liberal familj men kandiderade?som då var + praxis i lokalpolitik?som oberoende. Han förlorade sin post som Alderman 1952 efter att Labourpartiet fick sin första majoritet i Grantham Council 1950. Hennes mor var + Beatrice Roberts, född Stephenson, och hon hade en syster, Muriel (1921-2004). Thatcher uppfostrades som metodist och har förblivit kristen under hela sitt liv.[1] + Thatcher fick bra resultat i skolan. Hon gick i en grammar school för flickor (Kesteven) och kom sedan till Somerville College, Oxfords universitet 1944 för att studera + Xylonite och sedan J. Lyons and Co., där hon medverkade till att ta fram metoder för att bevara glass. Hon ingick i den grupp som utvecklade den första frysta mjukglassen. + Hon var också medlem av Association of Scientific Workers. Politisk karriär mellan 1950 och 1970 [redigera] Vid valen 1950 och 1951 ställde Margaret Roberts upp i v + alkretsen Dartford, som var en säker valkrets för Labour. Hon var då den yngsta kvinnliga konservativa kandidaten någonsin. Medan hon var aktiv i det konservativa pa + ficerad som barrister 1953. Samma år föddes hennes tvillingbarn Carol och Mark. Som advokat specialiserade hon sig på skatterätt. Thatcher började sedan leta efter en + för Finchley i april 1958. Hon invaldes med god marginal i valet 1959 och tog säte i underhuset. Hennes jungfrutal var till stöd för hennes eget förslag om att tvinga + kommunala församlingar att hålla möten offentligt, vilket blev antaget. 1961 gick hon emot partilinjen genom att rösta för återinförande av bestraffning med ris. Hon + befordrades tidigt till regeringen som underordnad minister (Parliamentary Secretary) i ministeriet för pensioner och socialförsäktingar (Ministry of Pensions and + National Insurance) i september 1961. Hon behöll denna post tills de konservativa förlorade makten i valet 1964. När Sir Alec Douglas-Home avgick röstade Thatcher för + Edward Heath i valet av partiledare 1965. När Heath hade segrat belönades hon med att bli de konservativas talesman i bostads- och markfrågor. Hon antog den politik + som hade utvecklats av hennes kollega James Allason, att sälja kommunägda bostäder till deras hyresgäster. Detta blev populärt i senare val[2]. Hon flyttade till + skuggfinansgruppen efter 1966..'; + $exploits[] = "Results are 'true' or 'false'."; + $exploits[] = "Choose between \"red\" and \"green\". "; + $exploits[] = "SQL Injection contest is coming in around '1 OR '2 weeks."; + $exploits[] = "select *something* from the menu"; + $exploits[] = ''; + $exploits[] = 'website_link => /app/search?op=search;keywords=peter%20testcase;'; + $exploits[] = 'insertinserterrorherrorhostnameabip10.2.2.22asset2thresholdc30thresholda30rrd_profilenatnsens1osUnknownmacmacvendordescr'; + $exploits[] = '"hi" said the mouse to the cat and \'showed off\' her options'; + $exploits[] = 'eZtwEI9v7nI1mV4Baw502qOhmGZ6WJ0ULN1ufGmwN5j+k3L6MaI0Hv4+RlOo42rC0KfrwUUm5zXOfy9Gka63m02fdsSp52nhK0Jsniw2UgeedUvn0SXfNQc/z13/6mVkcv7uVN63o5J8xzK4inQ1raknqYEwBHvBI8WGyJ0WKBMZQ26Nakm963jRb18Rzv6hz1nlf9cAOH49EMiD4vzd1g=='; + $exploits[] = '"European Business School (ebs)"'; + $exploits[] = '"Deutsche Journalistenschule (DJS)"'; + $exploits[] = '"Cambridge First Certificate FCE (2000)"'; + $exploits[] = 'Universität Karlsruhe (TH)'; + $exploits[] = 'Psychologie, Coaching und Training, Wissenserlangung von Führungskräften, Menschen bewegen, Direktansprache, Erfolg, Spaß, Positiv Thinking and Feeling, Natur, Kontakte pflegen, Face to Face Contact, Sport/Fitness (Fussball, Beachvolleyball, Schwimmen, Laufen, Krafttraining, Bewegungsübungen uvm.), Wellness & Beauty'; + $exploits[] = 'Großelternzeit - (Sachbearbeiter Lightfline)'; + $exploits[] = '{HMAC-SHA1}{48de2031}{8AgxrQ==}'; + $exploits[] = 'exchange of experience in (project) management and leadership • always interested in starting up business and teams • people with a passion • new and lost international contacts'; + $exploits[] = 'Highly mobile (Project locations: Europe & Asia), You are a team player'; + $exploits[] = "'Reservist, Status: Stabsoffizier'"; + $exploits[] = ')))) да второй состав в отличной форме, не оставили парням ни единого шанса!!! Я думаю нас jedi, можно в первый переводить ))) '; + + $test = new IDS_Monitor( + $exploits, + $this->init + ); + $result = $test->run(); + + $this->assertFalse($result->hasEvent(1)); + $this->assertEquals(0, $result->getImpact()); + } + + /** + * This method checks for the plain event of every single + * exploit array item + * + * @access private + * @param array $exploits + */ + private function _testForPlainEvent($exploits = array()) { + + foreach($exploits as $exploit) { + $test = new IDS_Monitor( + array('test' => $exploit), + $this->init + ); + $result = $test->run(); + + if($result->getImpact() === 0) { + echo "\n\nNot detected: ".$exploit."\n\n"; + } + $this->assertTrue($result->getImpact() > 0); + } + } + + public function assertImpact(IDS_Report $result, $impact, $suhosinImpact) + { + if (extension_loaded('suhosin')) { + $this->assertSame($suhosinImpact, $result->getImpact()); + } else { + $this->assertSame($impact, $result->getImpact()); + } + } +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/tests/IDS/ReportTest.php b/dvwa/external/phpids/0.6/tests/IDS/ReportTest.php new file mode 100644 index 0000000..642aa2f --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/IDS/ReportTest.php @@ -0,0 +1,123 @@ +report = new IDS_Report(array( + new IDS_Event("key_a", 'val_b', + array( + new IDS_Filter(1, '^test_a1$', 'desc_a1', array('tag_a1', 'tag_a2'), 1), + new IDS_Filter(1, '^test_a2$', 'desc_a2', array('tag_a2', 'tag_a3'), 2) + ) + ), + new IDS_Event('key_b', 'val_b', + array( + new IDS_Filter(1, '^test_b1$', 'desc_b1', array('tag_b1', 'tag_b2'), 3), + new IDS_FIlter(1, '^test_b2$', 'desc_b2', array('tag_b2', 'tag_b3'), 4), + ) + ) + )); + } + + public function testEmpty() + { + $this->assertFalse($this->report->isEmpty()); + $report = new IDS_Report; + $this->assertTrue($report->isEmpty()); + } + + public function testCountable() + { + $this->assertEquals(2, count($this->report)); + } + + public function testGetterByName() + { + $this->assertEquals("key_a", $this->report->getEvent("key_a")->getName()); + $this->assertEquals("key_b", $this->report->getEvent("key_b")->getName()); + } + + public function testGetTags() + { + $this->assertEquals(array('tag_a1', 'tag_a2', 'tag_a3', 'tag_b1', 'tag_b2', 'tag_b3'), $this->report->getTags()); + } + + public function testImpactSum() + { + $this->assertEquals(10, $this->report->getImpact()); + } + + public function testHasEvent() + { + $this->assertTrue($this->report->hasEvent('key_a')); + } + + public function testAddingAnotherEventAfterCalculation() + { + $this->testImpactSum(); + $this->testGetTags(); + $this->report->addEvent(new IDS_Event('key_c', 'val_c', array(new IDS_Filter(1, 'test_c1', 'desc_c1', array('tag_c1'), 10)))); + $this->assertEquals(20, $this->report->getImpact()); + $this->assertEquals(array('tag_a1', 'tag_a2', 'tag_a3', 'tag_b1', 'tag_b2', 'tag_b3', 'tag_c1'), $this->report->getTags()); + } + + public function testIteratorAggregate() + { + $this->assertType('IteratorAggregate', $this->report); + $this->assertType('IteratorAggregate', $this->report->getIterator()); + } + + public function testToString() + { + $this->assertEquals(preg_match('/Total impact: 10/', $this->report->__toString()),1); + } + + public function testToStringEmpty() + { + $this->report = new IDS_Report(); + $this->assertEquals('', $this->report->__toString()); + } + + public function testGetEvent() { + $this->report->addEvent(new IDS_Event('key_c', 'val_c', array(new IDS_Filter(1, 'test_c1', 'desc_c1', array('tag_c1'), 10)))); + $this->assertTrue($this->report->getEvent('key_c') instanceof IDS_Event); + } + + public function testGetEventWrong() { + $this->assertFalse($this->report->getEvent('not_available')); + } + +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/tests/allTests.php b/dvwa/external/phpids/0.6/tests/allTests.php new file mode 100644 index 0000000..e8e074b --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/allTests.php @@ -0,0 +1,73 @@ +addTestSuite('IDS_MonitorTest'); + require_once 'IDS/ReportTest.php'; + $suite->addTestSuite('IDS_ReportTest'); + require_once 'IDS/InitTest.php'; + $suite->addTestSuite('IDS_InitTest'); + require_once 'IDS/ExceptionTest.php'; + $suite->addTestSuite('IDS_ExceptionTest'); + require_once 'IDS/FilterTest.php'; + $suite->addTestSuite('IDS_FilterTest'); + require_once 'IDS/CachingTest.php'; + $suite->addTestSuite('IDS_CachingTest'); + require_once 'IDS/EventTest.php'; + $suite->addTestSuite('IDS_EventTest'); + return $suite; + } +} + +if (PHPUnit_MAIN_METHOD == 'allTests') { + allTests::main(); +} + +/** + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 expandtab + */ diff --git a/dvwa/external/phpids/0.6/tests/coverage/Caching.html b/dvwa/external/phpids/0.6/tests/coverage/Caching.html new file mode 100644 index 0000000..4b57e0b --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Caching.html @@ -0,0 +1,229 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current directory:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Caching
      Legend: + + Low: 0% to 35% + + + Medium: 35% to 70% + + + High: 70% to 100% + +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%3 / 3 + + + + +
      100.00 %100.00%
      +
      100.00%10 / 10 + + + + +
      87.50 %87.50%
      +
      87.50%63 / 72
       
      Factory.php + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%17 / 17
      File.php + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%5 / 5 + + + + +
      77.50 %77.50%
      +
      77.50%31 / 40
      Interface.php + + + + +
      100.00 %100.00%
      +
      100.00%0 / 0 + + + + +
      100.00 %100.00%
      +
      100.00%0 / 0 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
      Session.php + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%4 / 4 + + + + +
      100.00 %100.00%
      +
      100.00%14 / 14
      +
      + +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Caching_Factory.php.html b/dvwa/external/phpids/0.6/tests/coverage/Caching_Factory.php.html new file mode 100644 index 0000000..e7a1b53 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Caching_Factory.php.html @@ -0,0 +1,382 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current file:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Caching/Factory.php
      Legend: + executed + not executed + dead code +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%17 / 17
       
      IDS_Caching + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%17 / 17
       public static function factory($init, $type) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%17 / 17
      +
      + +
      + + + + + + + + +

      +
      +       1                 : <?php                                                                         
      +       2                 :                                                                               
      +       3                 : /**                                                                           
      +       4                 :  * PHPIDS                                                                     
      +       5                 :  *                                                                            
      +       6                 :  * Requirements: PHP5, SimpleXML                                              
      +       7                 :  *                                                                            
      +       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                       
      +       9                 :  *                                                                            
      +      10                 :  * PHPIDS is free software; you can redistribute it and/or modify             
      +      11                 :  * it under the terms of the GNU Lesser General Public License as published by
      +      12                 :  * the Free Software Foundation, version 3 of the License, or                 
      +      13                 :  * (at your option) any later version.                                        
      +      14                 :  *                                                                            
      +      15                 :  * PHPIDS is distributed in the hope that it will be useful,                  
      +      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of             
      +      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the               
      +      18                 :  * GNU Lesser General Public License for more details.                        
      +      19                 :  *                                                                            
      +      20                 :  * You should have received a copy of the GNU Lesser General Public License   
      +      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.             
      +      22                 :  *                                                                            
      +      23                 :  * PHP version 5.1.6+                                                         
      +      24                 :  *                                                                            
      +      25                 :  * @category Security                                                         
      +      26                 :  * @package  PHPIDS                                                           
      +      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                      
      +      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                            
      +      29                 :  * @author   Lars Strojny <lars@strojny.net>                                  
      +      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                       
      +      31                 :  * @link     http://php-ids.org/                                              
      +      32                 :  */                                                                           
      +      33                 :                                                                               
      +      34                 : /**                                                                           
      +      35                 :  * Caching factory                                                            
      +      36                 :  *                                                                            
      +      37                 :  * This class is used as a factory to load the correct concrete caching       
      +      38                 :  * implementation.                                                            
      +      39                 :  *                                                                            
      +      40                 :  * @category  Security                                                        
      +      41                 :  * @package   PHPIDS                                                          
      +      42                 :  * @author    Christian Matthies <ch0012@gmail.com>                           
      +      43                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                     
      +      44                 :  * @author    Lars Strojny <lars@strojny.net>                                 
      +      45                 :  * @copyright 2007 The PHPIDS Group                                           
      +      46                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                      
      +      47                 :  * @version   Release: $Id:Factory.php 517 2007-09-15 15:04:13Z mario $       
      +      48                 :  * @link      http://php-ids.org/                                             
      +      49                 :  * @since     Version 0.4                                                     
      +      50                 :  */                                                                           
      +      51                 : class IDS_Caching                                                             
      +      52                 : {                                                                             
      +      53                 :                                                                               
      +      54                 :     /**                                                                       
      +      55                 :      * Factory method                                                         
      +      56                 :      *                                                                        
      +      57                 :      * @param array  $init the IDS_Init object                                
      +      58                 :      * @param string $type the caching type                                   
      +      59                 :      *                                                                        
      +      60                 :      * @return object the caching facility                                    
      +      61                 :      */                                                                       
      +      62                 :     public static function factory($init, $type)                              
      +      63                 :     {                                                                         
      +      64                 :                                                                               
      +      65              50 :         $object  = false;                                                     
      +      66              50 :         $wrapper = preg_replace(                                              
      +      67              50 :             '/\W+/m',                                                         
      +      68              50 :             null,                                                             
      +      69              50 :             ucfirst($init->config['Caching']['caching'])                      
      +      70              50 :         );                                                                    
      +      71              50 :         $class   = 'IDS_Caching_' . $wrapper;                                 
      +      72              50 :         $path    = dirname(__FILE__) . DIRECTORY_SEPARATOR .                  
      +      73              50 :             $wrapper . '.php';                                                
      +      74                 :                                                                               
      +      75              50 :         if (file_exists($path)) {                                             
      +      76              49 :             include_once $path;                                               
      +      77                 :                                                                               
      +      78              49 :             if (class_exists($class)) {                                       
      +      79              49 :                 $object = call_user_func(array($class, 'getInstance'),        
      +      80              49 :                     $type, $init);                                            
      +      81              49 :             }                                                                 
      +      82              49 :         }                                                                     
      +      83                 :                                                                               
      +      84              50 :         return $object;                                                       
      +      85                 :     }                                                                         
      +      86                 : }                                                                             
      +      87                 :                                                                               
      +      88                 : /*                                                                            
      +      89                 :  * Local variables:                                                           
      +      90                 :  * tab-width: 4                                                               
      +      91                 :  * c-basic-offset: 4                                                          
      +      92                 :  * End:                                                                       
      +
      +
      +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Caching_File.php.html b/dvwa/external/phpids/0.6/tests/coverage/Caching_File.php.html new file mode 100644 index 0000000..9343223 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Caching_File.php.html @@ -0,0 +1,647 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current file:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Caching/File.php
      Legend: + executed + not executed + dead code +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%5 / 5 + + + + +
      77.50 %77.50%
      +
      77.50%31 / 40
       
      IDS_Caching_File + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%5 / 5 + + + + +
      76.92 %76.92%
      +
      76.92%30 / 39
       public function __construct($type, $init) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      62.50 %62.50%
      +
      62.50%5 / 8
       public static function getInstance($type, $init) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%4 / 4
       public function setCache(array $data) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      71.43 %71.43%
      +
      71.43%10 / 14
       public function getCache() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%5 / 5
       protected function readFile($filename) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      71.43 %71.43%
      +
      71.43%5 / 7
      +
      + +
      + + + + + + + + +

      +
      +       1                 : <?php                                                                           
      +       2                 :                                                                                 
      +       3                 : /**                                                                             
      +       4                 :  * PHPIDS                                                                       
      +       5                 :  *                                                                              
      +       6                 :  * Requirements: PHP5, SimpleXML                                                
      +       7                 :  *                                                                              
      +       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                         
      +       9                 :  *                                                                              
      +      10                 :  * PHPIDS is free software; you can redistribute it and/or modify               
      +      11                 :  * it under the terms of the GNU Lesser General Public License as published by  
      +      12                 :  * the Free Software Foundation, version 3 of the License, or                   
      +      13                 :  * (at your option) any later version.                                          
      +      14                 :  *                                                                              
      +      15                 :  * PHPIDS is distributed in the hope that it will be useful,                    
      +      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of               
      +      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                 
      +      18                 :  * GNU Lesser General Public License for more details.                          
      +      19                 :  *                                                                              
      +      20                 :  * You should have received a copy of the GNU Lesser General Public License     
      +      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.               
      +      22                 :  *                                                                              
      +      23                 :  * PHP version 5.1.6+                                                           
      +      24                 :  *                                                                              
      +      25                 :  * @category Security                                                           
      +      26                 :  * @package  PHPIDS                                                             
      +      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                        
      +      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                              
      +      29                 :  * @author   Lars Strojny <lars@strojny.net>                                    
      +      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                         
      +      31                 :  * @link     http://php-ids.org/                                                
      +      32                 :  */                                                                             
      +      33                 :                                                                                 
      +      34               1 : require_once 'IDS/Caching/Interface.php';                                       
      +      35                 :                                                                                 
      +      36                 : /**                                                                             
      +      37                 :  * File caching wrapper                                                         
      +      38                 :  *                                                                              
      +      39                 :  * This class inhabits functionality to get and set cache via a static flatfile.
      +      40                 :  *                                                                              
      +      41                 :  * @category  Security                                                          
      +      42                 :  * @package   PHPIDS                                                            
      +      43                 :  * @author    Christian Matthies <ch0012@gmail.com>                             
      +      44                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                       
      +      45                 :  * @author    Lars Strojny <lars@strojny.net>                                   
      +      46                 :  * @copyright 2007 The PHPIDS Group                                             
      +      47                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                        
      +      48                 :  * @version   Release: $Id:File.php 517 2007-09-15 15:04:13Z mario $            
      +      49                 :  * @link      http://php-ids.org/                                               
      +      50                 :  * @since     Version 0.4                                                       
      +      51                 :  */                                                                             
      +      52               1 : class IDS_Caching_File implements IDS_Caching_Interface                         
      +      53                 : {                                                                               
      +      54                 :                                                                                 
      +      55                 :     /**                                                                         
      +      56                 :      * Caching type                                                             
      +      57                 :      *                                                                          
      +      58                 :      * @var string                                                              
      +      59                 :      */                                                                         
      +      60                 :     private $type = null;                                                       
      +      61                 :                                                                                 
      +      62                 :     /**                                                                         
      +      63                 :      * Cache configuration                                                      
      +      64                 :      *                                                                          
      +      65                 :      * @var array                                                               
      +      66                 :      */                                                                         
      +      67                 :     private $config = null;                                                     
      +      68                 :                                                                                 
      +      69                 :     /**                                                                         
      +      70                 :      * Path to cache file                                                       
      +      71                 :      *                                                                          
      +      72                 :      * @var string                                                              
      +      73                 :      */                                                                         
      +      74                 :     private $path = null;                                                       
      +      75                 :                                                                                 
      +      76                 :     /**                                                                         
      +      77                 :      * Holds an instance of this class                                          
      +      78                 :      *                                                                          
      +      79                 :      * @var object                                                              
      +      80                 :      */                                                                         
      +      81                 :     private static $cachingInstance = null;                                     
      +      82                 :                                                                                 
      +      83                 :     /**                                                                         
      +      84                 :      * Constructor                                                              
      +      85                 :      *                                                                          
      +      86                 :      * @param string $type caching type                                         
      +      87                 :      * @param array  $init the IDS_Init object                                  
      +      88                 :      *                                                                          
      +      89                 :      * @return void                                                             
      +      90                 :      */                                                                         
      +      91                 :     public function __construct($type, $init)                                   
      +      92                 :     {                                                                           
      +      93                 :                                                                                 
      +      94               1 :         $this->type   = $type;                                                  
      +      95               1 :         $this->config = $init->config['Caching'];                               
      +      96               1 :         $this->path   = $init->getBasePath() . $this->config['path'];           
      +      97                 :                                                                                 
      +      98               1 :         if (file_exists($this->path) && !is_writable($this->path)) {            
      +      99               0 :             throw new Exception('Make sure all files in ' .                     
      +     100               0 :             htmlspecialchars($this->path, ENT_QUOTES, 'UTF-8') .                
      +     101               0 :                 'are writeable!');                                              
      +     102                 :         }                                                                       
      +     103               1 :     }                                                                           
      +     104                 :                                                                                 
      +     105                 :     /**                                                                         
      +     106                 :      * Returns an instance of this class                                        
      +     107                 :      *                                                                          
      +     108                 :      * @param string $type caching type                                         
      +     109                 :      * @param array  $init the IDS_Init object                                  
      +     110                 :      *                                                                          
      +     111                 :      * @return object $this                                                     
      +     112                 :      */                                                                         
      +     113                 :     public static function getInstance($type, $init)                            
      +     114                 :     {                                                                           
      +     115              45 :         if (!self::$cachingInstance) {                                          
      +     116               1 :             self::$cachingInstance = new IDS_Caching_File($type, $init);        
      +     117               1 :         }                                                                       
      +     118                 :                                                                                 
      +     119              45 :         return self::$cachingInstance;                                          
      +     120                 :     }                                                                           
      +     121                 :                                                                                 
      +     122                 :     /**                                                                         
      +     123                 :      * Writes cache data into the file                                          
      +     124                 :      *                                                                          
      +     125                 :      * @param array $data the cache data                                        
      +     126                 :      *                                                                          
      +     127                 :      * @throws Exception if cache file couldn't be created                      
      +     128                 :      * @return object $this                                                     
      +     129                 :      */                                                                         
      +     130                 :     public function setCache(array $data)                                       
      +     131                 :     {                                                                           
      +     132              44 :         if (!is_writable(preg_replace('/[\/][^\/]+\.[^\/]++$/', null,           
      +     133              44 :             $this->path))) {                                                    
      +     134               0 :             throw new Exception('Temp directory ' .                             
      +     135               0 :             htmlspecialchars($this->path, ENT_QUOTES, 'UTF-8') .                
      +     136               0 :             ' seems not writable');                                             
      +     137                 :         }                                                                       
      +     138                 :                                                                                 
      +     139              44 :         if ((!file_exists($this->path) || (time()-filectime($this->path)) >     
      +     140              44 :             $this->config['expiration_time'])) {                                
      +     141               3 :             $handle = @fopen($this->path, 'w+');                                
      +     142                 :                                                                                 
      +     143               3 :             if (!$handle) {                                                     
      +     144               0 :                 throw new Exception("Cache file couldn't be created");          
      +     145                 :             }                                                                   
      +     146                 :                                                                                 
      +     147               3 :             fwrite($handle, serialize($data));                                  
      +     148               3 :             fclose($handle);                                                    
      +     149               3 :         }                                                                       
      +     150                 :                                                                                 
      +     151              44 :         return $this;                                                           
      +     152                 :     }                                                                           
      +     153                 :                                                                                 
      +     154                 :     /**                                                                         
      +     155                 :      * Returns the cached data                                                  
      +     156                 :      *                                                                          
      +     157                 :      * Note that this method returns false if either type or file cache is      
      +     158                 :      * not set                                                                  
      +     159                 :      *                                                                          
      +     160                 :      * @return mixed cache data or false                                        
      +     161                 :      */                                                                         
      +     162                 :     public function getCache()                                                  
      +     163                 :     {                                                                           
      +     164                 :                                                                                 
      +     165                 :         // make sure filters are parsed again if cache expired                  
      +     166              43 :         if (file_exists($this->path) && (time()-filectime($this->path)) <       
      +     167              43 :             $this->config['expiration_time']) {                                 
      +     168              42 :             $data = unserialize($this->readFile($this->path));                  
      +     169              42 :             return $data;                                                       
      +     170                 :         }                                                                       
      +     171                 :                                                                                 
      +     172               1 :         return false;                                                           
      +     173                 :     }                                                                           
      +     174                 :                                                                                 
      +     175                 :     /**                                                                         
      +     176                 :      * Read file and stripslashes if required                                   
      +     177                 :      *                                                                          
      +     178                 :      * @param string $filename Name of the file to read                         
      +     179                 :      * @return string                                                           
      +     180                 :      */                                                                         
      +     181                 :     protected function readFile($filename)                                      
      +     182                 :     {                                                                           
      +     183              42 :         @set_magic_quotes_runtime(0);                                           
      +     184              42 :         $content = file_get_contents($filename);                                
      +     185              42 :         if (function_exists('get_magic_quotes_runtime') and                     
      +     186              42 :             get_magic_quotes_runtime()) {                                       
      +     187                 :                                                                                 
      +     188               0 :             $content = stripslashes($content);                                  
      +     189               0 :         }                                                                       
      +     190              42 :         return $content;                                                        
      +     191                 :     }                                                                           
      +     192                 : }                                                                               
      +     193                 :                                                                                 
      +     194                 : /*                                                                              
      +     195                 :  * Local variables:                                                             
      +     196                 :  * tab-width: 4                                                                 
      +     197                 :  * c-basic-offset: 4                                                            
      +     198                 :  * End:                                                                         
      +     199                 :  */                                                                             
      +
      +
      +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Caching_Interface.php.html b/dvwa/external/phpids/0.6/tests/coverage/Caching_Interface.php.html new file mode 100644 index 0000000..56daf80 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Caching_Interface.php.html @@ -0,0 +1,228 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current file:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Caching/Interface.php
      Legend: + executed + not executed + dead code +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%0 / 0 + + + + +
      100.00 %100.00%
      +
      100.00%0 / 0 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       
      +
      + +
      + + + + + + + + +

      +
      +       1                 : <?php                                                                         
      +       2                 :                                                                               
      +       3                 : /**                                                                           
      +       4                 :  * PHPIDS                                                                     
      +       5                 :  *                                                                            
      +       6                 :  * Requirements: PHP5, SimpleXML                                              
      +       7                 :  *                                                                            
      +       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                       
      +       9                 :  *                                                                            
      +      10                 :  * PHPIDS is free software; you can redistribute it and/or modify             
      +      11                 :  * it under the terms of the GNU Lesser General Public License as published by
      +      12                 :  * the Free Software Foundation, version 3 of the License, or                 
      +      13                 :  * (at your option) any later version.                                        
      +      14                 :  *                                                                            
      +      15                 :  * PHPIDS is distributed in the hope that it will be useful,                  
      +      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of             
      +      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the               
      +      18                 :  * GNU Lesser General Public License for more details.                        
      +      19                 :  *                                                                            
      +      20                 :  * You should have received a copy of the GNU Lesser General Public License   
      +      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.             
      +      22                 :  *                                                                            
      +      23                 :  * PHP version 5.1.6+                                                         
      +      24                 :  *                                                                            
      +      25                 :  * @category Security                                                         
      +      26                 :  * @package  PHPIDS                                                           
      +      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                      
      +      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                            
      +      29                 :  * @author   Lars Strojny <lars@strojny.net>                                  
      +      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                       
      +      31                 :  * @link     http://php-ids.org/                                              
      +      32                 :  */                                                                           
      +      33                 :                                                                               
      +      34                 : /**                                                                           
      +      35                 :  * Caching wrapper interface                                                  
      +      36                 :  *                                                                            
      +      37                 :  * @category  Security                                                        
      +      38                 :  * @package   PHPIDS                                                          
      +      39                 :  * @author    Christian Matthies <ch0012@gmail.com>                           
      +      40                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                     
      +      41                 :  * @author    Lars Strojny <lars@strojny.net>                                 
      +      42                 :  * @copyright 2007 The PHPIDS Group                                           
      +      43                 :  * @version   SVN: $Id:Interface.php 517 2007-09-15 15:04:13Z mario $         
      +      44                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                      
      +      45                 :  * @since     Version 0.4                                                     
      +      46                 :  * @link      http://php-ids.org/                                             
      +      47                 :  */                                                                           
      +      48               1 : interface IDS_Caching_Interface                                               
      +      49                 : {                                                                             
      +      50                 :     /**                                                                       
      +      51                 :      * Interface method                                                       
      +      52                 :      *                                                                        
      +      53                 :      * @param array $data the cache data                                      
      +      54                 :      *                                                                        
      +      55                 :      * @return void                                                           
      +      56                 :      */                                                                       
      +      57                 :     public function setCache(array $data);                                    
      +      58                 :                                                                               
      +      59                 :     /**                                                                       
      +      60                 :      * Interface method                                                       
      +      61                 :      *                                                                        
      +      62                 :      * @return void                                                           
      +      63                 :      */                                                                       
      +      64                 :     public function getCache();                                               
      +      65                 : }                                                                             
      +      66                 :                                                                               
      +      67                 : /*                                                                            
      +      68                 :  * Local variables:                                                           
      +      69                 :  * tab-width: 4                                                               
      +      70                 :  * c-basic-offset: 4                                                          
      +      71                 :  * End:                                                                       
      +
      +
      +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Caching_Session.php.html b/dvwa/external/phpids/0.6/tests/coverage/Caching_Session.php.html new file mode 100644 index 0000000..0ce17e2 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Caching_Session.php.html @@ -0,0 +1,486 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current file:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Caching/Session.php
      Legend: + executed + not executed + dead code +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%4 / 4 + + + + +
      100.00 %100.00%
      +
      100.00%14 / 14
       
      IDS_Caching_Session + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%4 / 4 + + + + +
      100.00 %100.00%
      +
      100.00%13 / 13
       public function __construct($type, $init) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%3 / 3
       public static function getInstance($type, $init) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%4 / 4
       public function setCache(array $data) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%2 / 2
       public function getCache() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%3 / 3
      +
      + +
      + + + + + + + + +

      +
      +       1                 : <?php                                                                             
      +       2                 :                                                                                   
      +       3                 : /**                                                                               
      +       4                 :  * PHPIDS                                                                         
      +       5                 :  *                                                                                
      +       6                 :  * Requirements: PHP5, SimpleXML                                                  
      +       7                 :  *                                                                                
      +       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                           
      +       9                 :  *                                                                                
      +      10                 :  * PHPIDS is free software; you can redistribute it and/or modify                 
      +      11                 :  * it under the terms of the GNU Lesser General Public License as published by    
      +      12                 :  * the Free Software Foundation, version 3 of the License, or                     
      +      13                 :  * (at your option) any later version.                                            
      +      14                 :  *                                                                                
      +      15                 :  * PHPIDS is distributed in the hope that it will be useful,                      
      +      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of                 
      +      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                   
      +      18                 :  * GNU Lesser General Public License for more details.                            
      +      19                 :  *                                                                                
      +      20                 :  * You should have received a copy of the GNU Lesser General Public License       
      +      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.                 
      +      22                 :  *                                                                                
      +      23                 :  * PHP version 5.1.6+                                                             
      +      24                 :  *                                                                                
      +      25                 :  * @category Security                                                             
      +      26                 :  * @package  PHPIDS                                                               
      +      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                          
      +      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                                
      +      29                 :  * @author   Lars Strojny <lars@strojny.net>                                      
      +      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                           
      +      31                 :  * @link     http://php-ids.org/                                                  
      +      32                 :  */                                                                               
      +      33                 :                                                                                   
      +      34               1 : require_once 'IDS/Caching/Interface.php';                                         
      +      35                 :                                                                                   
      +      36                 : /**                                                                               
      +      37                 :  * File caching wrapper                                                           
      +      38                 :  *                                                                                
      +      39                 :  * This class inhabits functionality to get and set cache via session.            
      +      40                 :  *                                                                                
      +      41                 :  * @category  Security                                                            
      +      42                 :  * @package   PHPIDS                                                              
      +      43                 :  * @author    Christian Matthies <ch0012@gmail.com>                               
      +      44                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                         
      +      45                 :  * @author    Lars Strojny <lars@strojny.net>                                     
      +      46                 :  * @copyright 2007 The PHPIDS Group                                               
      +      47                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                          
      +      48                 :  * @version   Release: $Id:Session.php 517 2007-09-15 15:04:13Z mario $           
      +      49                 :  * @link      http://php-ids.org/                                                 
      +      50                 :  * @since     Version 0.4                                                         
      +      51                 :  */                                                                               
      +      52               1 : class IDS_Caching_Session implements IDS_Caching_Interface                        
      +      53                 : {                                                                                 
      +      54                 :                                                                                   
      +      55                 :     /**                                                                           
      +      56                 :      * Caching type                                                               
      +      57                 :      *                                                                            
      +      58                 :      * @var string                                                                
      +      59                 :      */                                                                           
      +      60                 :     private $type = null;                                                         
      +      61                 :                                                                                   
      +      62                 :     /**                                                                           
      +      63                 :      * Cache configuration                                                        
      +      64                 :      *                                                                            
      +      65                 :      * @var array                                                                 
      +      66                 :      */                                                                           
      +      67                 :     private $config = null;                                                       
      +      68                 :                                                                                   
      +      69                 :     /**                                                                           
      +      70                 :      * Holds an instance of this class                                            
      +      71                 :      *                                                                            
      +      72                 :      * @var object                                                                
      +      73                 :      */                                                                           
      +      74                 :     private static $cachingInstance = null;                                       
      +      75                 :                                                                                   
      +      76                 :     /**                                                                           
      +      77                 :      * Constructor                                                                
      +      78                 :      *                                                                            
      +      79                 :      * @param string $type caching type                                           
      +      80                 :      * @param array  $init the IDS_Init object                                    
      +      81                 :      *                                                                            
      +      82                 :      * @return void                                                               
      +      83                 :      */                                                                           
      +      84                 :     public function __construct($type, $init)                                     
      +      85                 :     {                                                                             
      +      86               1 :         $this->type   = $type;                                                    
      +      87               1 :         $this->config = $init->config['Caching'];                                 
      +      88               1 :     }                                                                             
      +      89                 :                                                                                   
      +      90                 :     /**                                                                           
      +      91                 :      * Returns an instance of this class                                          
      +      92                 :      *                                                                            
      +      93                 :      * @param string $type   caching type                                         
      +      94                 :      * @param array  $init the IDS_Init object                                    
      +      95                 :      *                                                                            
      +      96                 :      * @return object $this                                                       
      +      97                 :      */                                                                           
      +      98                 :     public static function getInstance($type, $init)                              
      +      99                 :     {                                                                             
      +     100                 :                                                                                   
      +     101               4 :         if (!self::$cachingInstance) {                                            
      +     102               1 :             self::$cachingInstance = new IDS_Caching_Session($type, $init);       
      +     103               1 :         }                                                                         
      +     104                 :                                                                                   
      +     105               4 :         return self::$cachingInstance;                                            
      +     106                 :     }                                                                             
      +     107                 :                                                                                   
      +     108                 :     /**                                                                           
      +     109                 :      * Writes cache data into the session                                         
      +     110                 :      *                                                                            
      +     111                 :      * @param array $data the caching data                                        
      +     112                 :      *                                                                            
      +     113                 :      * @return object $this                                                       
      +     114                 :      */                                                                           
      +     115                 :     public function setCache(array $data)                                         
      +     116                 :     {                                                                             
      +     117                 :                                                                                   
      +     118               3 :         $_SESSION['PHPIDS'][$this->type] = $data;                                 
      +     119               3 :         return $this;                                                             
      +     120                 :     }                                                                             
      +     121                 :                                                                                   
      +     122                 :     /**                                                                           
      +     123                 :      * Returns the cached data                                                    
      +     124                 :      *                                                                            
      +     125                 :      * Note that this method returns false if either type or file cache is not set
      +     126                 :      *                                                                            
      +     127                 :      * @return mixed cache data or false                                          
      +     128                 :      */                                                                           
      +     129                 :     public function getCache()                                                    
      +     130                 :     {                                                                             
      +     131                 :                                                                                   
      +     132               2 :         if ($this->type && $_SESSION['PHPIDS'][$this->type]) {                    
      +     133               1 :             return $_SESSION['PHPIDS'][$this->type];                              
      +     134                 :         }                                                                         
      +     135                 :                                                                                   
      +     136               1 :         return false;                                                             
      +     137                 :     }                                                                             
      +     138                 : }                                                                                 
      +     139                 :                                                                                   
      +     140                 : /**                                                                               
      +     141                 :  * Local variables:                                                               
      +     142                 :  * tab-width: 4                                                                   
      +     143                 :  * c-basic-offset: 4                                                              
      +     144                 :  * End:                                                                           
      +     145                 :  */                                                                               
      +
      +
      +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Converter.php.html b/dvwa/external/phpids/0.6/tests/coverage/Converter.php.html new file mode 100644 index 0000000..c16fe83 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Converter.php.html @@ -0,0 +1,2511 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current file:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Converter.php
      Legend: + executed + not executed + dead code +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%18 / 18 + + + + +
      85.57 %85.57%
      +
      85.57%249 / 291
       
      IDS_Converter + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%18 / 18 + + + + +
      85.57 %85.57%
      +
      85.57%249 / 291
       public static function runAll($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%6 / 6
       public static function convertFromCommented($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%11 / 11
       public static function convertFromNewLines($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%3 / 3
       public static function convertFromJSCharcode($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%51 / 51
       public static function convertJSRegexModifiers($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%2 / 2
       public static function convertEntities($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7
       public static function convertQuotes($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%3 / 3
       public static function convertFromSQLHex($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%13 / 13
       public static function convertFromSQLKeywords($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%14 / 14
       public static function convertFromControlChars($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%19 / 19
       public static function convertFromNestedBase64($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%10 / 10
       public static function convertFromOutOfRangeChars($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7
       public static function convertFromXML($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%4 / 4
       public static function convertFromJSUnicode($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      36.36 %36.36%
      +
      36.36%4 / 11
       public static function convertFromUTF7($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      17.50 %17.50%
      +
      17.50%7 / 40
       public static function convertConcatenations($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%28 / 28
       public static function convertFromProprietaryEncodings($value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%13 / 13
       public static function runCentrifuge($value, IDS_Monitor $monitor = NULL) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      95.83 %95.83%
      +
      95.83%46 / 48
      +
      + +
      + + + + + + + + +

      +
      +       1                 : <?php                                                                                   
      +       2                 :                                                                                         
      +       3                 : /**                                                                                     
      +       4                 :  * PHPIDS                                                                               
      +       5                 :  *                                                                                      
      +       6                 :  * Requirements: PHP5, SimpleXML                                                        
      +       7                 :  *                                                                                      
      +       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                                 
      +       9                 :  *                                                                                      
      +      10                 :  * PHPIDS is free software; you can redistribute it and/or modify                       
      +      11                 :  * it under the terms of the GNU Lesser General Public License as published by          
      +      12                 :  * the Free Software Foundation, version 3 of the License, or                           
      +      13                 :  * (at your option) any later version.                                                  
      +      14                 :  *                                                                                      
      +      15                 :  * PHPIDS is distributed in the hope that it will be useful,                            
      +      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of                       
      +      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                         
      +      18                 :  * GNU Lesser General Public License for more details.                                  
      +      19                 :  *                                                                                      
      +      20                 :  * You should have received a copy of the GNU Lesser General Public License             
      +      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.                       
      +      22                 :  *                                                                                      
      +      23                 :  * PHP version 5.1.6+                                                                   
      +      24                 :  *                                                                                      
      +      25                 :  * @category Security                                                                   
      +      26                 :  * @package  PHPIDS                                                                     
      +      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                                
      +      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                                      
      +      29                 :  * @author   Lars Strojny <lars@strojny.net>                                            
      +      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                                 
      +      31                 :  * @link     http://php-ids.org/                                                        
      +      32                 :  */                                                                                     
      +      33                 :                                                                                         
      +      34                 : /**                                                                                     
      +      35                 :  * PHPIDS specific utility class to convert charsets manually                           
      +      36                 :  *                                                                                      
      +      37                 :  * Note that if you make use of IDS_Converter::runAll(), existing class                 
      +      38                 :  * methods will be executed in the same order as they are implemented in the            
      +      39                 :  * class tree!                                                                          
      +      40                 :  *                                                                                      
      +      41                 :  * @category  Security                                                                  
      +      42                 :  * @package   PHPIDS                                                                    
      +      43                 :  * @author    Christian Matthies <ch0012@gmail.com>                                     
      +      44                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                               
      +      45                 :  * @author    Lars Strojny <lars@strojny.net>                                           
      +      46                 :  * @copyright 2007 The PHPIDS Group                                                     
      +      47                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                                
      +      48                 :  * @version   Release: $Id:Converter.php 517 2007-09-15 15:04:13Z mario $               
      +      49                 :  * @link      http://php-ids.org/                                                       
      +      50                 :  */                                                                                     
      +      51                 : class IDS_Converter                                                                     
      +      52               1 : {                                                                                       
      +      53                 :     /**                                                                                 
      +      54                 :      * Runs all converter functions                                                     
      +      55                 :      *                                                                                  
      +      56                 :      * Note that if you make use of IDS_Converter::runAll(), existing class             
      +      57                 :      * methods will be executed in the same order as they are implemented in the        
      +      58                 :      * class tree!                                                                      
      +      59                 :      *                                                                                  
      +      60                 :      * @param string $value the value to convert                                        
      +      61                 :      *                                                                                  
      +      62                 :      * @static                                                                          
      +      63                 :      * @return string                                                                   
      +      64                 :      */                                                                                 
      +      65                 :     public static function runAll($value)                                               
      +      66                 :     {                                                                                   
      +      67              35 :         foreach (get_class_methods(__CLASS__) as $method) {                             
      +      68                 :                                                                                         
      +      69              35 :             if (strpos($method, 'run') === 0) {                                         
      +      70              35 :                 continue;                                                               
      +      71                 :             }                                                                           
      +      72              35 :             $value = self::$method($value);                                             
      +      73              35 :         }                                                                               
      +      74                 :                                                                                         
      +      75              35 :         return $value;                                                                  
      +      76                 :     }                                                                                   
      +      77                 :                                                                                         
      +      78                 :     /**                                                                                 
      +      79                 :      * Check for comments and erases them if available                                  
      +      80                 :      *                                                                                  
      +      81                 :      * @param string $value the value to convert                                        
      +      82                 :      *                                                                                  
      +      83                 :      * @static                                                                          
      +      84                 :      * @return string                                                                   
      +      85                 :      */                                                                                 
      +      86                 :     public static function convertFromCommented($value)                                 
      +      87                 :     {                                                                                   
      +      88                 :         // check for existing comments                                                  
      +      89              35 :         if (preg_match('/(?:\<!-|-->|\/\*|\*\/|\/\/\W*\w+\s*$)|' .                      
      +      90              35 :             '(?:--[^-]*-)/ms', $value)) {                                               
      +      91                 :                                                                                         
      +      92                 :             $pattern = array(                                                           
      +      93               8 :                 '/(?:(?:<!)(?:(?:--(?:[^-]*(?:-[^-]+)*)--\s*)*)(?:>))/ms',              
      +      94               8 :                 '/(?:(?:\/\*\/*[^\/\*]*)+\*\/)/ms',                                     
      +      95                 :                 '/(?:--[^-]*-)/ms'                                                      
      +      96               8 :             );                                                                          
      +      97                 :                                                                                         
      +      98               8 :             $converted = preg_replace($pattern, ';', $value);                           
      +      99               8 :             $value    .= "\n" . $converted;                                             
      +     100               8 :         }                                                                               
      +     101                 :         //make sure inline comments are detected and converted correctly                
      +     102              35 :         $value = preg_replace('/(<\w+)\/+(\w+=?)/m', '$1/$2', $value);                  
      +     103              35 :         $value = preg_replace('/[^\\\:]\/\/(.*)$/m', '/**/$1', $value);                 
      +     104                 :                                                                                         
      +     105              35 :         return $value;                                                                  
      +     106                 :     }                                                                                   
      +     107                 :                                                                                         
      +     108                 :     /**                                                                                 
      +     109                 :      * Strip newlines                                                                   
      +     110                 :      *                                                                                  
      +     111                 :      * @param string $value the value to convert                                        
      +     112                 :      *                                                                                  
      +     113                 :      * @static                                                                          
      +     114                 :      * @return string                                                                   
      +     115                 :      */                                                                                 
      +     116                 :     public static function convertFromNewLines($value)                                  
      +     117                 :     {                                                                                   
      +     118                 :         //check for inline linebreaks                                                   
      +     119              35 :         $search = array('\r', '\n', '\f', '\t', '\v');                                  
      +     120              35 :         $value  = str_replace($search, ';', $value);                                    
      +     121                 :                                                                                         
      +     122                 :         //convert real linebreaks                                                       
      +     123              35 :         return preg_replace('/(?:\n|\r|\v)/m', '  ', $value);                           
      +     124                 :     }                                                                                   
      +     125                 :                                                                                         
      +     126                 :     /**                                                                                 
      +     127                 :      * Checks for common charcode pattern and decodes them                              
      +     128                 :      *                                                                                  
      +     129                 :      * @param string $value the value to convert                                        
      +     130                 :      *                                                                                  
      +     131                 :      * @static                                                                          
      +     132                 :      * @return string                                                                   
      +     133                 :      */                                                                                 
      +     134                 :     public static function convertFromJSCharcode($value)                                
      +     135                 :     {                                                                                   
      +     136              35 :         $matches = array();                                                             
      +     137                 :                                                                                         
      +     138                 :         // check if value matches typical charCode pattern                              
      +     139              35 :         if (preg_match_all('/(?:[\d+-=\/\* ]+(?:\s?,\s?[\d+-=\/\* ]+)){4,}/ms',         
      +     140              35 :             $value, $matches)) {                                                        
      +     141                 :                                                                                         
      +     142               1 :             $converted = '';                                                            
      +     143               1 :             $string    = implode(',', $matches[0]);                                     
      +     144               1 :             $string    = preg_replace('/\s/', '', $string);                             
      +     145               1 :             $string    = preg_replace('/\w+=/', '', $string);                           
      +     146               1 :             $charcode  = explode(',', $string);                                         
      +     147                 :                                                                                         
      +     148               1 :             foreach ($charcode as $char) {                                              
      +     149               1 :                 $char = preg_replace('/\W0/s', '', $char);                              
      +     150                 :                                                                                         
      +     151               1 :                 if (preg_match_all('/\d*[+-\/\* ]\d+/', $char, $matches)) {             
      +     152               1 :                     $match = preg_split('/(\W?\d+)/',                                   
      +     153               1 :                                         (implode('', $matches[0])),                     
      +     154               1 :                                         null,                                           
      +     155               1 :                                         PREG_SPLIT_DELIM_CAPTURE);                      
      +     156                 :                                                                                         
      +     157               1 :                     if (array_sum($match) >= 20 && array_sum($match) <= 127) {          
      +     158               1 :                         $converted .= chr(array_sum($match));                           
      +     159               1 :                     }                                                                   
      +     160                 :                                                                                         
      +     161               1 :                 } elseif (!empty($char) && $char >= 20 && $char <= 127) {               
      +     162               1 :                     $converted .= chr($char);                                           
      +     163               1 :                 }                                                                       
      +     164               1 :             }                                                                           
      +     165                 :                                                                                         
      +     166               1 :             $value .= "\n" . $converted;                                                
      +     167               1 :         }                                                                               
      +     168                 :                                                                                         
      +     169                 :         // check for octal charcode pattern                                             
      +     170              35 :         if (preg_match_all('/(?:(?:[\\\]+\d+[ \t]*){8,})/ims', $value, $matches)) {     
      +     171                 :                                                                                         
      +     172               1 :             $converted = '';                                                            
      +     173               1 :             $charcode  = explode('\\', preg_replace('/\s/', '', implode(',',            
      +     174               1 :                 $matches[0])));                                                         
      +     175                 :                                                                                         
      +     176               1 :             foreach ($charcode as $char) {                                              
      +     177               1 :                 if (!empty($char)) {                                                    
      +     178               1 :                     if (octdec($char) >= 20 && octdec($char) <= 127) {                  
      +     179               1 :                         $converted .= chr(octdec($char));                               
      +     180               1 :                     }                                                                   
      +     181               1 :                 }                                                                       
      +     182               1 :             }                                                                           
      +     183               1 :             $value .= "\n" . $converted;                                                
      +     184               1 :         }                                                                               
      +     185                 :                                                                                         
      +     186                 :         // check for hexadecimal charcode pattern                                       
      +     187              35 :         if (preg_match_all('/(?:(?:[\\\]+\w+\s*){8,})/ims', $value, $matches)) {        
      +     188                 :                                                                                         
      +     189               2 :             $converted = '';                                                            
      +     190               2 :             $charcode  = explode('\\', preg_replace('/[ux]/', '', implode(',',          
      +     191               2 :                 $matches[0])));                                                         
      +     192                 :                                                                                         
      +     193               2 :             foreach ($charcode as $char) {                                              
      +     194               2 :                 if (!empty($char)) {                                                    
      +     195               2 :                     if (hexdec($char) >= 20 && hexdec($char) <= 127) {                  
      +     196               2 :                         $converted .= chr(hexdec($char));                               
      +     197               2 :                     }                                                                   
      +     198               2 :                 }                                                                       
      +     199               2 :             }                                                                           
      +     200               2 :             $value .= "\n" . $converted;                                                
      +     201               2 :         }                                                                               
      +     202                 :                                                                                         
      +     203              35 :         return $value;                                                                  
      +     204                 :     }                                                                                   
      +     205                 :                                                                                         
      +     206                 :     /**                                                                                 
      +     207                 :      * Eliminate JS regex modifiers                                                     
      +     208                 :      *                                                                                  
      +     209                 :      * @param string $value the value to convert                                        
      +     210                 :      *                                                                                  
      +     211                 :      * @static                                                                          
      +     212                 :      * @return string                                                                   
      +     213                 :      */                                                                                 
      +     214                 :     public static function convertJSRegexModifiers($value)                              
      +     215                 :     {                                                                                   
      +     216              35 :         $value = preg_replace('/\/[gim]/', '/', $value);                                
      +     217                 :                                                                                         
      +     218              35 :         return $value;                                                                  
      +     219                 :     }                                                                                   
      +     220                 :                                                                                         
      +     221                 :     /**                                                                                 
      +     222                 :      * Converts from hex/dec entities                                                   
      +     223                 :      *                                                                                  
      +     224                 :      * @param string $value the value to convert                                        
      +     225                 :      *                                                                                  
      +     226                 :      * @static                                                                          
      +     227                 :      * @return string                                                                   
      +     228                 :      */                                                                                 
      +     229                 :     public static function convertEntities($value)                                      
      +     230                 :     {                                                                                   
      +     231              35 :         $converted = null;                                                              
      +     232              35 :         if (preg_match('/&#x?[\w]+/ms', $value)) {                                      
      +     233               6 :             $converted = preg_replace('/(&#x?[\w]{2}\d?);?/ms', '$1;', $value);         
      +     234               6 :             $converted = html_entity_decode($converted, ENT_QUOTES, 'UTF-8');           
      +     235               6 :             $value    .= "\n" . str_replace(';;', ';', $converted);                     
      +     236               6 :         }                                                                               
      +     237                 :                                                                                         
      +     238              35 :         return $value;                                                                  
      +     239                 :     }                                                                                   
      +     240                 :                                                                                         
      +     241                 :     /**                                                                                 
      +     242                 :      * Normalize quotes                                                                 
      +     243                 :      *                                                                                  
      +     244                 :      * @param string $value the value to convert                                        
      +     245                 :      *                                                                                  
      +     246                 :      * @static                                                                          
      +     247                 :      * @return string                                                                   
      +     248                 :      */                                                                                 
      +     249                 :     public static function convertQuotes($value)                                        
      +     250                 :     {                                                                                   
      +     251                 :         // normalize different quotes to "                                              
      +     252              35 :         $pattern = array('\'', '`', '´', '’', '‘');                                
      +     253              35 :         $value   = str_replace($pattern, '"', $value);                                  
      +     254                 :                                                                                         
      +     255              35 :         return $value;                                                                  
      +     256                 :     }                                                                                   
      +     257                 :                                                                                         
      +     258                 :     /**                                                                                 
      +     259                 :      * Converts SQLHEX to plain text                                                    
      +     260                 :      *                                                                                  
      +     261                 :      * @param string $value the value to convert                                        
      +     262                 :      *                                                                                  
      +     263                 :      * @static                                                                          
      +     264                 :      * @return string                                                                   
      +     265                 :      */                                                                                 
      +     266                 :     public static function convertFromSQLHex($value)                                    
      +     267                 :     {                                                                                   
      +     268              35 :         $matches = array();                                                             
      +     269              35 :         if(preg_match_all('/(?:0x[a-f\d]{2,}[a-f\d\s]*)+/im', $value, $matches)) {      
      +     270               3 :             foreach($matches[0] as $match) {                                            
      +     271               3 :                 $converted = '';                                                        
      +     272               3 :                 foreach(str_split($match, 2) as $hex_index) {                           
      +     273               3 :                     if(preg_match('/[a-f\d]{2,3}/i', $hex_index)) {                     
      +     274               3 :                       $converted .= chr(hexdec($hex_index));                            
      +     275               3 :                     }                                                                   
      +     276               3 :                 }                                                                       
      +     277               3 :                 $value = str_replace($match, $converted, $value);                       
      +     278               3 :             }                                                                           
      +     279               3 :         }                                                                               
      +     280              35 :         return $value;                                                                  
      +     281                 :     }                                                                                   
      +     282                 :                                                                                         
      +     283                 :     /**                                                                                 
      +     284                 :      * Converts basic SQL keywords and obfuscations                                     
      +     285                 :      *                                                                                  
      +     286                 :      * @param string $value the value to convert                                        
      +     287                 :      *                                                                                  
      +     288                 :      * @static                                                                          
      +     289                 :      * @return string                                                                   
      +     290                 :      */                                                                                 
      +     291                 :     public static function convertFromSQLKeywords($value)                               
      +     292                 :     {                                                                                   
      +     293                 :         $pattern = array('/(?:IS\s+null)|(LIKE\s+null)|' .                              
      +     294              35 :             '(?:(?:^|\W)IN[+\s]*\([\s\d"]+[^()]*\))/ims');                              
      +     295              35 :         $value   = preg_replace($pattern, '"=0', $value);                               
      +     296              35 :         $value   = preg_replace('/null,/ims', ',0', $value);                            
      +     297              35 :         $value   = preg_replace('/,null/ims', ',0', $value);                            
      +     298                 :         $pattern = array('/[^\w,]NULL|\\\N|TRUE|FALSE|UTC_TIME|' .                      
      +     299              35 :                          'LOCALTIME(?:STAMP)?|CURRENT_\w+|BINARY|' .                    
      +     300              35 :                          '(?:(?:ASCII|SOUNDEX|' .                                       
      +     301              35 :                          'MD5|R?LIKE)[+\s]*\([^()]+\))|(?:-+\d)/ims');                  
      +     302              35 :         $value   = preg_replace($pattern, 0, $value);                                   
      +     303                 :         $pattern = array('/(?:NOT\s+BETWEEN)|(?:IS\s+NOT)|(?:NOT\s+IN)|' .              
      +     304              35 :                          '(?:XOR|\WDIV\W|\WNOT\W|<>|RLIKE(?:\s+BINARY)?)|' .            
      +     305              35 :                          '(?:REGEXP\s+BINARY)|' .                                       
      +     306              35 :                          '(?:SOUNDS\s+LIKE)/ims');                                      
      +     307              35 :         $value   = preg_replace($pattern, '!', $value);                                 
      +     308              35 :         $value   = preg_replace('/"\s+\d/', '"', $value);                               
      +     309                 :                                                                                         
      +     310              35 :         return $value;                                                                  
      +     311                 :     }                                                                                   
      +     312                 :                                                                                         
      +     313                 :     /**                                                                                 
      +     314                 :      * Detects nullbytes and controls chars via ord()                                   
      +     315                 :      *                                                                                  
      +     316                 :      * @param string $value the value to convert                                        
      +     317                 :      *                                                                                  
      +     318                 :      * @static                                                                          
      +     319                 :      * @return string                                                                   
      +     320                 :      */                                                                                 
      +     321                 :     public static function convertFromControlChars($value)                              
      +     322                 :     {                                                                                   
      +     323                 :         // critical ctrl values                                                         
      +     324              35 :         $search     = array(chr(0), chr(1), chr(2),                                     
      +     325              35 :                             chr(3), chr(4), chr(5),                                     
      +     326              35 :                             chr(6), chr(7), chr(8),                                     
      +     327              35 :                             chr(11), chr(12), chr(14),                                  
      +     328              35 :                             chr(15), chr(16), chr(17),                                  
      +     329              35 :                             chr(18), chr(19));                                          
      +     330              35 :         $value      = str_replace($search, '%00', $value);                              
      +     331              35 :         $urlencoded = urlencode($value);                                                
      +     332                 :                                                                                         
      +     333                 :         //take care for malicious unicode characters                                    
      +     334              35 :         $value = urldecode(preg_replace('/(?:%E(?:2|3)%8(?:0|1)%(?:A|8|9)' .            
      +     335              35 :             '\w|%EF%BB%BF|%EF%BF%BD)|(?:&#(?:65|8)\d{3};?)/i', null,                    
      +     336              35 :                 $urlencoded));                                                          
      +     337                 :                                                                                         
      +     338              35 :         $value = preg_replace('/(?:&[#x]*(200|820|200|820|zwn?j|lrm|rlm)\w?;?)/i', null,
      +     339              35 :                 $value);                                                                
      +     340                 :                                                                                         
      +     341              35 :         $value = preg_replace('/(?:&#(?:65|8)\d{3};?)|' .                               
      +     342              35 :                 '(?:&#(?:56|7)3\d{2};?)|' .                                             
      +     343              35 :                 '(?:&#x(?:fe|20)\w{2};?)|' .                                            
      +     344              35 :                 '(?:&#x(?:d[c-f])\w{2};?)/i', null,                                     
      +     345              35 :                 $value);                                                                
      +     346                 :                                                                                         
      +     347              35 :         return $value;                                                                  
      +     348                 :     }                                                                                   
      +     349                 :                                                                                         
      +     350                 :     /**                                                                                 
      +     351                 :      * This method matches and translates base64 strings and fragments                  
      +     352                 :      * used in data URIs                                                                
      +     353                 :      *                                                                                  
      +     354                 :      * @param string $value the value to convert                                        
      +     355                 :      *                                                                                  
      +     356                 :      * @static                                                                          
      +     357                 :      * @return string                                                                   
      +     358                 :      */                                                                                 
      +     359                 :     public static function convertFromNestedBase64($value)                              
      +     360                 :     {                                                                                   
      +     361              35 :         $matches = array();                                                             
      +     362              35 :         preg_match_all('/(?:^|[,&?])\s*([a-z0-9]{30,}=*)(?:\W|$)/im',                   
      +     363              35 :             $value,                                                                     
      +     364              35 :             $matches);                                                                  
      +     365                 :                                                                                         
      +     366              35 :         foreach ($matches[1] as $item) {                                                
      +     367               2 :             if (isset($item) && !preg_match('/[a-f0-9]{32}/i', $item)) {                
      +     368               2 :                 $value = str_replace($item, base64_decode($item), $value);              
      +     369               2 :             }                                                                           
      +     370              35 :         }                                                                               
      +     371                 :                                                                                         
      +     372              35 :         return $value;                                                                  
      +     373                 :     }                                                                                   
      +     374                 :                                                                                         
      +     375                 :     /**                                                                                 
      +     376                 :      * Detects nullbytes and controls chars via ord()                                   
      +     377                 :      *                                                                                  
      +     378                 :      * @param string $value the value to convert                                        
      +     379                 :      *                                                                                  
      +     380                 :      * @static                                                                          
      +     381                 :      * @return string                                                                   
      +     382                 :      */                                                                                 
      +     383                 :     public static function convertFromOutOfRangeChars($value)                           
      +     384                 :     {                                                                                   
      +     385              35 :         $values = str_split($value);                                                    
      +     386              35 :         foreach ($values as $item) {                                                    
      +     387              35 :             if (ord($item) >= 127) {                                                    
      +     388               8 :                 $value = str_replace($item, 'U', $value);                               
      +     389               8 :             }                                                                           
      +     390              35 :         }                                                                               
      +     391                 :                                                                                         
      +     392              35 :         return $value;                                                                  
      +     393                 :     }                                                                                   
      +     394                 :                                                                                         
      +     395                 :     /**                                                                                 
      +     396                 :      * Strip XML patterns                                                               
      +     397                 :      *                                                                                  
      +     398                 :      * @param string $value the value to convert                                        
      +     399                 :      *                                                                                  
      +     400                 :      * @static                                                                          
      +     401                 :      * @return string                                                                   
      +     402                 :      */                                                                                 
      +     403                 :     public static function convertFromXML($value)                                       
      +     404                 :     {                                                                                   
      +     405              35 :         $converted = strip_tags($value);                                                
      +     406                 :                                                                                         
      +     407              35 :         if ($converted && ($converted != $value)) {                                     
      +     408              24 :             return $value . "\n" . $converted;                                          
      +     409                 :         }                                                                               
      +     410              30 :         return $value;                                                                  
      +     411                 :     }                                                                                   
      +     412                 :                                                                                         
      +     413                 :     /**                                                                                 
      +     414                 :      * This method converts JS unicode code points to                                   
      +     415                 :      * regular characters                                                               
      +     416                 :      *                                                                                  
      +     417                 :      * @param string $value the value to convert                                        
      +     418                 :      *                                                                                  
      +     419                 :      * @static                                                                          
      +     420                 :      * @return string                                                                   
      +     421                 :      */                                                                                 
      +     422                 :     public static function convertFromJSUnicode($value)                                 
      +     423                 :     {                                                                                   
      +     424              35 :         $matches = array();                                                             
      +     425                 :                                                                                         
      +     426              35 :         preg_match_all('/\\\u[0-9a-f]{4}/ims', $value, $matches);                       
      +     427                 :                                                                                         
      +     428              35 :         if (!empty($matches[0])) {                                                      
      +     429               0 :             foreach ($matches[0] as $match) {                                           
      +     430               0 :                 $value = str_replace($match,                                            
      +     431               0 :                     chr(hexdec(substr($match, 2, 4))),                                  
      +     432               0 :                     $value);                                                            
      +     433               0 :             }                                                                           
      +     434               0 :             $value .= "\n\u0001";                                                       
      +     435               0 :         }                                                                               
      +     436                 :                                                                                         
      +     437              35 :         return $value;                                                                  
      +     438                 :     }                                                                                   
      +     439                 :                                                                                         
      +     440                 :                                                                                         
      +     441                 :     /**                                                                                 
      +     442                 :      * Converts relevant UTF-7 tags to UTF-8                                            
      +     443                 :      *                                                                                  
      +     444                 :      * @param string $value the value to convert                                        
      +     445                 :      *                                                                                  
      +     446                 :      * @static                                                                          
      +     447                 :      * @return string                                                                   
      +     448                 :      */                                                                                 
      +     449                 :     public static function convertFromUTF7($value)                                      
      +     450                 :     {                                                                                   
      +     451              35 :         if(preg_match('/\+A\w+-/m', $value)) {                                          
      +     452               1 :             if (function_exists('mb_convert_encoding')) {                               
      +     453               1 :                 if(version_compare(PHP_VERSION, '5.2.8', '<')) {                        
      +     454               0 :                     $tmp_chars = str_split($value);                                     
      +     455               0 :                     $value = '';                                                        
      +     456               0 :                     foreach($tmp_chars as $char) {                                      
      +     457               0 :                         if(ord($char) <= 127) {                                         
      +     458               0 :                             $value .= $char;                                            
      +     459               0 :                         }                                                               
      +     460               0 :                     }                                                                   
      +     461               0 :                 }                                                                       
      +     462               1 :                 $value .= "\n" . mb_convert_encoding($value, 'UTF-8', 'UTF-7');         
      +     463               1 :             } else {                                                                    
      +     464                 :                 //list of all critical UTF7 codepoints                                  
      +     465                 :                 $schemes = array(                                                       
      +     466               0 :                     '+ACI-'      => '"',                                                
      +     467               0 :                     '+ADw-'      => '<',                                                
      +     468               0 :                     '+AD4-'      => '>',                                                
      +     469               0 :                     '+AFs-'      => '[',                                                
      +     470               0 :                     '+AF0-'      => ']',                                                
      +     471               0 :                     '+AHs-'      => '{',                                                
      +     472               0 :                     '+AH0-'      => '}',                                                
      +     473               0 :                     '+AFw-'      => '\\',                                               
      +     474               0 :                     '+ADs-'      => ';',                                                
      +     475               0 :                     '+ACM-'      => '#',                                                
      +     476               0 :                     '+ACY-'      => '&',                                                
      +     477               0 :                     '+ACU-'      => '%',                                                
      +     478               0 :                     '+ACQ-'      => '$',                                                
      +     479               0 :                     '+AD0-'      => '=',                                                
      +     480               0 :                     '+AGA-'      => '`',                                                
      +     481               0 :                     '+ALQ-'      => '"',                                                
      +     482               0 :                     '+IBg-'      => '"',                                                
      +     483               0 :                     '+IBk-'      => '"',                                                
      +     484               0 :                     '+AHw-'      => '|',                                                
      +     485               0 :                     '+ACo-'      => '*',                                                
      +     486               0 :                     '+AF4-'      => '^',                                                
      +     487               0 :                     '+ACIAPg-'   => '">',                                               
      +     488                 :                     '+ACIAPgA8-' => '">'                                                
      +     489               0 :                 );                                                                      
      +     490                 :                                                                                         
      +     491               0 :                 $value = str_ireplace(array_keys($schemes),                             
      +     492               0 :                     array_values($schemes), $value);                                    
      +     493                 :             }                                                                           
      +     494               1 :         }                                                                               
      +     495              35 :         return $value;                                                                  
      +     496                 :     }                                                                                   
      +     497                 :                                                                                         
      +     498                 :     /**                                                                                 
      +     499                 :      * Converts basic concatenations                                                    
      +     500                 :      *                                                                                  
      +     501                 :      * @param string $value the value to convert                                        
      +     502                 :      *                                                                                  
      +     503                 :      * @static                                                                          
      +     504                 :      * @return string                                                                   
      +     505                 :      */                                                                                 
      +     506                 :     public static function convertConcatenations($value)                                
      +     507                 :     {                                                                                   
      +     508                 :         //normalize remaining backslashes                                               
      +     509              35 :         if ($value != preg_replace('/(\w)\\\/', "$1", $value)) {                        
      +     510               3 :             $value .= preg_replace('/(\w)\\\/', "$1", $value);                          
      +     511               3 :         }                                                                               
      +     512                 :                                                                                         
      +     513              35 :         $compare = stripslashes($value);                                                
      +     514                 :                                                                                         
      +     515              35 :         $pattern = array('/(?:<\/\w+>\+<\w+>)/s',                                       
      +     516              35 :             '/(?:":\d+[^"[]+")/s',                                                      
      +     517              35 :             '/(?:"?"\+\w+\+")/s',                                                       
      +     518              35 :             '/(?:"\s*;[^"]+")|(?:";[^"]+:\s*")/s',                                      
      +     519              35 :             '/(?:"\s*(?:;|\+).{8,18}:\s*")/s',                                          
      +     520              35 :             '/(?:";\w+=)|(?:!""&&")|(?:~)/s',                                           
      +     521              35 :             '/(?:"?"\+""?\+?"?)|(?:;\w+=")|(?:"[|&]{2,})/s',                            
      +     522              35 :             '/(?:"\s*\W+")/s',                                                          
      +     523              35 :             '/(?:";\w\s*\+=\s*\w?\s*")/s',                                              
      +     524              35 :             '/(?:"[|&;]+\s*[^|&\n]*[|&]+\s*"?)/s',                                      
      +     525              35 :             '/(?:";\s*\w+\W+\w*\s*[|&]*")/s',                                           
      +     526              35 :             '/(?:"\s*"\s*\.)/s',                                                        
      +     527              35 :             '/(?:\s*new\s+\w+\s*[+"])/',                                                
      +     528              35 :             '/(?:(?:^|\s+)(?:do|else)\s+)/',                                            
      +     529              35 :             '/(?:\{\s*new\s+\w+\s*\})/',                                                
      +     530              35 :             '/(?:(this|self).)/');                                                      
      +     531                 :                                                                                         
      +     532                 :         // strip out concatenations                                                     
      +     533              35 :         $converted = preg_replace($pattern, null, $compare);                            
      +     534                 :                                                                                         
      +     535                 :         //strip object traversal                                                        
      +     536              35 :         $converted = preg_replace('/\w(\.\w\()/', "$1", $converted);                    
      +     537                 :                                                                                         
      +     538                 :         //convert JS special numbers                                                    
      +     539              35 :         $converted = preg_replace('/(?:\(*[.\d]e[+-]*[^a-z\W]+\)*)' .                   
      +     540              35 :             '|(?:NaN|Infinity)\W/ms', 1, $converted);                                   
      +     541                 :                                                                                         
      +     542              35 :         if ($converted && ($compare != $converted)) {                                   
      +     543              15 :             $value .= "\n" . $converted;                                                
      +     544              15 :         }                                                                               
      +     545                 :                                                                                         
      +     546              35 :         return $value;                                                                  
      +     547                 :     }                                                                                   
      +     548                 :                                                                                         
      +     549                 :     /**                                                                                 
      +     550                 :      * This method collects and decodes proprietary encoding types                      
      +     551                 :      *                                                                                  
      +     552                 :      * @param string      $value   the value to convert                                 
      +     553                 :      * @param IDS_Monitor $monitor the monitor object                                   
      +     554                 :      *                                                                                  
      +     555                 :      * @static                                                                          
      +     556                 :      * @return string                                                                   
      +     557                 :      */                                                                                 
      +     558                 :     public static function convertFromProprietaryEncodings($value) {                    
      +     559                 :                                                                                         
      +     560                 :         //Xajax error reportings                                                        
      +     561              35 :         $value = preg_replace('/<!\[CDATA\[(\W+)\]\]>/im', '$1', $value);               
      +     562                 :                                                                                         
      +     563                 :         //strip false alert triggering apostrophes                                      
      +     564              35 :         $value = preg_replace('/(\w)\"(s)/m', '$1$2', $value);                          
      +     565                 :                                                                                         
      +     566                 :         //strip quotes within typical search patterns                                   
      +     567              35 :         $value = preg_replace('/^"([^"=\\!><~]+)"$/', '$1', $value);                    
      +     568                 :                                                                                         
      +     569                 :         //OpenID login tokens                                                           
      +     570              35 :         $value = preg_replace('/{[\w-]{8,9}\}(?:\{[\w=]{8}\}){2}/', null, $value);      
      +     571                 :                                                                                         
      +     572                 :         //convert Content and \sdo\s to null                                            
      +     573              35 :         $value = preg_replace('/Content|\Wdo\s/', null, $value);                        
      +     574                 :                                                                                         
      +     575                 :         //strip emoticons                                                               
      +     576              35 :         $value = preg_replace(                                                          
      +     577              35 :             '/(?:[:;]-[()\/PD]+)|(?:\s;[()PD]+)|(?::[()PD]+)|-\.-|\^\^/m',              
      +     578              35 :             null,                                                                       
      +     579                 :             $value                                                                      
      +     580              35 :         );                                                                              
      +     581                 :                                                                                         
      +     582                 :         // normalize separation char repetion                                           
      +     583              35 :         $value = preg_replace('/([.+~=*_\-])\1{2,}/m', '$1', $value);                   
      +     584                 :                                                                                         
      +     585                 :         //remove parenthesis inside sentences                                           
      +     586              35 :         $value = preg_replace('/(\w\s)\(([&\w]+)\)(\s\w|$)/', '$1$2$3', $value);        
      +     587                 :                                                                                         
      +     588                 :         //normalize ampersand listings                                                  
      +     589              35 :         $value = preg_replace('/(\w\s)&\s(\w)/', '$1$2', $value);                       
      +     590                 :                                                                                         
      +     591              35 :         return $value;                                                                  
      +     592                 :     }                                                                                   
      +     593                 :                                                                                         
      +     594                 :     /**                                                                                 
      +     595                 :      * This method is the centrifuge prototype                                          
      +     596                 :      *                                                                                  
      +     597                 :      * @param string      $value   the value to convert                                 
      +     598                 :      * @param IDS_Monitor $monitor the monitor object                                   
      +     599                 :      *                                                                                  
      +     600                 :      * @static                                                                          
      +     601                 :      * @return string                                                                   
      +     602                 :      */                                                                                 
      +     603                 :     public static function runCentrifuge($value, IDS_Monitor $monitor = null)           
      +     604                 :     {                                                                                   
      +     605              35 :         $threshold = 3.49;                                                              
      +     606                 :                                                                                         
      +     607              35 :         $unserialized = false;                                                          
      +     608              35 :         if(preg_match('/^\w:\d+:\{/', $value)) {                                        
      +     609               0 :             $unserialized = @unserialize($value);                                       
      +     610               0 :         }                                                                               
      +     611                 :                                                                                         
      +     612              35 :         if (strlen($value) > 25 && !$unserialized) {                                    
      +     613                 :             // Check for the attack char ratio                                          
      +     614              33 :             $tmp_value = $value;                                                        
      +     615              33 :             $tmp_value = preg_replace('/([*.!?+-])\1{1,}/m', '$1', $tmp_value);         
      +     616              33 :             $tmp_value = preg_replace('/"[\p{L}\d\s]+"/m', null, $tmp_value);           
      +     617                 :                                                                                         
      +     618              33 :             $stripped_length = strlen(preg_replace('/[\d\s\p{L}.:,%\/><-]+/m',          
      +     619              33 :                 null, $tmp_value));                                                     
      +     620              33 :             $overall_length  = strlen(preg_replace('/([\d\s\p{L}]{3,})+/m', 'aaa',      
      +     621              33 :                 preg_replace('/\s{2,}/m', null, $tmp_value)));                          
      +     622                 :                                                                                         
      +     623                 :             if ($stripped_length != 0                                                   
      +     624              33 :                 && $overall_length/$stripped_length <= $threshold) {                    
      +     625                 :                                                                                         
      +     626              16 :                 $monitor->centrifuge['ratio']     =                                     
      +     627              16 :                     $overall_length/$stripped_length;                                   
      +     628              16 :                 $monitor->centrifuge['threshold'] =                                     
      +     629                 :                     $threshold;                                                         
      +     630                 :                                                                                         
      +     631              16 :                 $value .= "\n$[!!!]";                                                   
      +     632              16 :             }                                                                           
      +     633              33 :         }                                                                               
      +     634                 :                                                                                         
      +     635              35 :         if (strlen($value) > 40) {                                                      
      +     636                 :             // Replace all non-special chars                                            
      +     637              32 :             $converted =  preg_replace('/[\w\s\p{L},.!]/', null, $value);               
      +     638                 :                                                                                         
      +     639                 :             // Split string into an array, unify and sort                               
      +     640              32 :             $array = str_split($converted);                                             
      +     641              32 :             $array = array_unique($array);                                              
      +     642              32 :             asort($array);                                                              
      +     643                 :                                                                                         
      +     644                 :             // Normalize certain tokens                                                 
      +     645                 :             $schemes = array(                                                           
      +     646              32 :                 '~' => '+',                                                             
      +     647              32 :                 '^' => '+',                                                             
      +     648              32 :                 '|' => '+',                                                             
      +     649              32 :                 '*' => '+',                                                             
      +     650              32 :                 '%' => '+',                                                             
      +     651              32 :                 '&' => '+',                                                             
      +     652                 :                 '/' => '+'                                                              
      +     653              32 :             );                                                                          
      +     654                 :                                                                                         
      +     655              32 :             $converted = implode($array);                                               
      +     656              32 :             $converted = str_replace(array_keys($schemes),                              
      +     657              32 :                 array_values($schemes), $converted);                                    
      +     658              32 :             $converted = preg_replace('/[+-]\s*\d+/', '+', $converted);                 
      +     659              32 :             $converted = preg_replace('/[()[\]{}]/', '(', $converted);                  
      +     660              32 :             $converted = preg_replace('/[!?:=]/', ':', $converted);                     
      +     661              32 :             $converted = preg_replace('/[^:(+]/', null, stripslashes($converted));      
      +     662                 :                                                                                         
      +     663                 :             // Sort again and implode                                                   
      +     664              32 :             $array = str_split($converted);                                             
      +     665              32 :             asort($array);                                                              
      +     666                 :                                                                                         
      +     667              32 :             $converted = implode($array);                                               
      +     668                 :                                                                                         
      +     669              32 :             if (preg_match('/(?:\({2,}\+{2,}:{2,})|(?:\({2,}\+{2,}:+)|' .               
      +     670              32 :                 '(?:\({3,}\++:{2,})/', $converted)) {                                   
      +     671                 :                                                                                         
      +     672              15 :                 $monitor->centrifuge['converted'] = $converted;                         
      +     673                 :                                                                                         
      +     674              15 :                 return $value . "\n" . $converted;                                      
      +     675                 :             }                                                                           
      +     676              31 :         }                                                                               
      +     677                 :                                                                                         
      +     678              35 :         return $value;                                                                  
      +     679                 :     }                                                                                   
      +     680                 : }                                                                                       
      +     681                 :                                                                                         
      +     682                 : /*                                                                                      
      +     683                 :  * Local variables:                                                                     
      +     684                 :  * tab-width: 4                                                                         
      +     685                 :  * c-basic-offset: 4                                                                    
      +     686                 :  * End:                                                                                 
      +     687                 :  */                                                                                     
      +
      +
      +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Event.php.html b/dvwa/external/phpids/0.6/tests/coverage/Event.php.html new file mode 100644 index 0000000..487c664 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Event.php.html @@ -0,0 +1,773 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current file:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Event.php
      Legend: + executed + not executed + dead code +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%8 / 8 + + + + +
      100.00 %100.00%
      +
      100.00%36 / 36
       
      IDS_Event + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%8 / 8 + + + + +
      100.00 %100.00%
      +
      100.00%36 / 36
       public function __construct($name, $value, array $filters) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%17 / 17
       public function getName() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function getValue() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function getImpact() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7
       public function getTags() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7
       public function getFilters() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function count() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function getIterator() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
      +
      + +
      + + + + + + + + +

      +
      +       1                 : <?php                                                                           
      +       2                 :                                                                                 
      +       3                 : /**                                                                             
      +       4                 :  * PHPIDS                                                                       
      +       5                 :  *                                                                              
      +       6                 :  * Requirements: PHP5, SimpleXML                                                
      +       7                 :  *                                                                              
      +       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                         
      +       9                 :  *                                                                              
      +      10                 :  * PHPIDS is free software; you can redistribute it and/or modify               
      +      11                 :  * it under the terms of the GNU Lesser General Public License as published by  
      +      12                 :  * the Free Software Foundation, version 3 of the License, or                   
      +      13                 :  * (at your option) any later version.                                          
      +      14                 :  *                                                                              
      +      15                 :  * PHPIDS is distributed in the hope that it will be useful,                    
      +      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of               
      +      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                 
      +      18                 :  * GNU Lesser General Public License for more details.                          
      +      19                 :  *                                                                              
      +      20                 :  * You should have received a copy of the GNU Lesser General Public License     
      +      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.               
      +      22                 :  *                                                                              
      +      23                 :  * PHP version 5.1.6+                                                           
      +      24                 :  *                                                                              
      +      25                 :  * @category Security                                                           
      +      26                 :  * @package  PHPIDS                                                             
      +      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                        
      +      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                              
      +      29                 :  * @author   Lars Strojny <lars@strojny.net>                                    
      +      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                         
      +      31                 :  * @link     http://php-ids.org/                                                
      +      32                 :  */                                                                             
      +      33                 :                                                                                 
      +      34                 : /**                                                                             
      +      35                 :  * PHPIDS event object                                                          
      +      36                 :  *                                                                              
      +      37                 :  * This class represents a certain event that occured while applying the filters
      +      38                 :  * to the supplied data. It aggregates a bunch of IDS_Filter implementations and
      +      39                 :  * is a assembled in IDS_Report.                                                
      +      40                 :  *                                                                              
      +      41                 :  * Note that this class implements both Countable and IteratorAggregate         
      +      42                 :  *                                                                              
      +      43                 :  * @category  Security                                                          
      +      44                 :  * @package   PHPIDS                                                            
      +      45                 :  * @author    Christian Matthies <ch0012@gmail.com>                             
      +      46                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                       
      +      47                 :  * @author    Lars Strojny <lars@strojny.net>                                   
      +      48                 :  * @copyright 2007 The PHPIDS Group                                             
      +      49                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                        
      +      50                 :  * @version   Release: $Id:Event.php 517 2007-09-15 15:04:13Z mario $           
      +      51                 :  * @link      http://php-ids.org/                                               
      +      52                 :  */                                                                             
      +      53                 : class IDS_Event implements Countable, IteratorAggregate                         
      +      54                 : {                                                                               
      +      55                 :                                                                                 
      +      56                 :     /**                                                                         
      +      57                 :      * Event name                                                               
      +      58                 :      *                                                                          
      +      59                 :      * @var scalar                                                              
      +      60                 :      */                                                                         
      +      61                 :     protected $name = null;                                                     
      +      62                 :                                                                                 
      +      63                 :     /**                                                                         
      +      64                 :      * Value of the event                                                       
      +      65                 :      *                                                                          
      +      66                 :      * @var scalar                                                              
      +      67                 :      */                                                                         
      +      68                 :     protected $value = null;                                                    
      +      69                 :                                                                                 
      +      70                 :     /**                                                                         
      +      71                 :      * List of filter objects                                                   
      +      72                 :      *                                                                          
      +      73                 :      * Filter objects in this array are those that matched the events value     
      +      74                 :      *                                                                          
      +      75                 :      * @var array                                                               
      +      76                 :      */                                                                         
      +      77                 :     protected $filters = array();                                               
      +      78                 :                                                                                 
      +      79                 :     /**                                                                         
      +      80                 :      * Calculated impact                                                        
      +      81                 :      *                                                                          
      +      82                 :      * Total impact of the event                                                
      +      83                 :      *                                                                          
      +      84                 :      * @var integer                                                             
      +      85                 :      */                                                                         
      +      86                 :     protected $impact = 0;                                                      
      +      87                 :                                                                                 
      +      88                 :     /**                                                                         
      +      89                 :      * Affecte tags                                                             
      +      90                 :      *                                                                          
      +      91                 :      * @var array                                                               
      +      92                 :      */                                                                         
      +      93                 :     protected $tags = array();                                                  
      +      94                 :                                                                                 
      +      95                 :     /**                                                                         
      +      96                 :      * Constructor                                                              
      +      97                 :      *                                                                          
      +      98                 :      * Fills event properties                                                   
      +      99                 :      *                                                                          
      +     100                 :      * @param scalar $name    the event name                                    
      +     101                 :      * @param scalar $value   the event value                                   
      +     102                 :      * @param array  $filters the corresponding filters                         
      +     103                 :      *                                                                          
      +     104                 :      * @return void                                                             
      +     105                 :      */                                                                         
      +     106                 :     public function __construct($name, $value, Array $filters)                  
      +     107                 :     {                                                                           
      +     108              58 :         if (!is_scalar($name)) {                                                
      +     109               1 :             throw new InvalidArgumentException(                                 
      +     110               1 :                 'Expected $name to be a scalar,' . gettype($name) . ' given'    
      +     111               1 :             );                                                                  
      +     112                 :         }                                                                       
      +     113                 :                                                                                 
      +     114              58 :         if (!is_scalar($value)) {                                               
      +     115               1 :             throw new InvalidArgumentException('                                
      +     116               1 :                 Expected $value to be a scalar,' . gettype($value) . ' given'   
      +     117               1 :             );                                                                  
      +     118                 :         }                                                                       
      +     119                 :                                                                                 
      +     120              58 :         $this->name  = $name;                                                   
      +     121              58 :         $this->value = $value;                                                  
      +     122                 :                                                                                 
      +     123              58 :         foreach ($filters as $filter) {                                         
      +     124              58 :             if (!$filter instanceof IDS_Filter) {                               
      +     125               1 :                 throw new InvalidArgumentException(                             
      +     126                 :                     'Filter must be derived from IDS_Filter'                    
      +     127               1 :                 );                                                              
      +     128                 :             }                                                                   
      +     129                 :                                                                                 
      +     130              58 :             $this->filters[] = $filter;                                         
      +     131              58 :         }                                                                       
      +     132              58 :     }                                                                           
      +     133                 :                                                                                 
      +     134                 :     /**                                                                         
      +     135                 :      * Returns event name                                                       
      +     136                 :      *                                                                          
      +     137                 :      * The name of the event usually is the key of the variable that was        
      +     138                 :      * considered to be malicious                                               
      +     139                 :      *                                                                          
      +     140                 :      * @return scalar                                                           
      +     141                 :      */                                                                         
      +     142                 :     public function getName()                                                   
      +     143                 :     {                                                                           
      +     144              53 :         return $this->name;                                                     
      +     145                 :     }                                                                           
      +     146                 :                                                                                 
      +     147                 :     /**                                                                         
      +     148                 :      * Returns event value                                                      
      +     149                 :      *                                                                          
      +     150                 :      * @return scalar                                                           
      +     151                 :      */                                                                         
      +     152                 :     public function getValue()                                                  
      +     153                 :     {                                                                           
      +     154               2 :         return $this->value;                                                    
      +     155                 :     }                                                                           
      +     156                 :                                                                                 
      +     157                 :     /**                                                                         
      +     158                 :      * Returns calculated impact                                                
      +     159                 :      *                                                                          
      +     160                 :      * @return integer                                                          
      +     161                 :      */                                                                         
      +     162                 :     public function getImpact()                                                 
      +     163                 :     {                                                                           
      +     164              35 :         if (!$this->impact) {                                                   
      +     165              35 :             $this->impact = 0;                                                  
      +     166              35 :             foreach ($this->filters as $filter) {                               
      +     167              35 :                 $this->impact += $filter->getImpact();                          
      +     168              35 :             }                                                                   
      +     169              35 :         }                                                                       
      +     170                 :                                                                                 
      +     171              35 :         return $this->impact;                                                   
      +     172                 :     }                                                                           
      +     173                 :                                                                                 
      +     174                 :     /**                                                                         
      +     175                 :      * Returns affected tags                                                    
      +     176                 :      *                                                                          
      +     177                 :      * @return array                                                            
      +     178                 :      */                                                                         
      +     179                 :     public function getTags()                                                   
      +     180                 :     {                                                                           
      +     181               4 :         $filters = $this->getFilters();                                         
      +     182                 :                                                                                 
      +     183               4 :         foreach ($filters as $filter) {                                         
      +     184               4 :             $this->tags = array_merge($this->tags,                              
      +     185               4 :                                       $filter->getTags());                      
      +     186               4 :         }                                                                       
      +     187                 :                                                                                 
      +     188               4 :         $this->tags = array_values(array_unique($this->tags));                  
      +     189                 :                                                                                 
      +     190               4 :         return $this->tags;                                                     
      +     191                 :     }                                                                           
      +     192                 :                                                                                 
      +     193                 :     /**                                                                         
      +     194                 :      * Returns list of filter objects                                           
      +     195                 :      *                                                                          
      +     196                 :      * @return array                                                            
      +     197                 :      */                                                                         
      +     198                 :     public function getFilters()                                                
      +     199                 :     {                                                                           
      +     200               9 :         return $this->filters;                                                  
      +     201                 :     }                                                                           
      +     202                 :                                                                                 
      +     203                 :     /**                                                                         
      +     204                 :      * Returns number of filters                                                
      +     205                 :      *                                                                          
      +     206                 :      * To implement interface Countable this returns the number of filters      
      +     207                 :      * appended.                                                                
      +     208                 :      *                                                                          
      +     209                 :      * @return integer                                                          
      +     210                 :      */                                                                         
      +     211                 :     public function count()                                                     
      +     212                 :     {                                                                           
      +     213               2 :         return count($this->getFilters());                                      
      +     214                 :     }                                                                           
      +     215                 :                                                                                 
      +     216                 :     /**                                                                         
      +     217                 :      * IteratorAggregate iterator getter                                        
      +     218                 :      *                                                                          
      +     219                 :      * Returns an iterator to iterate over the appended filters.                
      +     220                 :      *                                                                          
      +     221                 :      * @return Iterator|IteratorAggregate                                       
      +     222                 :      */                                                                         
      +     223                 :     public function getIterator()                                               
      +     224                 :     {                                                                           
      +     225               3 :         return new ArrayObject($this->getFilters());                            
      +     226                 :     }                                                                           
      +     227                 : }                                                                               
      +     228                 :                                                                                 
      +     229                 : /*                                                                              
      +     230                 :  * Local variables:                                                             
      +     231                 :  * tab-width: 4                                                                 
      +     232                 :  * c-basic-offset: 4                                                            
      +     233                 :  * End:                                                                         
      +     234                 :  */                                                                             
      +
      +
      +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Filter.html b/dvwa/external/phpids/0.6/tests/coverage/Filter.html new file mode 100644 index 0000000..b18d25e --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Filter.html @@ -0,0 +1,102 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current directory:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Filter
      Legend: + + Low: 0% to 35% + + + Medium: 35% to 70% + + + High: 70% to 100% + +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Storage.php + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7 + + + + +
      84.96 %84.96%
      +
      84.96%113 / 133
      +
      + +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Filter.php.html b/dvwa/external/phpids/0.6/tests/coverage/Filter.php.html new file mode 100644 index 0000000..789c534 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Filter.php.html @@ -0,0 +1,612 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current file:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Filter.php
      Legend: + executed + not executed + dead code +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7 + + + + +
      100.00 %100.00%
      +
      100.00%18 / 18
       
      IDS_Filter + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7 + + + + +
      100.00 %100.00%
      +
      100.00%18 / 18
       public function __construct($id, $rule, $description, array $tags, $impact) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%6 / 6
       public function match($string) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7
       public function getDescription() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function getTags() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function getRule() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function getImpact() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function getId() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
      +
      + +
      + + + + + + + + +

      +
      +       1                 : <?php                                                                             
      +       2                 :                                                                                   
      +       3                 : /**                                                                               
      +       4                 :  * PHPIDS                                                                         
      +       5                 :  *                                                                                
      +       6                 :  * Requirements: PHP5, SimpleXML                                                  
      +       7                 :  *                                                                                
      +       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                           
      +       9                 :  *                                                                                
      +      10                 :  * PHPIDS is free software; you can redistribute it and/or modify                 
      +      11                 :  * it under the terms of the GNU Lesser General Public License as published by    
      +      12                 :  * the Free Software Foundation, version 3 of the License, or                     
      +      13                 :  * (at your option) any later version.                                            
      +      14                 :  *                                                                                
      +      15                 :  * PHPIDS is distributed in the hope that it will be useful,                      
      +      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of                 
      +      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                   
      +      18                 :  * GNU Lesser General Public License for more details.                            
      +      19                 :  *                                                                                
      +      20                 :  * You should have received a copy of the GNU Lesser General Public License       
      +      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.                 
      +      22                 :  *                                                                                
      +      23                 :  * PHP version 5.1.6+                                                             
      +      24                 :  *                                                                                
      +      25                 :  * @category Security                                                             
      +      26                 :  * @package  PHPIDS                                                               
      +      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                          
      +      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                                
      +      29                 :  * @author   Lars Strojny <lars@strojny.net>                                      
      +      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                           
      +      31                 :  * @link     http://php-ids.org/                                                  
      +      32                 :  */                                                                               
      +      33                 :                                                                                   
      +      34                 : /**                                                                               
      +      35                 :  * PHPIDS Filter object                                                           
      +      36                 :  *                                                                                
      +      37                 :  * Each object of this class serves as a container for a specific filter. The     
      +      38                 :  * object provides methods to get information about this particular filter and    
      +      39                 :  * also to match an arbitrary string against it.                                  
      +      40                 :  *                                                                                
      +      41                 :  * @category  Security                                                            
      +      42                 :  * @package   PHPIDS                                                              
      +      43                 :  * @author    Christian Matthies <ch0012@gmail.com>                               
      +      44                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                         
      +      45                 :  * @author    Lars Strojny <lars@strojny.net>                                     
      +      46                 :  * @copyright 2007 The PHPIDS Group                                               
      +      47                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                          
      +      48                 :  * @version   Release: $Id:Filter.php 517 2007-09-15 15:04:13Z mario $            
      +      49                 :  * @link      http://php-ids.org/                                                 
      +      50                 :  * @since     Version 0.4                                                         
      +      51                 :  */                                                                               
      +      52                 : class IDS_Filter                                                                  
      +      53                 : {                                                                                 
      +      54                 :                                                                                   
      +      55                 :     /**                                                                           
      +      56                 :      * Filter rule                                                                
      +      57                 :      *                                                                            
      +      58                 :      * @var    string                                                             
      +      59                 :      */                                                                           
      +      60                 :     protected $rule;                                                              
      +      61                 :                                                                                   
      +      62                 :     /**                                                                           
      +      63                 :      * List of tags of the filter                                                 
      +      64                 :      *                                                                            
      +      65                 :      * @var    array                                                              
      +      66                 :      */                                                                           
      +      67                 :     protected $tags = array();                                                    
      +      68                 :                                                                                   
      +      69                 :     /**                                                                           
      +      70                 :      * Filter impact level                                                        
      +      71                 :      *                                                                            
      +      72                 :      * @var    integer                                                            
      +      73                 :      */                                                                           
      +      74                 :     protected $impact = 0;                                                        
      +      75                 :                                                                                   
      +      76                 :     /**                                                                           
      +      77                 :      * Filter description                                                         
      +      78                 :      *                                                                            
      +      79                 :      * @var    string                                                             
      +      80                 :      */                                                                           
      +      81                 :     protected $description = null;                                                
      +      82                 :                                                                                   
      +      83                 :     /**                                                                           
      +      84                 :      * Constructor                                                                
      +      85                 :      *                                                                            
      +      86                 :      * @param mixed   $rule        filter rule                                    
      +      87                 :      * @param string  $description filter description                             
      +      88                 :      * @param array   $tags        list of tags                                   
      +      89                 :      * @param integer $impact      filter impact level                            
      +      90                 :      *                                                                            
      +      91                 :      * @return void                                                               
      +      92                 :      */                                                                           
      +      93                 :     public function __construct($id, $rule, $description, array $tags, $impact)   
      +      94                 :     {                                                                             
      +      95              69 :         $this->id          = $id;                                                 
      +      96              69 :         $this->rule        = $rule;                                               
      +      97              69 :         $this->tags        = $tags;                                               
      +      98              69 :         $this->impact      = $impact;                                             
      +      99              69 :         $this->description = $description;                                        
      +     100              69 :     }                                                                             
      +     101                 :                                                                                   
      +     102                 :     /**                                                                           
      +     103                 :      * Matches a string against current filter                                    
      +     104                 :      *                                                                            
      +     105                 :      * Matches given string against the filter rule the specific object of this   
      +     106                 :      * class represents                                                           
      +     107                 :      *                                                                            
      +     108                 :      * @param string $string the string to match                                  
      +     109                 :      *                                                                            
      +     110                 :      * @throws InvalidArgumentException if argument is no string                  
      +     111                 :      * @return boolean                                                            
      +     112                 :      */                                                                           
      +     113                 :     public function match($string)                                                
      +     114                 :     {                                                                             
      +     115              38 :         if (!is_string($string)) {                                                
      +     116               1 :             throw new InvalidArgumentException('                                  
      +     117               1 :                 Invalid argument. Expected a string, received ' . gettype($string)
      +     118               1 :             );                                                                    
      +     119                 :         }                                                                         
      +     120                 :                                                                                   
      +     121              37 :         return (bool) preg_match(                                                 
      +     122              37 :             '/' . $this->getRule() . '/ms', strtolower($string)                   
      +     123              37 :         );                                                                        
      +     124                 :     }                                                                             
      +     125                 :                                                                                   
      +     126                 :     /**                                                                           
      +     127                 :      * Returns filter description                                                 
      +     128                 :      *                                                                            
      +     129                 :      * @return string                                                             
      +     130                 :      */                                                                           
      +     131                 :     public function getDescription()                                              
      +     132                 :     {                                                                             
      +     133               2 :         return $this->description;                                                
      +     134                 :     }                                                                             
      +     135                 :                                                                                   
      +     136                 :     /**                                                                           
      +     137                 :      * Return list of affected tags                                               
      +     138                 :      *                                                                            
      +     139                 :      * Each filter rule is concerned with a certain kind of attack vectors.       
      +     140                 :      * This method returns those affected kinds.                                  
      +     141                 :      *                                                                            
      +     142                 :      * @return array                                                              
      +     143                 :      */                                                                           
      +     144                 :     public function getTags()                                                     
      +     145                 :     {                                                                             
      +     146               6 :         return $this->tags;                                                       
      +     147                 :     }                                                                             
      +     148                 :                                                                                   
      +     149                 :     /**                                                                           
      +     150                 :      * Returns filter rule                                                        
      +     151                 :      *                                                                            
      +     152                 :      * @return string                                                             
      +     153                 :      */                                                                           
      +     154                 :     public function getRule()                                                     
      +     155                 :     {                                                                             
      +     156              38 :         return $this->rule;                                                       
      +     157                 :     }                                                                             
      +     158                 :                                                                                   
      +     159                 :     /**                                                                           
      +     160                 :      * Get filter impact level                                                    
      +     161                 :      *                                                                            
      +     162                 :      * @return integer                                                            
      +     163                 :      */                                                                           
      +     164                 :     public function getImpact()                                                   
      +     165                 :     {                                                                             
      +     166              36 :         return $this->impact;                                                     
      +     167                 :     }                                                                             
      +     168                 :                                                                                   
      +     169                 :     /**                                                                           
      +     170                 :      * Get filter ID                                                              
      +     171                 :      *                                                                            
      +     172                 :      * @return integer                                                            
      +     173                 :      */                                                                           
      +     174                 :     public function getId()                                                       
      +     175                 :     {                                                                             
      +     176               1 :         return $this->id;                                                         
      +     177                 :     }                                                                             
      +     178                 : }                                                                                 
      +     179                 :                                                                                   
      +     180                 : /*                                                                                
      +     181                 :  * Local variables:                                                               
      +     182                 :  * tab-width: 4                                                                   
      +     183                 :  * c-basic-offset: 4                                                              
      +     184                 :  * End:                                                                           
      +     185                 :  */                                                                               
      +
      +
      +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Filter_Storage.php.html b/dvwa/external/phpids/0.6/tests/coverage/Filter_Storage.php.html new file mode 100644 index 0000000..428d2db --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Filter_Storage.php.html @@ -0,0 +1,1284 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current file:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Filter/Storage.php
      Legend: + executed + not executed + dead code +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7 + + + + +
      84.96 %84.96%
      +
      84.96%113 / 133
       
      IDS_Filter_Storage + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7 + + + + +
      84.96 %84.96%
      +
      84.96%113 / 133
       public function __construct(IDS_Init $init) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      86.36 %86.36%
      +
      86.36%19 / 22
       public function setFilterSet($filterSet) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%4 / 4
       public function getFilterSet() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function addFilter(IDS_Filter $filter) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%2 / 2
       private function _isCached() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7
       public function getFilterFromXML() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      89.80 %89.80%
      +
      89.80%44 / 49
       public function getFilterFromJson() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      75.00 %75.00%
      +
      75.00%36 / 48
      +
      + +
      + + + + + + + + +

      +
      +       1                 : <?php                                                                          
      +       2                 :                                                                                
      +       3                 : /**                                                                            
      +       4                 :  * PHPIDS                                                                      
      +       5                 :  *                                                                             
      +       6                 :  * Requirements: PHP5, SimpleXML                                               
      +       7                 :  *                                                                             
      +       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                        
      +       9                 :  *                                                                             
      +      10                 :  * PHPIDS is free software; you can redistribute it and/or modify              
      +      11                 :  * it under the terms of the GNU Lesser General Public License as published by 
      +      12                 :  * the Free Software Foundation, version 3 of the License, or                  
      +      13                 :  * (at your option) any later version.                                         
      +      14                 :  *                                                                             
      +      15                 :  * PHPIDS is distributed in the hope that it will be useful,                   
      +      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of              
      +      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                
      +      18                 :  * GNU Lesser General Public License for more details.                         
      +      19                 :  *                                                                             
      +      20                 :  * You should have received a copy of the GNU Lesser General Public License    
      +      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.              
      +      22                 :  *                                                                             
      +      23                 :  * PHP version 5.1.6+                                                          
      +      24                 :  *                                                                             
      +      25                 :  * @category Security                                                          
      +      26                 :  * @package  PHPIDS                                                            
      +      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                       
      +      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                             
      +      29                 :  * @author   Lars Strojny <lars@strojny.net>                                   
      +      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                        
      +      31                 :  * @link     http://php-ids.org/                                               
      +      32                 :  */                                                                            
      +      33                 :                                                                                
      +      34                 : /**                                                                            
      +      35                 :  * Filter Storage                                                              
      +      36                 :  *                                                                             
      +      37                 :  * This class provides various default functions for gathering filter patterns 
      +      38                 :  * to be used later on by the detection mechanism. You might extend this class 
      +      39                 :  * to your requirements.                                                       
      +      40                 :  *                                                                             
      +      41                 :  * @category  Security                                                         
      +      42                 :  * @package   PHPIDS                                                           
      +      43                 :  * @author    Christian Matthies <ch0012@gmail.com>                            
      +      44                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                      
      +      45                 :  * @author    Lars Strojny <lars@strojny.net>                                  
      +      46                 :  * @copyright 2007 The PHPIDS Group                                            
      +      47                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                       
      +      48                 :  * @version   Release: $Id:Storage.php 517 2007-09-15 15:04:13Z mario $        
      +      49                 :  * @link      http://php-ids.org/                                              
      +      50                 :  */                                                                            
      +      51                 : class IDS_Filter_Storage                                                       
      +      52                 : {                                                                              
      +      53                 :                                                                                
      +      54                 :     /**                                                                        
      +      55                 :      * Filter source file                                                      
      +      56                 :      *                                                                         
      +      57                 :      * @var string                                                             
      +      58                 :      */                                                                        
      +      59                 :     protected $source = null;                                                  
      +      60                 :                                                                                
      +      61                 :     /**                                                                        
      +      62                 :      * Holds caching settings                                                  
      +      63                 :      *                                                                         
      +      64                 :      * @var array                                                              
      +      65                 :      */                                                                        
      +      66                 :     protected $cacheSettings = null;                                           
      +      67                 :                                                                                
      +      68                 :     /**                                                                        
      +      69                 :      * Cache container                                                         
      +      70                 :      *                                                                         
      +      71                 :      * @var object IDS_Caching wrapper                                         
      +      72                 :      */                                                                        
      +      73                 :     protected $cache = null;                                                   
      +      74                 :                                                                                
      +      75                 :     /**                                                                        
      +      76                 :      * Filter container                                                        
      +      77                 :      *                                                                         
      +      78                 :      * @var array                                                              
      +      79                 :      */                                                                        
      +      80                 :     protected $filterSet = array();                                            
      +      81                 :                                                                                
      +      82                 :     /**                                                                        
      +      83                 :      * Constructor                                                             
      +      84                 :      *                                                                         
      +      85                 :      * Loads filters based on provided IDS_Init settings.                      
      +      86                 :      *                                                                         
      +      87                 :      * @param object $init IDS_Init instance                                   
      +      88                 :      *                                                                         
      +      89                 :      * @throws Exception if unsupported filter type is given                   
      +      90                 :      * @return void                                                            
      +      91                 :      */                                                                        
      +      92                 :     public final function __construct(IDS_Init $init)                          
      +      93                 :     {                                                                          
      +      94              42 :         if ($init->config) {                                                   
      +      95                 :                                                                                
      +      96              42 :             $caching = isset($init->config['Caching']['caching']) ?            
      +      97              42 :                 $init->config['Caching']['caching'] : 'none';                  
      +      98                 :                                                                                
      +      99              42 :             $type         = $init->config['General']['filter_type'];           
      +     100              42 :             $this->source = $init->getBasePath()                               
      +     101              42 :                 . $init->config['General']['filter_path'];                     
      +     102                 :                                                                                
      +     103              42 :             if ($caching && $caching != 'none') {                              
      +     104              42 :                 $this->cacheSettings = $init->config['Caching'];               
      +     105              42 :                 include_once 'IDS/Caching/Factory.php';                        
      +     106              42 :                 $this->cache = IDS_Caching::factory($init, 'storage');         
      +     107              42 :             }                                                                  
      +     108                 :                                                                                
      +     109                 :             switch ($type) {                                                   
      +     110              42 :             case 'xml' :                                                       
      +     111              41 :                 $this->getFilterFromXML();                                     
      +     112              41 :                 break;                                                         
      +     113               1 :             case 'json' :                                                      
      +     114               1 :                 $this->getFilterFromJson();                                    
      +     115               1 :                 break;                                                         
      +     116               0 :             default :                                                          
      +     117               0 :                 throw new Exception('Unsupported filter type.');               
      +     118               0 :             }                                                                  
      +     119              42 :         }                                                                      
      +     120              42 :     }                                                                          
      +     121                 :                                                                                
      +     122                 :     /**                                                                        
      +     123                 :      * Sets the filter array                                                   
      +     124                 :      *                                                                         
      +     125                 :      * @param array $filterSet array containing multiple IDS_Filter instances  
      +     126                 :      *                                                                         
      +     127                 :      * @return object $this                                                    
      +     128                 :      */                                                                        
      +     129                 :     public final function setFilterSet($filterSet)                             
      +     130                 :     {                                                                          
      +     131               1 :         foreach ($filterSet as $filter) {                                      
      +     132               1 :             $this->addFilter($filter);                                         
      +     133               1 :         }                                                                      
      +     134                 :                                                                                
      +     135               1 :         return $this;                                                          
      +     136                 :     }                                                                          
      +     137                 :                                                                                
      +     138                 :     /**                                                                        
      +     139                 :      * Returns registered filters                                              
      +     140                 :      *                                                                         
      +     141                 :      * @return array                                                           
      +     142                 :      */                                                                        
      +     143                 :     public final function getFilterSet()                                       
      +     144                 :     {                                                                          
      +     145              35 :         return $this->filterSet;                                               
      +     146                 :     }                                                                          
      +     147                 :                                                                                
      +     148                 :     /**                                                                        
      +     149                 :      * Adds a filter                                                           
      +     150                 :      *                                                                         
      +     151                 :      * @param object $filter IDS_Filter instance                               
      +     152                 :      *                                                                         
      +     153                 :      * @return object $this                                                    
      +     154                 :      */                                                                        
      +     155                 :     public final function addFilter(IDS_Filter $filter)                        
      +     156                 :     {                                                                          
      +     157              42 :         $this->filterSet[] = $filter;                                          
      +     158              42 :         return $this;                                                          
      +     159                 :     }                                                                          
      +     160                 :                                                                                
      +     161                 :     /**                                                                        
      +     162                 :      * Checks if any filters are cached                                        
      +     163                 :      *                                                                         
      +     164                 :      * @return mixed $filters cached filters or false                          
      +     165                 :      */                                                                        
      +     166                 :     private function _isCached()                                               
      +     167                 :     {                                                                          
      +     168              42 :         $filters = false;                                                      
      +     169                 :                                                                                
      +     170              42 :         if ($this->cacheSettings) {                                            
      +     171                 :                                                                                
      +     172              42 :             if ($this->cache) {                                                
      +     173              42 :                 $filters = $this->cache->getCache();                           
      +     174              42 :             }                                                                  
      +     175              42 :         }                                                                      
      +     176                 :                                                                                
      +     177              42 :         return $filters;                                                       
      +     178                 :     }                                                                          
      +     179                 :                                                                                
      +     180                 :     /**                                                                        
      +     181                 :      * Loads filters from XML using SimpleXML                                  
      +     182                 :      *                                                                         
      +     183                 :      * This function parses the provided source file and stores the result.    
      +     184                 :      * If caching mode is enabled the result will be cached to increase        
      +     185                 :      * the performance.                                                        
      +     186                 :      *                                                                         
      +     187                 :      * @throws Exception if problems with fetching the XML data occur          
      +     188                 :      * @return object $this                                                    
      +     189                 :      */                                                                        
      +     190                 :     public function getFilterFromXML()                                         
      +     191                 :     {                                                                          
      +     192                 :                                                                                
      +     193              41 :         if (extension_loaded('SimpleXML')) {                                   
      +     194                 :                                                                                
      +     195                 :             /*                                                                 
      +     196                 :              * See if filters are already available in the cache               
      +     197                 :              */                                                                
      +     198              41 :             $filters = $this->_isCached();                                     
      +     199                 :                                                                                
      +     200                 :             /*                                                                 
      +     201                 :              * If they aren't, parse the source file                           
      +     202                 :              */                                                                
      +     203              41 :             if (!$filters) {                                                   
      +     204               1 :                 if (file_exists($this->source)) {                              
      +     205               1 :                     if (LIBXML_VERSION >= 20621) {                             
      +     206               1 :                         $filters = simplexml_load_file($this->source,          
      +     207               1 :                                                        null,                   
      +     208               1 :                                                        LIBXML_COMPACT);        
      +     209               1 :                     } else {                                                   
      +     210               0 :                         $filters = simplexml_load_file($this->source);         
      +     211                 :                     }                                                          
      +     212               1 :                 }                                                              
      +     213               1 :             }                                                                  
      +     214                 :                                                                                
      +     215                 :             /*                                                                 
      +     216                 :              * In case we still don't have any filters loaded and exception    
      +     217                 :              * will be thrown                                                  
      +     218                 :              */                                                                
      +     219              41 :             if (empty($filters)) {                                             
      +     220               0 :                 throw new Exception(                                           
      +     221                 :                     'XML data could not be loaded.' .                          
      +     222                 :                         ' Make sure you specified the correct path.'           
      +     223               0 :                 );                                                             
      +     224                 :             }                                                                  
      +     225                 :                                                                                
      +     226                 :             /*                                                                 
      +     227                 :              * Now the storage will be filled with IDS_Filter objects          
      +     228                 :              */                                                                
      +     229              41 :             $data    = array();                                                
      +     230              41 :             $nocache = $filters instanceof SimpleXMLElement;                   
      +     231              41 :             $filters = $nocache ? $filters->filter : $filters;                 
      +     232                 :                                                                                
      +     233              41 :             include_once 'IDS/Filter.php';                                     
      +     234                 :                                                                                
      +     235              41 :             foreach ($filters as $filter) {                                    
      +     236                 :                                                                                
      +     237              41 :                 $id          = $nocache ? (string) $filter->id :               
      +     238              41 :                     $filter['id'];                                             
      +     239              41 :                 $rule        = $nocache ? (string) $filter->rule :             
      +     240              41 :                     $filter['rule'];                                           
      +     241              41 :                 $impact      = $nocache ? (string) $filter->impact :           
      +     242              41 :                     $filter['impact'];                                         
      +     243              41 :                 $tags        = $nocache ? array_values((array) $filter->tags) :
      +     244              41 :                     $filter['tags'];                                           
      +     245              41 :                 $description = $nocache ? (string) $filter->description :      
      +     246              41 :                     $filter['description'];                                    
      +     247                 :                                                                                
      +     248              41 :                 $this->addFilter(new IDS_Filter($id,                           
      +     249              41 :                                                 $rule,                         
      +     250              41 :                                                 $description,                  
      +     251              41 :                                                 (array) $tags[0],              
      +     252              41 :                                                 (int) $impact));               
      +     253                 :                                                                                
      +     254              41 :                 $data[] = array(                                               
      +     255              41 :                     'id'          => $id,                                      
      +     256              41 :                     'rule'        => $rule,                                    
      +     257              41 :                     'impact'      => $impact,                                  
      +     258              41 :                     'tags'        => $tags,                                    
      +     259                 :                     'description' => $description                              
      +     260              41 :                 );                                                             
      +     261              41 :             }                                                                  
      +     262                 :                                                                                
      +     263                 :             /*                                                                 
      +     264                 :              * If caching is enabled, the fetched data will be cached          
      +     265                 :              */                                                                
      +     266              41 :             if ($this->cacheSettings) {                                        
      +     267                 :                                                                                
      +     268              41 :                 $this->cache->setCache($data);                                 
      +     269              41 :             }                                                                  
      +     270                 :                                                                                
      +     271              41 :         } else {                                                               
      +     272               0 :             throw new Exception(                                               
      +     273                 :                 'SimpleXML not loaded.'                                        
      +     274               0 :             );                                                                 
      +     275                 :         }                                                                      
      +     276                 :                                                                                
      +     277              41 :         return $this;                                                          
      +     278                 :     }                                                                          
      +     279                 :                                                                                
      +     280                 :     /**                                                                        
      +     281                 :      * Loads filters from Json file using ext/Json                             
      +     282                 :      *                                                                         
      +     283                 :      * This function parses the provided source file and stores the result.    
      +     284                 :      * If caching mode is enabled the result will be cached to increase        
      +     285                 :      * the performance.                                                        
      +     286                 :      *                                                                         
      +     287                 :      * @throws Exception if problems with fetching the JSON data occur         
      +     288                 :      * @return object $this                                                    
      +     289                 :      */                                                                        
      +     290                 :     public function getFilterFromJson()                                        
      +     291                 :     {                                                                          
      +     292                 :                                                                                
      +     293               1 :         if (extension_loaded('Json')) {                                        
      +     294                 :                                                                                
      +     295                 :             /*                                                                 
      +     296                 :              * See if filters are already available in the cache               
      +     297                 :              */                                                                
      +     298               1 :             $filters = $this->_isCached();                                     
      +     299                 :                                                                                
      +     300                 :             /*                                                                 
      +     301                 :              * If they aren't, parse the source file                           
      +     302                 :              */                                                                
      +     303               1 :             if (!$filters) {                                                   
      +     304               0 :                 if (file_exists($this->source)) {                              
      +     305               0 :                     @set_magic_quotes_runtime(0);                              
      +     306               0 :                     $content = file_get_contents($this->source);               
      +     307               0 :                     $filters = json_decode($content);                          
      +     308               0 :                 } else {                                                       
      +     309               0 :                     throw new Exception(                                       
      +     310                 :                         'JSON data could not be loaded.' .                     
      +     311                 :                             ' Make sure you specified the correct path.'       
      +     312               0 :                     );                                                         
      +     313                 :                 }                                                              
      +     314               0 :             }                                                                  
      +     315                 :                                                                                
      +     316               1 :             if (!$filters) {                                                   
      +     317               0 :                 throw new Exception(                                           
      +     318                 :                     'JSON data could not be loaded.' .                         
      +     319                 :                         ' Make sure you specified the correct path.'           
      +     320               0 :                 );                                                             
      +     321                 :             }                                                                  
      +     322                 :                                                                                
      +     323                 :             /*                                                                 
      +     324                 :              * Now the storage will be filled with IDS_Filter objects          
      +     325                 :              */                                                                
      +     326               1 :             $data    = array();                                                
      +     327               1 :             $nocache = !is_array($filters);                                    
      +     328               1 :             $filters = $nocache ? $filters->filters->filter : $filters;        
      +     329                 :                                                                                
      +     330               1 :             include_once 'IDS/Filter.php';                                     
      +     331                 :                                                                                
      +     332               1 :             foreach ($filters as $filter) {                                    
      +     333                 :                                                                                
      +     334               1 :                 $id          = $nocache ? (string) $filter->id :               
      +     335               1 :                     $filter['id'];                                             
      +     336               1 :                 $rule        = $nocache ? (string) $filter->rule :             
      +     337               1 :                     $filter['rule'];                                           
      +     338               1 :                 $impact      = $nocache ? (string) $filter->impact :           
      +     339               1 :                     $filter['impact'];                                         
      +     340               1 :                 $tags        = $nocache ? array_values((array) $filter->tags) :
      +     341               1 :                     $filter['tags'];                                           
      +     342               1 :                 $description = $nocache ? (string) $filter->description :      
      +     343               1 :                     $filter['description'];                                    
      +     344                 :                                                                                
      +     345               1 :                 $this->addFilter(new IDS_Filter($id,                           
      +     346               1 :                                                 $rule,                         
      +     347               1 :                                                 $description,                  
      +     348               1 :                                                 (array) $tags[0],              
      +     349               1 :                                                 (int) $impact));               
      +     350                 :                                                                                
      +     351               1 :                 $data[] = array(                                               
      +     352               1 :                     'id'          => $id,                                      
      +     353               1 :                     'rule'        => $rule,                                    
      +     354               1 :                     'impact'      => $impact,                                  
      +     355               1 :                     'tags'        => $tags,                                    
      +     356                 :                     'description' => $description                              
      +     357               1 :                 );                                                             
      +     358               1 :             }                                                                  
      +     359                 :                                                                                
      +     360                 :             /*                                                                 
      +     361                 :              * If caching is enabled, the fetched data will be cached          
      +     362                 :              */                                                                
      +     363               1 :             if ($this->cacheSettings) {                                        
      +     364               1 :                 $this->cache->setCache($data);                                 
      +     365               1 :             }                                                                  
      +     366                 :                                                                                
      +     367               1 :         } else {                                                               
      +     368               0 :             throw new Exception(                                               
      +     369                 :                 'ext/json not loaded.'                                         
      +     370               0 :             );                                                                 
      +     371                 :         }                                                                      
      +     372                 :                                                                                
      +     373               1 :         return $this;                                                          
      +     374                 :     }                                                                          
      +     375                 : }                                                                              
      +     376                 :                                                                                
      +     377                 : /*                                                                             
      +     378                 :  * Local variables:                                                            
      +     379                 :  * tab-width: 4                                                                
      +     380                 :  * c-basic-offset: 4                                                           
      +     381                 :  * End:                                                                        
      +     382                 :  */                                                                            
      +
      +
      +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Init.php.html b/dvwa/external/phpids/0.6/tests/coverage/Init.php.html new file mode 100644 index 0000000..1610ac6 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Init.php.html @@ -0,0 +1,822 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current file:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Init.php
      Legend: + executed + not executed + dead code +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%9 / 9 + + + + +
      100.00 %100.00%
      +
      100.00%42 / 42
       
      IDS_Init + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%9 / 9 + + + + +
      100.00 %100.00%
      +
      100.00%42 / 42
       private function __construct($configPath = NULL) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7
       public function __clone() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public static function init($configPath = NULL) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%4 / 4
       public function setConfigPath($path) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7
       public function getConfigPath() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function getBasePath() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%5 / 5
       public function setConfig(array $config, $overwrite = false) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%5 / 5
       protected function _mergeConfig($current, $successor) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%11 / 11
       public function getConfig() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
      +
      + +
      + + + + + + + + +

      +
      +       1                 : <?php                                                                            
      +       2                 :                                                                                  
      +       3                 : /**                                                                              
      +       4                 :  * PHPIDS                                                                        
      +       5                 :  *                                                                               
      +       6                 :  * Requirements: PHP5, SimpleXML                                                 
      +       7                 :  *                                                                               
      +       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                          
      +       9                 :  *                                                                               
      +      10                 :  * PHPIDS is free software; you can redistribute it and/or modify                
      +      11                 :  * it under the terms of the GNU Lesser General Public License as published by   
      +      12                 :  * the Free Software Foundation, version 3 of the License, or                    
      +      13                 :  * (at your option) any later version.                                           
      +      14                 :  *                                                                               
      +      15                 :  * PHPIDS is distributed in the hope that it will be useful,                     
      +      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of                
      +      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  
      +      18                 :  * GNU Lesser General Public License for more details.                           
      +      19                 :  *                                                                               
      +      20                 :  * You should have received a copy of the GNU Lesser General Public License      
      +      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.                
      +      22                 :  *                                                                               
      +      23                 :  * PHP version 5.1.6+                                                            
      +      24                 :  *                                                                               
      +      25                 :  * @category Security                                                            
      +      26                 :  * @package  PHPIDS                                                              
      +      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                         
      +      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                               
      +      29                 :  * @author   Lars Strojny <lars@strojny.net>                                     
      +      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                          
      +      31                 :  * @link     http://php-ids.org/                                                 
      +      32                 :  */                                                                              
      +      33                 :                                                                                  
      +      34                 : /**                                                                              
      +      35                 :  * Framework initiation                                                          
      +      36                 :  *                                                                               
      +      37                 :  * This class is used for the purpose to initiate the framework and inhabits     
      +      38                 :  * functionality to parse the needed configuration file.                         
      +      39                 :  *                                                                               
      +      40                 :  * @category  Security                                                           
      +      41                 :  * @package   PHPIDS                                                             
      +      42                 :  * @author    Christian Matthies <ch0012@gmail.com>                              
      +      43                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                        
      +      44                 :  * @author    Lars Strojny <lars@strojny.net>                                    
      +      45                 :  * @copyright 2007 The PHPIDS Groupup                                            
      +      46                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                         
      +      47                 :  * @version   Release: $Id:Init.php 517 2007-09-15 15:04:13Z mario $             
      +      48                 :  * @link      http://php-ids.org/                                                
      +      49                 :  * @since     Version 0.4                                                        
      +      50                 :  */                                                                              
      +      51                 : class IDS_Init                                                                   
      +      52                 : {                                                                                
      +      53                 :                                                                                  
      +      54                 :     /**                                                                          
      +      55                 :      * Holds config settings                                                     
      +      56                 :      *                                                                           
      +      57                 :      * @var array                                                                
      +      58                 :      */                                                                          
      +      59                 :     public $config = array();                                                    
      +      60                 :                                                                                  
      +      61                 :     /**                                                                          
      +      62                 :      * Instance of this class depending on the supplied config file              
      +      63                 :      *                                                                           
      +      64                 :      * @var array                                                                
      +      65                 :      * @static                                                                   
      +      66                 :      */                                                                          
      +      67                 :     private static $instances = array();                                         
      +      68                 :                                                                                  
      +      69                 :     /**                                                                          
      +      70                 :      * Path to the config file                                                   
      +      71                 :      *                                                                           
      +      72                 :      * @var string                                                               
      +      73                 :      */                                                                          
      +      74                 :     private $configPath = null;                                                  
      +      75                 :                                                                                  
      +      76                 :     /**                                                                          
      +      77                 :      * Constructor                                                               
      +      78                 :      *                                                                           
      +      79                 :      * Includes needed classes and parses the configuration file                 
      +      80                 :      *                                                                           
      +      81                 :      * @param string $configPath the path to the config file                     
      +      82                 :      *                                                                           
      +      83                 :      * @return object $this                                                      
      +      84                 :      */                                                                          
      +      85                 :     private function __construct($configPath = null)                             
      +      86                 :     {                                                                            
      +      87               3 :         include_once 'IDS/Monitor.php';                                          
      +      88               3 :         include_once 'IDS/Filter/Storage.php';                                   
      +      89                 :                                                                                  
      +      90               3 :         if ($configPath) {                                                       
      +      91               2 :             $this->setConfigPath($configPath);                                   
      +      92               1 :             $this->config = parse_ini_file($this->configPath, true);             
      +      93               1 :         }                                                                        
      +      94               2 :     }                                                                            
      +      95                 :                                                                                  
      +      96                 :     /**                                                                          
      +      97                 :      * Permitting to clone this object                                           
      +      98                 :      *                                                                           
      +      99                 :      * For the sake of correctness of a singleton pattern, this is necessary     
      +     100                 :      *                                                                           
      +     101                 :      * @return void                                                              
      +     102                 :      */                                                                          
      +     103                 :     public final function __clone()                                              
      +     104                 :     {                                                                            
      +     105               1 :     }                                                                            
      +     106                 :                                                                                  
      +     107                 :     /**                                                                          
      +     108                 :      * Returns an instance of this class. Also a PHP version check               
      +     109                 :      * is being performed to avoid compatibility problems with PHP < 5.1.6       
      +     110                 :      *                                                                           
      +     111                 :      * @param string $configPath the path to the config file                     
      +     112                 :      *                                                                           
      +     113                 :      * @return object                                                            
      +     114                 :      */                                                                          
      +     115                 :     public static function init($configPath = null)                              
      +     116                 :     {                                                                            
      +     117              67 :         if (!isset(self::$instances[$configPath])) {                             
      +     118               3 :             self::$instances[$configPath] = new IDS_Init($configPath);           
      +     119               2 :         }                                                                        
      +     120                 :                                                                                  
      +     121              67 :         return self::$instances[$configPath];                                    
      +     122                 :     }                                                                            
      +     123                 :                                                                                  
      +     124                 :     /**                                                                          
      +     125                 :      * Sets the path to the configuration file                                   
      +     126                 :      *                                                                           
      +     127                 :      * @param string $path the path to the config                                
      +     128                 :      *                                                                           
      +     129                 :      * @throws Exception if file not found                                       
      +     130                 :      * @return void                                                              
      +     131                 :      */                                                                          
      +     132                 :     public function setConfigPath($path)                                         
      +     133                 :     {                                                                            
      +     134               2 :         if (file_exists($path)) {                                                
      +     135               1 :             $this->configPath = $path;                                           
      +     136               1 :         } else {                                                                 
      +     137               1 :             throw new Exception(                                                 
      +     138                 :                 'Configuration file could not be found at ' .                    
      +     139               1 :                 htmlspecialchars($path, ENT_QUOTES, 'UTF-8')                     
      +     140               1 :             );                                                                   
      +     141                 :         }                                                                        
      +     142               1 :     }                                                                            
      +     143                 :                                                                                  
      +     144                 :     /**                                                                          
      +     145                 :      * Returns path to configuration file                                        
      +     146                 :      *                                                                           
      +     147                 :      * @return string the config path                                            
      +     148                 :      */                                                                          
      +     149                 :     public function getConfigPath()                                              
      +     150                 :     {                                                                            
      +     151               1 :         return $this->configPath;                                                
      +     152                 :     }                                                                            
      +     153                 :                                                                                  
      +     154                 :     /**                                                                          
      +     155                 :      * This method checks if a base path is given and usage is set to true.      
      +     156                 :      * If all that tests succeed the base path will be returned as a string -    
      +     157                 :      * else null will be returned.                                               
      +     158                 :      *                                                                           
      +     159                 :      * @return string the base path or null                                      
      +     160                 :      */                                                                          
      +     161                 :     public function getBasePath() {                                              
      +     162                 :                                                                                  
      +     163              42 :         return ((isset($this->config['General']['base_path'])                    
      +     164              42 :             && $this->config['General']['base_path']                             
      +     165              42 :             && isset($this->config['General']['use_base_path'])                  
      +     166              42 :             && $this->config['General']['use_base_path'])                        
      +     167              42 :                 ? $this->config['General']['base_path'] : null);                 
      +     168                 :     }                                                                            
      +     169                 :                                                                                  
      +     170                 :     /**                                                                          
      +     171                 :      * Merges new settings into the exsiting ones or overwrites them             
      +     172                 :      *                                                                           
      +     173                 :      * @param array   $config    the config array                                
      +     174                 :      * @param boolean $overwrite config overwrite flag                           
      +     175                 :      *                                                                           
      +     176                 :      * @return void                                                              
      +     177                 :      */                                                                          
      +     178                 :     public function setConfig(array $config, $overwrite = false)                 
      +     179                 :     {                                                                            
      +     180               2 :         if ($overwrite) {                                                        
      +     181               2 :             $this->config = $this->_mergeConfig($this->config, $config);         
      +     182               2 :         } else {                                                                 
      +     183               1 :             $this->config = $this->_mergeConfig($config, $this->config);         
      +     184                 :         }                                                                        
      +     185               2 :     }                                                                            
      +     186                 :                                                                                  
      +     187                 :     /**                                                                          
      +     188                 :      * Merge config hashes recursivly                                            
      +     189                 :      *                                                                           
      +     190                 :      * The algorithm merges configuration arrays recursively. If an element is   
      +     191                 :      * an array in both, the values will be appended. If it is a scalar in both, 
      +     192                 :      * the value will be replaced.                                               
      +     193                 :      *                                                                           
      +     194                 :      * @param  array $current The legacy hash                                    
      +     195                 :      * @param  array $successor The hash which values count more when in doubt   
      +     196                 :      * @return array Merged hash                                                 
      +     197                 :      */                                                                          
      +     198                 :     protected function _mergeConfig($current, $successor)                        
      +     199                 :     {                                                                            
      +     200               2 :         if (is_array($current) and is_array($successor)) {                       
      +     201               2 :             foreach ($successor as $key => $value) {                             
      +     202               2 :                 if (isset($current[$key])                                        
      +     203               2 :                     and is_array($value)                                         
      +     204               2 :                     and is_array($current[$key])) {                              
      +     205                 :                                                                                  
      +     206               2 :                     $current[$key] = $this->_mergeConfig($current[$key], $value);
      +     207               2 :                 } else {                                                         
      +     208               2 :                     $current[$key] = $successor[$key];                           
      +     209                 :                 }                                                                
      +     210               2 :             }                                                                    
      +     211               2 :         }                                                                        
      +     212               2 :         return $current;                                                         
      +     213                 :     }                                                                            
      +     214                 :                                                                                  
      +     215                 :     /**                                                                          
      +     216                 :      * Returns the config array                                                  
      +     217                 :      *                                                                           
      +     218                 :      * @return array the config array                                            
      +     219                 :      */                                                                          
      +     220                 :     public function getConfig()                                                  
      +     221                 :     {                                                                            
      +     222               1 :         return $this->config;                                                    
      +     223                 :     }                                                                            
      +     224                 : }                                                                                
      +     225                 :                                                                                  
      +     226                 : /*                                                                               
      +     227                 :  * Local variables:                                                              
      +     228                 :  * tab-width: 4                                                                  
      +     229                 :  * c-basic-offset: 4                                                             
      +     230                 :  * End:                                                                          
      +     231                 :  */                                                                              
      +
      +
      +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Monitor.php.html b/dvwa/external/phpids/0.6/tests/coverage/Monitor.php.html new file mode 100644 index 0000000..492b19c --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Monitor.php.html @@ -0,0 +1,2126 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current file:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Monitor.php
      Legend: + executed + not executed + dead code +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      84.21 %84.21%
      +
      84.21%16 / 19 + + + + +
      87.11 %87.11%
      +
      87.11%169 / 194
       
      IDS_Monitor + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      84.21 %84.21%
      +
      84.21%16 / 19 + + + + +
      87.11 %87.11%
      +
      87.11%169 / 194
       public function __construct(array $request, IDS_Init $init, array $tags = NULL) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      79.41 %79.41%
      +
      79.41%27 / 34
       public function run() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%6 / 6
       private function _iterate($key, $value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%17 / 17
       private function _detect($key, $value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%37 / 37
       private function _purifyValues($key, $value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      70.37 %70.37%
      +
      70.37%19 / 27
       private function _diff($original, $purified, $redux) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%26 / 26
       private function _jsonDecodeValues($key, $value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      72.73 %72.73%
      +
      72.73%8 / 11
       private function _jsonConcatContents($key, $value) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%2 / 2
       private function _match($key, $value, $filter) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7
       public function setExceptions($exceptions) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%5 / 5
       public function getExceptions() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function setHtml($html) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%5 / 5
       public function addHtml($value) + + + + +
      0.00 %0.00%
      +
      0.00%0 / 1 + + + + +
      0.00 %0.00%
      +
      0.00%0 / 2
       public function getHtml() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function setJson($json) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      60.00 %60.00%
      +
      60.00%3 / 5
       public function addJson($value) + + + + +
      0.00 %0.00%
      +
      0.00%0 / 1 + + + + +
      0.00 %0.00%
      +
      0.00%0 / 2
       public function getJson() + + + + +
      0.00 %0.00%
      +
      0.00%0 / 1 + + + + +
      0.00 %0.00%
      +
      0.00%0 / 1
       public function getStorage() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function getReport() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%4 / 4
      +
      + +
      + + + + + + + + +

      +
      +       1                 : <?php                                                                              
      +       2                 :                                                                                    
      +       3                 : /**                                                                                
      +       4                 :  * PHPIDS                                                                          
      +       5                 :  *                                                                                 
      +       6                 :  * Requirements: PHP5, SimpleXML                                                   
      +       7                 :  *                                                                                 
      +       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                            
      +       9                 :  *                                                                                 
      +      10                 :  * PHPIDS is free software; you can redistribute it and/or modify                  
      +      11                 :  * it under the terms of the GNU Lesser General Public License as published by     
      +      12                 :  * the Free Software Foundation, version 3 of the License, or                      
      +      13                 :  * (at your option) any later version.                                             
      +      14                 :  *                                                                                 
      +      15                 :  * PHPIDS is distributed in the hope that it will be useful,                       
      +      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of                  
      +      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                    
      +      18                 :  * GNU Lesser General Public License for more details.                             
      +      19                 :  *                                                                                 
      +      20                 :  * You should have received a copy of the GNU Lesser General Public License        
      +      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.                  
      +      22                 :  *                                                                                 
      +      23                 :  * PHP version 5.1.6+                                                              
      +      24                 :  *                                                                                 
      +      25                 :  * @category Security                                                              
      +      26                 :  * @package  PHPIDS                                                                
      +      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                           
      +      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                                 
      +      29                 :  * @author   Lars Strojny <lars@strojny.net>                                       
      +      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                            
      +      31                 :  * @link     http://php-ids.org/                                                   
      +      32                 :  */                                                                                
      +      33                 :                                                                                    
      +      34                 : /**                                                                                
      +      35                 :  * Monitoring engine                                                               
      +      36                 :  *                                                                                 
      +      37                 :  * This class represents the core of the frameworks attack detection mechanism     
      +      38                 :  * and provides functions to scan incoming data for malicious appearing script     
      +      39                 :  * fragments.                                                                      
      +      40                 :  *                                                                                 
      +      41                 :  * @category  Security                                                             
      +      42                 :  * @package   PHPIDS                                                               
      +      43                 :  * @author    Christian Matthies <ch0012@gmail.com>                                
      +      44                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                          
      +      45                 :  * @author    Lars Strojny <lars@strojny.net>                                      
      +      46                 :  * @copyright 2007 The PHPIDS Group                                                
      +      47                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                           
      +      48                 :  * @version   Release: $Id:Monitor.php 949 2008-06-28 01:26:03Z christ1an $        
      +      49                 :  * @link      http://php-ids.org/                                                  
      +      50                 :  */                                                                                
      +      51                 : class IDS_Monitor                                                                  
      +      52                 : {                                                                                  
      +      53                 :                                                                                    
      +      54                 :     /**                                                                            
      +      55                 :      * Tags to define what to search for                                           
      +      56                 :      *                                                                             
      +      57                 :      * Accepted values are xss, csrf, sqli, dt, id, lfi, rfe, spam, dos            
      +      58                 :      *                                                                             
      +      59                 :      * @var array                                                                  
      +      60                 :      */                                                                            
      +      61                 :     private $tags = null;                                                          
      +      62                 :                                                                                    
      +      63                 :     /**                                                                            
      +      64                 :      * Request array                                                               
      +      65                 :      *                                                                             
      +      66                 :      * Array containing raw data to search in                                      
      +      67                 :      *                                                                             
      +      68                 :      * @var array                                                                  
      +      69                 :      */                                                                            
      +      70                 :     private $request = null;                                                       
      +      71                 :                                                                                    
      +      72                 :     /**                                                                            
      +      73                 :      * Container for filter rules                                                  
      +      74                 :      *                                                                             
      +      75                 :      * Holds an instance of IDS_Filter_Storage                                     
      +      76                 :      *                                                                             
      +      77                 :      * @var object                                                                 
      +      78                 :      */                                                                            
      +      79                 :     private $storage = null;                                                       
      +      80                 :                                                                                    
      +      81                 :     /**                                                                            
      +      82                 :      * Results                                                                     
      +      83                 :      *                                                                             
      +      84                 :      * Holds an instance of IDS_Report which itself provides an API to             
      +      85                 :      * access the detected results                                                 
      +      86                 :      *                                                                             
      +      87                 :      * @var object                                                                 
      +      88                 :      */                                                                            
      +      89                 :     private $report = null;                                                        
      +      90                 :                                                                                    
      +      91                 :     /**                                                                            
      +      92                 :      * Scan keys switch                                                            
      +      93                 :      *                                                                             
      +      94                 :      * Enabling this property will cause the monitor to scan both the key and      
      +      95                 :      * the value of variables                                                      
      +      96                 :      *                                                                             
      +      97                 :      * @var boolean                                                                
      +      98                 :      */                                                                            
      +      99                 :     public $scanKeys = false;                                                      
      +     100                 :                                                                                    
      +     101                 :     /**                                                                            
      +     102                 :      * Exception container                                                         
      +     103                 :      *                                                                             
      +     104                 :      * Using this array it is possible to define variables that must not be        
      +     105                 :      * scanned. Per default, utmz google analytics parameters are permitted.       
      +     106                 :      *                                                                             
      +     107                 :      * @var array                                                                  
      +     108                 :      */                                                                            
      +     109                 :     private $exceptions = array();                                                 
      +     110                 :                                                                                    
      +     111                 :     /**                                                                            
      +     112                 :      * Html container                                                              
      +     113                 :      *                                                                             
      +     114                 :      * Using this array it is possible to define variables that legally            
      +     115                 :      * contain html and have to be prepared before hitting the rules to            
      +     116                 :      * avoid too many false alerts                                                 
      +     117                 :      *                                                                             
      +     118                 :      * @var array                                                                  
      +     119                 :      */                                                                            
      +     120                 :     private $html = array();                                                       
      +     121                 :                                                                                    
      +     122                 :     /**                                                                            
      +     123                 :      * JSON container                                                              
      +     124                 :      *                                                                             
      +     125                 :      * Using this array it is possible to define variables that contain            
      +     126                 :      * JSON data - and should be treated as such                                   
      +     127                 :      *                                                                             
      +     128                 :      * @var array                                                                  
      +     129                 :      */                                                                            
      +     130                 :     private $json = array();                                                       
      +     131                 :                                                                                    
      +     132                 :     /**                                                                            
      +     133                 :      * Holds HTMLPurifier object                                                   
      +     134                 :      *                                                                             
      +     135                 :      * @var object                                                                 
      +     136                 :      */                                                                            
      +     137                 :     private $htmlpurifier = NULL;                                                  
      +     138                 :                                                                                    
      +     139                 :     /**                                                                            
      +     140                 :      * Path to HTMLPurifier source                                                 
      +     141                 :      *                                                                             
      +     142                 :      * This path might be changed in case one wishes to make use of a              
      +     143                 :      * different HTMLPurifier source file e.g. if already used in the              
      +     144                 :      * application PHPIDS is protecting                                            
      +     145                 :      *                                                                             
      +     146                 :      * @var string                                                                 
      +     147                 :      */                                                                            
      +     148                 :     private $pathToHTMLPurifier = '';                                              
      +     149                 :                                                                                    
      +     150                 :     /**                                                                            
      +     151                 :      * HTMLPurifier cache directory                                                
      +     152                 :      *                                                                             
      +     153                 :      * @var string                                                                 
      +     154                 :      */                                                                            
      +     155                 :     private $HTMLPurifierCache = '';                                               
      +     156                 :                                                                                    
      +     157                 :     /**                                                                            
      +     158                 :      * This property holds the tmp JSON string from the                            
      +     159                 :      * _jsonDecodeValues() callback                                                
      +     160                 :      *                                                                             
      +     161                 :      * @var string                                                                 
      +     162                 :      */                                                                            
      +     163                 :     private $tmpJsonString = '';                                                   
      +     164                 :                                                                                    
      +     165                 :                                                                                    
      +     166                 :     /**                                                                            
      +     167                 :      * Constructor                                                                 
      +     168                 :      *                                                                             
      +     169                 :      * @param array  $request array to scan                                        
      +     170                 :      * @param object $init    instance of IDS_Init                                 
      +     171                 :      * @param array  $tags    list of tags to which filters should be applied      
      +     172                 :      *                                                                             
      +     173                 :      * @return void                                                                
      +     174                 :      */                                                                            
      +     175                 :     public function __construct(array $request, IDS_Init $init, array $tags = null)
      +     176                 :     {                                                                              
      +     177              41 :         $version = isset($init->config['General']['min_php_version'])              
      +     178              41 :             ? $init->config['General']['min_php_version'] : '5.1.6';               
      +     179                 :                                                                                    
      +     180              41 :         if (version_compare(PHP_VERSION, $version, '<')) {                         
      +     181               0 :             throw new Exception(                                                   
      +     182               0 :                 'PHP version has to be equal or higher than ' . $version . ' or    
      +     183                 :                 PHP version couldn\'t be determined'                               
      +     184               0 :             );                                                                     
      +     185                 :         }                                                                          
      +     186                 :                                                                                    
      +     187                 :                                                                                    
      +     188              41 :         if (!empty($request)) {                                                    
      +     189              41 :             $this->storage = new IDS_Filter_Storage($init);                        
      +     190              41 :             $this->request = $request;                                             
      +     191              41 :             $this->tags    = $tags;                                                
      +     192                 :                                                                                    
      +     193              41 :             $this->scanKeys   = $init->config['General']['scan_keys'];             
      +     194                 :                                                                                    
      +     195              41 :             $this->exceptions = isset($init->config['General']['exceptions'])      
      +     196              41 :                 ? $init->config['General']['exceptions'] : false;                  
      +     197                 :                                                                                    
      +     198              41 :             $this->html       = isset($init->config['General']['html'])            
      +     199              41 :                 ? $init->config['General']['html'] : false;                        
      +     200                 :                                                                                    
      +     201              41 :             $this->json       = isset($init->config['General']['json'])            
      +     202              41 :                 ? $init->config['General']['json'] : false;                        
      +     203                 :                                                                                    
      +     204              41 :             if(isset($init->config['General']['HTML_Purifier_Path'])               
      +     205              41 :                 && isset($init->config['General']['HTML_Purifier_Cache'])) {       
      +     206              41 :                 $this->pathToHTMLPurifier =                                        
      +     207              41 :                     $init->config['General']['HTML_Purifier_Path'];                
      +     208              41 :                 $this->HTMLPurifierCache  =                                        
      +     209              41 :                     $init->config['General']['HTML_Purifier_Cache'];               
      +     210              41 :             }                                                                      
      +     211                 :                                                                                    
      +     212              41 :         }                                                                          
      +     213                 :                                                                                    
      +     214              41 :         if (!is_writeable($init->getBasePath()                                     
      +     215              41 :             . $init->config['General']['tmp_path'])) {                             
      +     216               0 :             throw new Exception(                                                   
      +     217                 :                 'Please make sure the ' .                                          
      +     218               0 :                 htmlspecialchars($init->getBasePath() .                            
      +     219               0 :                 $init->config['General']['tmp_path'], ENT_QUOTES, 'UTF-8') .       
      +     220                 :                 ' folder is writable'                                              
      +     221               0 :             );                                                                     
      +     222                 :         }                                                                          
      +     223                 :                                                                                    
      +     224              41 :         include_once 'IDS/Report.php';                                             
      +     225              41 :         $this->report = new IDS_Report;                                            
      +     226              41 :     }                                                                              
      +     227                 :                                                                                    
      +     228                 :     /**                                                                            
      +     229                 :      * Starts the scan mechanism                                                   
      +     230                 :      *                                                                             
      +     231                 :      * @return object IDS_Report                                                   
      +     232                 :      */                                                                            
      +     233                 :     public function run()                                                          
      +     234                 :     {                                                                              
      +     235              36 :         if (!empty($this->request)) {                                              
      +     236              36 :             foreach ($this->request as $key => $value) {                           
      +     237              36 :                 $this->_iterate($key, $value);                                     
      +     238              36 :             }                                                                      
      +     239              36 :         }                                                                          
      +     240                 :                                                                                    
      +     241              36 :         return $this->getReport();                                                 
      +     242                 :     }                                                                              
      +     243                 :                                                                                    
      +     244                 :     /**                                                                            
      +     245                 :      * Iterates through given data and delegates it to IDS_Monitor::_detect() in   
      +     246                 :      * order to check for malicious appearing fragments                            
      +     247                 :      *                                                                             
      +     248                 :      * @param mixed $key   the former array key                                    
      +     249                 :      * @param mixed $value the former array value                                  
      +     250                 :      *                                                                             
      +     251                 :      * @return void                                                                
      +     252                 :      */                                                                            
      +     253                 :     private function _iterate($key, $value)                                        
      +     254                 :     {                                                                              
      +     255                 :                                                                                    
      +     256              36 :         if (!is_array($value)) {                                                   
      +     257              36 :             if (is_string($value)) {                                               
      +     258                 :                                                                                    
      +     259              36 :                 if ($filter = $this->_detect($key, $value)) {                      
      +     260              33 :                     include_once 'IDS/Event.php';                                  
      +     261              33 :                     $this->report->addEvent(                                       
      +     262              33 :                         new IDS_Event(                                             
      +     263              33 :                             $key,                                                  
      +     264              33 :                             $value,                                                
      +     265                 :                             $filter                                                
      +     266              33 :                         )                                                          
      +     267              33 :                     );                                                             
      +     268              33 :                 }                                                                  
      +     269              36 :             }                                                                      
      +     270              36 :         } else {                                                                   
      +     271               2 :             foreach ($value as $subKey => $subValue) {                             
      +     272               2 :                 $this->_iterate($key . '.' . $subKey, $subValue);                  
      +     273               2 :             }                                                                      
      +     274                 :         }                                                                          
      +     275              36 :     }                                                                              
      +     276                 :                                                                                    
      +     277                 :     /**                                                                            
      +     278                 :      * Checks whether given value matches any of the supplied filter patterns      
      +     279                 :      *                                                                             
      +     280                 :      * @param mixed $key   the key of the value to scan                            
      +     281                 :      * @param mixed $value the value to scan                                       
      +     282                 :      *                                                                             
      +     283                 :      * @return bool|array false or array of filter(s) that matched the value       
      +     284                 :      */                                                                            
      +     285                 :     private function _detect($key, $value)                                         
      +     286                 :     {                                                                              
      +     287                 :                                                                                    
      +     288                 :         // to increase performance, only start detection if value                  
      +     289                 :         // isn't alphanumeric                                                      
      +     290              36 :         if (!$value || !preg_match('/[^\w\s\/@!?,]+/', $value)) {                  
      +     291               1 :             return false;                                                          
      +     292                 :         }                                                                          
      +     293                 :                                                                                    
      +     294                 :         // check if this field is part of the exceptions                           
      +     295              35 :         if (is_array($this->exceptions)                                            
      +     296              35 :             && in_array($key, $this->exceptions, true)) {                          
      +     297               1 :             return false;                                                          
      +     298                 :         }                                                                          
      +     299                 :                                                                                    
      +     300                 :         // check for magic quotes and remove them if necessary                     
      +     301              35 :         if (function_exists('get_magic_quotes_gpc')                                
      +     302              35 :             && get_magic_quotes_gpc()) {                                           
      +     303              35 :             $value = stripslashes($value);                                         
      +     304              35 :         }                                                                          
      +     305                 :                                                                                    
      +     306                 :         // if html monitoring is enabled for this field - then do it!              
      +     307              35 :         if (is_array($this->html) && in_array($key, $this->html, true)) {          
      +     308               2 :             list($key, $value) = $this->_purifyValues($key, $value);               
      +     309               2 :         }                                                                          
      +     310                 :                                                                                    
      +     311                 :         // check if json monitoring is enabled for this field                      
      +     312              35 :         if (is_array($this->json) && in_array($key, $this->json, true)) {          
      +     313               1 :             list($key, $value) = $this->_jsonDecodeValues($key, $value);           
      +     314               1 :         }                                                                          
      +     315                 :                                                                                    
      +     316                 :         // use the converter                                                       
      +     317              35 :         include_once 'IDS/Converter.php';                                          
      +     318              35 :         $value = IDS_Converter::runAll($value);                                    
      +     319              35 :         $value = IDS_Converter::runCentrifuge($value, $this);                      
      +     320                 :                                                                                    
      +     321                 :         // scan keys if activated via config                                       
      +     322              35 :         $key = $this->scanKeys ? IDS_Converter::runAll($key)                       
      +     323              35 :             : $key;                                                                
      +     324              35 :         $key = $this->scanKeys ? IDS_Converter::runCentrifuge($key, $this)         
      +     325              35 :             : $key;                                                                
      +     326                 :                                                                                    
      +     327              35 :         $filters   = array();                                                      
      +     328              35 :         $filterSet = $this->storage->getFilterSet();                               
      +     329              35 :         foreach ($filterSet as $filter) {                                          
      +     330                 :                                                                                    
      +     331                 :             /*                                                                     
      +     332                 :              * in case we have a tag array specified the IDS will only             
      +     333                 :              * use those filters that are meant to detect any of the               
      +     334                 :              * defined tags                                                        
      +     335                 :              */                                                                    
      +     336              35 :             if (is_array($this->tags)) {                                           
      +     337               1 :                 if (array_intersect($this->tags, $filter->getTags())) {            
      +     338               1 :                     if ($this->_match($key, $value, $filter)) {                    
      +     339               1 :                         $filters[] = $filter;                                      
      +     340               1 :                     }                                                              
      +     341               1 :                 }                                                                  
      +     342               1 :             } else {                                                               
      +     343              34 :                 if ($this->_match($key, $value, $filter)) {                        
      +     344              32 :                     $filters[] = $filter;                                          
      +     345              32 :                 }                                                                  
      +     346                 :             }                                                                      
      +     347              35 :         }                                                                          
      +     348                 :                                                                                    
      +     349              35 :         return empty($filters) ? false : $filters;                                 
      +     350                 :     }                                                                              
      +     351                 :                                                                                    
      +     352                 :                                                                                    
      +     353                 :     /**                                                                            
      +     354                 :      * Purifies given key and value variables using HTMLPurifier                   
      +     355                 :      *                                                                             
      +     356                 :      * This function is needed whenever there is variables for which HTML          
      +     357                 :      * might be allowed like e.g. WYSIWYG post bodies. It will dectect malicious   
      +     358                 :      * code fragments and leaves harmless parts untouched.                         
      +     359                 :      *                                                                             
      +     360                 :      * @param  mixed $key                                                          
      +     361                 :      * @param  mixed $value                                                        
      +     362                 :      * @since  0.5                                                                 
      +     363                 :      *                                                                             
      +     364                 :      * @return array                                                               
      +     365                 :      */                                                                            
      +     366                 :     private function _purifyValues($key, $value) {                                 
      +     367                 :                                                                                    
      +     368               2 :         include_once $this->pathToHTMLPurifier;                                    
      +     369                 :                                                                                    
      +     370               2 :         if (!is_writeable($this->HTMLPurifierCache)) {                             
      +     371               0 :             throw new Exception(                                                   
      +     372               0 :                 $this->HTMLPurifierCache . ' must be writeable');                  
      +     373                 :         }                                                                          
      +     374                 :                                                                                    
      +     375               2 :         if (class_exists('HTMLPurifier')) {                                        
      +     376               2 :             $config = HTMLPurifier_Config::createDefault();                        
      +     377               2 :             $config->set('Attr', 'EnableID', true);                                
      +     378               2 :             $config->set('Cache', 'SerializerPath', $this->HTMLPurifierCache);     
      +     379               2 :             $config->set('Output', 'Newline', "\n");                               
      +     380               2 :             $this->htmlpurifier = new HTMLPurifier($config);                       
      +     381               2 :         } else {                                                                   
      +     382               0 :             throw new Exception(                                                   
      +     383                 :                 'HTMLPurifier class could not be found - ' .                       
      +     384               0 :                 'make sure the purifier files are valid and' .                     
      +     385                 :                 ' the path is correct'                                             
      +     386               0 :             );                                                                     
      +     387                 :         }                                                                          
      +     388                 :                                                                                    
      +     389               2 :         $purified_value = $this->htmlpurifier->purify($value);                     
      +     390               2 :         $purified_key   = $this->htmlpurifier->purify($key);                       
      +     391                 :                                                                                    
      +     392               2 :         $redux_value = strip_tags($value);                                         
      +     393               2 :         $redux_key   = strip_tags($key);                                           
      +     394                 :                                                                                    
      +     395               2 :         if ($value != $purified_value || $redux_value) {                           
      +     396               2 :             $value = $this->_diff($value, $purified_value, $redux_value);          
      +     397               2 :         } else {                                                                   
      +     398               0 :             $value = NULL;                                                         
      +     399                 :         }                                                                          
      +     400               2 :         if ($key != $purified_key) {                                               
      +     401               0 :             $key = $this->_diff($key, $purified_key, $redux_key);                  
      +     402               0 :         } else {                                                                   
      +     403               2 :             $key = NULL;                                                           
      +     404                 :         }                                                                          
      +     405                 :                                                                                    
      +     406               2 :         return array($key, $value);                                                
      +     407                 :     }                                                                              
      +     408                 :                                                                                    
      +     409                 :     /**                                                                            
      +     410                 :      * This method calculates the difference between the original                  
      +     411                 :      * and the purified markup strings.                                            
      +     412                 :      *                                                                             
      +     413                 :      * @param string $original the original markup                                 
      +     414                 :      * @param string $purified the purified markup                                 
      +     415                 :      * @param string $redux    the string without html                             
      +     416                 :      * @since 0.5                                                                  
      +     417                 :      *                                                                             
      +     418                 :      * @return string the difference between the strings                           
      +     419                 :      */                                                                            
      +     420                 :     private function _diff($original, $purified, $redux)                           
      +     421                 :     {                                                                              
      +     422                 :         /*                                                                         
      +     423                 :          * deal with over-sensitive alt-attribute addition of the purifier         
      +     424                 :          * and other common html formatting problems                               
      +     425                 :          */                                                                        
      +     426               2 :         $purified = preg_replace('/\s+alt="[^"]*"/m', null, $purified);            
      +     427               2 :         $purified = preg_replace('/=?\s*"\s*"/m', null, $purified);                
      +     428                 :                                                                                    
      +     429               2 :         $original = preg_replace('/=?\s*"\s*"/m', null, $original);                
      +     430               2 :         $original = preg_replace('/\s+alt=?/m', null, $original);                  
      +     431                 :                                                                                    
      +     432                 :         // check which string is longer                                            
      +     433               2 :         $length = (strlen($original) - strlen($purified));                         
      +     434                 :         /*                                                                         
      +     435                 :          * Calculate the difference between the original html input                
      +     436                 :          * and the purified string.                                                
      +     437                 :          */                                                                        
      +     438               2 :         if ($length > 0) {                                                         
      +     439               2 :             $array_2 = str_split($original);                                       
      +     440               2 :             $array_1 = str_split($purified);                                       
      +     441               2 :         } else {                                                                   
      +     442               2 :             $array_1 = str_split($original);                                       
      +     443               2 :             $array_2 = str_split($purified);                                       
      +     444                 :         }                                                                          
      +     445               2 :         foreach ($array_2 as $key => $value) {                                     
      +     446               2 :             if ($value !== $array_1[$key]) {                                       
      +     447               2 :                 $array_1   = array_reverse($array_1);                              
      +     448               2 :                 $array_1[] = $value;                                               
      +     449               2 :                 $array_1   = array_reverse($array_1);                              
      +     450               2 :             }                                                                      
      +     451               2 :         }                                                                          
      +     452                 :                                                                                    
      +     453                 :         // return the diff - ready to hit the converter and the rules              
      +     454               2 :         $diff = trim(join('', array_reverse(                                       
      +     455               2 :             (array_slice($array_1, 0, $length)))));                                
      +     456                 :                                                                                    
      +     457                 :         // clean up spaces between tag delimiters                                  
      +     458               2 :         $diff = preg_replace('/>\s*</m', '><', $diff);                             
      +     459                 :                                                                                    
      +     460                 :         // correct over-sensitively stripped bad html elements                     
      +     461               2 :         $diff = preg_replace('/[^<](iframe|script|embed|object' .                  
      +     462               2 :             '|applet|base|img|style)/m', '<$1', $diff);                            
      +     463                 :                                                                                    
      +     464               2 :         if ($original == $purified && !$redux) {                                   
      +     465               1 :             return null;                                                           
      +     466                 :         }                                                                          
      +     467                 :                                                                                    
      +     468               2 :         return $diff . $redux;                                                     
      +     469                 :     }                                                                              
      +     470                 :                                                                                    
      +     471                 :     /**                                                                            
      +     472                 :      * This method prepares incoming JSON data for the PHPIDS detection            
      +     473                 :      * process. It utilizes _jsonConcatContents() as callback and returns a        
      +     474                 :      * string version of the JSON data structures.                                 
      +     475                 :      *                                                                             
      +     476                 :      * @param  mixed $key                                                          
      +     477                 :      * @param  mixed $value                                                        
      +     478                 :      * @since  0.5.3                                                               
      +     479                 :      *                                                                             
      +     480                 :      * @return array                                                               
      +     481                 :      */                                                                            
      +     482                 :     private function _jsonDecodeValues($key, $value) {                             
      +     483                 :                                                                                    
      +     484               1 :         $tmp_key   = json_decode($key);                                            
      +     485               1 :         $tmp_value = json_decode($value);                                          
      +     486                 :                                                                                    
      +     487               1 :         if($tmp_value && is_array($tmp_value) || is_object($tmp_value)) {          
      +     488               1 :             array_walk_recursive($tmp_value, array($this, '_jsonConcatContents')); 
      +     489               1 :             $value = $this->tmpJsonString;                                         
      +     490               1 :         }                                                                          
      +     491                 :                                                                                    
      +     492               1 :         if($tmp_key && is_array($tmp_key) || is_object($tmp_key)) {                
      +     493               0 :             array_walk_recursive($tmp_key, array($this, '_jsonConcatContents'));   
      +     494               0 :             $key = $this->tmpJsonString;                                           
      +     495               0 :         }                                                                          
      +     496                 :                                                                                    
      +     497               1 :         return array($key, $value);                                                
      +     498                 :     }                                                                              
      +     499                 :                                                                                    
      +     500                 :     /**                                                                            
      +     501                 :      * This is the callback used in _jsonDecodeValues(). The method                
      +     502                 :      * concatenates key and value and stores them in $this->tmpJsonString.         
      +     503                 :      *                                                                             
      +     504                 :      * @param  mixed $key                                                          
      +     505                 :      * @param  mixed $value                                                        
      +     506                 :      * @since  0.5.3                                                               
      +     507                 :      *                                                                             
      +     508                 :      * @return void                                                                
      +     509                 :      */                                                                            
      +     510                 :     private function _jsonConcatContents($key, $value) {                           
      +     511                 :                                                                                    
      +     512               1 :         $this->tmpJsonString .=  $key . " " . $value . "\n";                       
      +     513               1 :     }                                                                              
      +     514                 :                                                                                    
      +     515                 :     /**                                                                            
      +     516                 :      * Matches given value and/or key against given filter                         
      +     517                 :      *                                                                             
      +     518                 :      * @param mixed  $key    the key to optionally scan                            
      +     519                 :      * @param mixed  $value  the value to scan                                     
      +     520                 :      * @param object $filter the filter object                                     
      +     521                 :      *                                                                             
      +     522                 :      * @return boolean                                                             
      +     523                 :      */                                                                            
      +     524                 :     private function _match($key, $value, $filter)                                 
      +     525                 :     {                                                                              
      +     526              35 :         if ($this->scanKeys) {                                                     
      +     527               1 :             if ($filter->match($key)) {                                            
      +     528               1 :                 return true;                                                       
      +     529                 :             }                                                                      
      +     530               1 :         }                                                                          
      +     531                 :                                                                                    
      +     532              35 :         if ($filter->match($value)) {                                              
      +     533              33 :             return true;                                                           
      +     534                 :         }                                                                          
      +     535                 :                                                                                    
      +     536              35 :         return false;                                                              
      +     537                 :     }                                                                              
      +     538                 :                                                                                    
      +     539                 :     /**                                                                            
      +     540                 :      * Sets exception array                                                        
      +     541                 :      *                                                                             
      +     542                 :      * @param mixed $exceptions the thrown exceptions                              
      +     543                 :      *                                                                             
      +     544                 :      * @return void                                                                
      +     545                 :      */                                                                            
      +     546                 :     public function setExceptions($exceptions)                                     
      +     547                 :     {                                                                              
      +     548               3 :         if (!is_array($exceptions)) {                                              
      +     549               2 :             $exceptions = array($exceptions);                                      
      +     550               2 :         }                                                                          
      +     551                 :                                                                                    
      +     552               3 :         $this->exceptions = $exceptions;                                           
      +     553               3 :     }                                                                              
      +     554                 :                                                                                    
      +     555                 :     /**                                                                            
      +     556                 :      * Returns exception array                                                     
      +     557                 :      *                                                                             
      +     558                 :      * @return array                                                               
      +     559                 :      */                                                                            
      +     560                 :     public function getExceptions()                                                
      +     561                 :     {                                                                              
      +     562               2 :         return $this->exceptions;                                                  
      +     563                 :     }                                                                              
      +     564                 :                                                                                    
      +     565                 :     /**                                                                            
      +     566                 :      * Sets html array                                                             
      +     567                 :      *                                                                             
      +     568                 :      * @param mixed $html the fields containing html                               
      +     569                 :      * @since 0.5                                                                  
      +     570                 :      *                                                                             
      +     571                 :      * @return void                                                                
      +     572                 :      */                                                                            
      +     573                 :     public function setHtml($html)                                                 
      +     574                 :     {                                                                              
      +     575               3 :         if (!is_array($html)) {                                                    
      +     576               1 :             $html = array($html);                                                  
      +     577               1 :         }                                                                          
      +     578                 :                                                                                    
      +     579               3 :         $this->html = $html;                                                       
      +     580               3 :     }                                                                              
      +     581                 :                                                                                    
      +     582                 :     /**                                                                            
      +     583                 :      * Adds a value to the html array                                              
      +     584                 :      *                                                                             
      +     585                 :      * @since 0.5                                                                  
      +     586                 :      *                                                                             
      +     587                 :      * @return void                                                                
      +     588                 :      */                                                                            
      +     589                 :     public function addHtml($value)                                                
      +     590                 :     {                                                                              
      +     591               0 :         $this->html[] = $value;                                                    
      +     592               0 :     }                                                                              
      +     593                 :                                                                                    
      +     594                 :     /**                                                                            
      +     595                 :      * Returns html array                                                          
      +     596                 :      *                                                                             
      +     597                 :      * @since 0.5                                                                  
      +     598                 :      *                                                                             
      +     599                 :      * @return array the fields that contain allowed html                          
      +     600                 :      */                                                                            
      +     601                 :     public function getHtml()                                                      
      +     602                 :     {                                                                              
      +     603               1 :         return $this->html;                                                        
      +     604                 :     }                                                                              
      +     605                 :                                                                                    
      +     606                 :     /**                                                                            
      +     607                 :      * Sets json array                                                             
      +     608                 :      *                                                                             
      +     609                 :      * @param mixed $json the fields containing json                               
      +     610                 :      * @since 0.5.3                                                                
      +     611                 :      *                                                                             
      +     612                 :      * @return void                                                                
      +     613                 :      */                                                                            
      +     614                 :     public function setJson($json)                                                 
      +     615                 :     {                                                                              
      +     616               1 :         if (!is_array($json)) {                                                    
      +     617               0 :             $json = array($json);                                                  
      +     618               0 :         }                                                                          
      +     619                 :                                                                                    
      +     620               1 :         $this->json = $json;                                                       
      +     621               1 :     }                                                                              
      +     622                 :                                                                                    
      +     623                 :     /**                                                                            
      +     624                 :      * Adds a value to the json array                                              
      +     625                 :      *                                                                             
      +     626                 :      * @since 0.5.3                                                                
      +     627                 :      *                                                                             
      +     628                 :      * @return void                                                                
      +     629                 :      */                                                                            
      +     630                 :     public function addJson($value)                                                
      +     631                 :     {                                                                              
      +     632               0 :         $this->json[] = $value;                                                    
      +     633               0 :     }                                                                              
      +     634                 :                                                                                    
      +     635                 :     /**                                                                            
      +     636                 :      * Returns json array                                                          
      +     637                 :      *                                                                             
      +     638                 :      * @since 0.5.3                                                                
      +     639                 :      *                                                                             
      +     640                 :      * @return array the fields that contain json                                  
      +     641                 :      */                                                                            
      +     642                 :     public function getJson()                                                      
      +     643                 :     {                                                                              
      +     644               0 :         return $this->json;                                                        
      +     645                 :     }                                                                              
      +     646                 :                                                                                    
      +     647                 :     /**                                                                            
      +     648                 :      * Returns storage container                                                   
      +     649                 :      *                                                                             
      +     650                 :      * @return array                                                               
      +     651                 :      */                                                                            
      +     652                 :     public function getStorage()                                                   
      +     653                 :     {                                                                              
      +     654               1 :         return $this->storage;                                                     
      +     655                 :     }                                                                              
      +     656                 :                                                                                    
      +     657                 :     /**                                                                            
      +     658                 :      * Returns report object providing various functions to work with              
      +     659                 :      * detected results. Also the centrifuge data is being set as property         
      +     660                 :      * of the report object.                                                       
      +     661                 :      *                                                                             
      +     662                 :      * @return object IDS_Report                                                   
      +     663                 :      */                                                                            
      +     664                 :     public function getReport()                                                    
      +     665                 :     {                                                                              
      +     666              36 :         if (isset($this->centrifuge) && $this->centrifuge) {                       
      +     667              18 :             $this->report->setCentrifuge($this->centrifuge);                       
      +     668              18 :         }                                                                          
      +     669                 :                                                                                    
      +     670              36 :         return $this->report;                                                      
      +     671                 :     }                                                                              
      +     672                 :                                                                                    
      +     673                 : }                                                                                  
      +     674                 :                                                                                    
      +     675                 : /*                                                                                 
      +     676                 :  * Local variables:                                                                
      +     677                 :  * tab-width: 4                                                                    
      +     678                 :  * c-basic-offset: 4                                                               
      +     679                 :  * End:                                                                            
      +     680                 :  */                                                                                
      +
      +
      +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/Report.php.html b/dvwa/external/phpids/0.6/tests/coverage/Report.php.html new file mode 100644 index 0000000..8959318 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/Report.php.html @@ -0,0 +1,1150 @@ + + + + + + PHPIDS + + + + + + + + + + + + + + + + + + +
      PHPIDS
      + + + + + + + + + +
      Current file:/home/lstrojny/Projekte/php-ids/trunk/lib/IDS/Report.php
      Legend: + executed + not executed + dead code +
      +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       Coverage
       ClassesMethodsLines
      Total + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%13 / 13 + + + + +
      86.08 %86.08%
      +
      86.08%68 / 79
       
      IDS_Report + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%13 / 13 + + + + +
      86.08 %86.08%
      +
      86.08%68 / 79
       public function __construct(array $events = NULL) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%6 / 6
       public function addEvent(IDS_Event $event) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%3 / 3
       public function getEvent($name) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%6 / 6
       public function getTags() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%9 / 9
       public function getImpact() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%7 / 7
       public function hasEvent($name) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%3 / 3
       public function count() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function getIterator() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       public function isEmpty() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1
       protected function clear() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%3 / 3
       public function getCentrifuge() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      100.00 %100.00%
      +
      100.00%2 / 2
       public function setCentrifuge($centrifuge = array ( +)) + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      75.00 %75.00%
      +
      75.00%3 / 4
       public function __toString() + + + + +
      100.00 %100.00%
      +
      100.00%1 / 1 + + + + +
      69.70 %69.70%
      +
      69.70%23 / 33
      +
      + +
      + + + + + + + + +

      +
      +       1                 : <?php                                                                             
      +       2                 :                                                                                   
      +       3                 : /**                                                                               
      +       4                 :  * PHPIDS                                                                         
      +       5                 :  *                                                                                
      +       6                 :  * Requirements: PHP5, SimpleXML                                                  
      +       7                 :  *                                                                                
      +       8                 :  * Copyright (c) 2008 PHPIDS group (http://php-ids.org)                           
      +       9                 :  *                                                                                
      +      10                 :  * PHPIDS is free software; you can redistribute it and/or modify                 
      +      11                 :  * it under the terms of the GNU Lesser General Public License as published by    
      +      12                 :  * the Free Software Foundation, version 3 of the License, or                     
      +      13                 :  * (at your option) any later version.                                            
      +      14                 :  *                                                                                
      +      15                 :  * PHPIDS is distributed in the hope that it will be useful,                      
      +      16                 :  * but WITHOUT ANY WARRANTY; without even the implied warranty of                 
      +      17                 :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                   
      +      18                 :  * GNU Lesser General Public License for more details.                            
      +      19                 :  *                                                                                
      +      20                 :  * You should have received a copy of the GNU Lesser General Public License       
      +      21                 :  * along with PHPIDS. If not, see <http://www.gnu.org/licenses/>.                 
      +      22                 :  *                                                                                
      +      23                 :  * PHP version 5.1.6+                                                             
      +      24                 :  *                                                                                
      +      25                 :  * @category Security                                                             
      +      26                 :  * @package  PHPIDS                                                               
      +      27                 :  * @author   Mario Heiderich <mario.heiderich@gmail.com>                          
      +      28                 :  * @author   Christian Matthies <ch0012@gmail.com>                                
      +      29                 :  * @author   Lars Strojny <lars@strojny.net>                                      
      +      30                 :  * @license  http://www.gnu.org/licenses/lgpl.html LGPL                           
      +      31                 :  * @link     http://php-ids.org/                                                  
      +      32                 :  */                                                                               
      +      33                 :                                                                                   
      +      34                 : /**                                                                               
      +      35                 :  * PHPIDS report object                                                           
      +      36                 :  *                                                                                
      +      37                 :  * The report objects collects a number of events and thereby presents the        
      +      38                 :  * detected results. It provides a convenient API to work with the results.       
      +      39                 :  *                                                                                
      +      40                 :  * Note that this class implements Countable, IteratorAggregate and               
      +      41                 :  * a __toString() method                                                          
      +      42                 :  *                                                                                
      +      43                 :  * @category  Security                                                            
      +      44                 :  * @package   PHPIDS                                                              
      +      45                 :  * @author    Christian Matthies <ch0012@gmail.com>                               
      +      46                 :  * @author    Mario Heiderich <mario.heiderich@gmail.com>                         
      +      47                 :  * @author    Lars Strojny <lars@strojny.net>                                     
      +      48                 :  * @copyright 2007 The PHPIDS Group                                               
      +      49                 :  * @license   http://www.gnu.org/licenses/lgpl.html LGPL                          
      +      50                 :  * @version   Release: $Id:Report.php 517 2007-09-15 15:04:13Z mario $            
      +      51                 :  * @link      http://php-ids.org/                                                 
      +      52                 :  */                                                                               
      +      53                 : class IDS_Report implements Countable, IteratorAggregate                          
      +      54                 : {                                                                                 
      +      55                 :                                                                                   
      +      56                 :     /**                                                                           
      +      57                 :      * Event container                                                            
      +      58                 :      *                                                                            
      +      59                 :      * @var array                                                                 
      +      60                 :      */                                                                           
      +      61                 :     protected $events = array();                                                  
      +      62                 :                                                                                   
      +      63                 :     /**                                                                           
      +      64                 :      * List of affected tags                                                      
      +      65                 :      *                                                                            
      +      66                 :      * This list of tags is collected from the collected event objects on         
      +      67                 :      * demand when IDS_Report->getTags() is called                                
      +      68                 :      *                                                                            
      +      69                 :      * @var    array                                                              
      +      70                 :      */                                                                           
      +      71                 :     protected $tags = array();                                                    
      +      72                 :                                                                                   
      +      73                 :     /**                                                                           
      +      74                 :      * Impact level                                                               
      +      75                 :      *                                                                            
      +      76                 :      * The impact level is calculated on demand by adding the results of the      
      +      77                 :      * event objects on IDS_Report->getImpact()                                   
      +      78                 :      *                                                                            
      +      79                 :      * @var integer                                                               
      +      80                 :      */                                                                           
      +      81                 :     protected $impact = 0;                                                        
      +      82                 :                                                                                   
      +      83                 :     /**                                                                           
      +      84                 :      * Centrifuge data                                                            
      +      85                 :      *                                                                            
      +      86                 :      * This variable - initiated as an empty array - carries all information      
      +      87                 :      * about the centrifuge data if available                                     
      +      88                 :      *                                                                            
      +      89                 :      * @var array                                                                 
      +      90                 :      */                                                                           
      +      91                 :     protected $centrifuge = array();                                              
      +      92                 :                                                                                   
      +      93                 :     /**                                                                           
      +      94                 :      * Constructor                                                                
      +      95                 :      *                                                                            
      +      96                 :      * @param array $events the events the report should include                  
      +      97                 :      *                                                                            
      +      98                 :      * @return void                                                               
      +      99                 :      */                                                                           
      +     100                 :     public function __construct(array $events = null)                             
      +     101                 :     {                                                                             
      +     102              59 :         if ($events) {                                                            
      +     103              19 :             foreach ($events as $event) {                                         
      +     104              19 :                 $this->addEvent($event);                                          
      +     105              19 :             }                                                                     
      +     106              19 :         }                                                                         
      +     107              59 :     }                                                                             
      +     108                 :                                                                                   
      +     109                 :     /**                                                                           
      +     110                 :      * Adds an IDS_Event object to the report                                     
      +     111                 :      *                                                                            
      +     112                 :      * @param object $event IDS_Event                                             
      +     113                 :      *                                                                            
      +     114                 :      * @return object $this                                                       
      +     115                 :      */                                                                           
      +     116                 :     public function addEvent(IDS_Event $event)                                    
      +     117                 :     {                                                                             
      +     118              52 :         $this->clear();                                                           
      +     119              52 :         $this->events[$event->getName()] = $event;                                
      +     120                 :                                                                                   
      +     121              52 :         return $this;                                                             
      +     122                 :     }                                                                             
      +     123                 :                                                                                   
      +     124                 :     /**                                                                           
      +     125                 :      * Get event by name                                                          
      +     126                 :      *                                                                            
      +     127                 :      * In most cases an event is identified by the key of the variable that       
      +     128                 :      * contained maliciously appearing content                                    
      +     129                 :      *                                                                            
      +     130                 :      * @param scalar $name the event name                                         
      +     131                 :      *                                                                            
      +     132                 :      * @throws InvalidArgumentException if argument is invalid                    
      +     133                 :      * @return mixed IDS_Event object or false if the event does not exist        
      +     134                 :      */                                                                           
      +     135                 :     public function getEvent($name)                                               
      +     136                 :     {                                                                             
      +     137               5 :         if (!is_scalar($name)) {                                                  
      +     138               1 :             throw new InvalidArgumentException(                                   
      +     139                 :                 'Invalid argument type given'                                     
      +     140               1 :             );                                                                    
      +     141                 :         }                                                                         
      +     142                 :                                                                                   
      +     143               4 :         if ($this->hasEvent($name)) {                                             
      +     144               3 :             return $this->events[$name];                                          
      +     145                 :         }                                                                         
      +     146                 :                                                                                   
      +     147               1 :         return false;                                                             
      +     148                 :     }                                                                             
      +     149                 :                                                                                   
      +     150                 :     /**                                                                           
      +     151                 :      * Returns list of affected tags                                              
      +     152                 :      *                                                                            
      +     153                 :      * @return array                                                              
      +     154                 :      */                                                                           
      +     155                 :     public function getTags()                                                     
      +     156                 :     {                                                                             
      +     157               3 :         if (!$this->tags) {                                                       
      +     158               3 :             $this->tags = array();                                                
      +     159                 :                                                                                   
      +     160               3 :             foreach ($this->events as $event) {                                   
      +     161               3 :                 $this->tags = array_merge($this->tags,                            
      +     162               3 :                                           $event->getTags());                     
      +     163               3 :             }                                                                     
      +     164                 :                                                                                   
      +     165               3 :             $this->tags = array_values(array_unique($this->tags));                
      +     166               3 :         }                                                                         
      +     167                 :                                                                                   
      +     168               3 :         return $this->tags;                                                       
      +     169                 :     }                                                                             
      +     170                 :                                                                                   
      +     171                 :     /**                                                                           
      +     172                 :      * Returns total impact                                                       
      +     173                 :      *                                                                            
      +     174                 :      * Each stored IDS_Event object and its IDS_Filter sub-object are called      
      +     175                 :      * to calculate the overall impact level of this request                      
      +     176                 :      *                                                                            
      +     177                 :      * @return integer                                                            
      +     178                 :      */                                                                           
      +     179                 :     public function getImpact()                                                   
      +     180                 :     {                                                                             
      +     181              36 :         if (!$this->impact) {                                                     
      +     182              36 :             $this->impact = 0;                                                    
      +     183              36 :             foreach ($this->events as $event) {                                   
      +     184              34 :                 $this->impact += $event->getImpact();                             
      +     185              36 :             }                                                                     
      +     186              36 :         }                                                                         
      +     187                 :                                                                                   
      +     188              36 :         return $this->impact;                                                     
      +     189                 :     }                                                                             
      +     190                 :                                                                                   
      +     191                 :     /**                                                                           
      +     192                 :      * Checks if a specific event with given name exists                          
      +     193                 :      *                                                                            
      +     194                 :      * @param scalar $name the event name                                         
      +     195                 :      *                                                                            
      +     196                 :      * @throws InvalidArgumentException if argument is illegal                    
      +     197                 :      *                                                                            
      +     198                 :      * @return boolean                                                            
      +     199                 :      */                                                                           
      +     200                 :     public function hasEvent($name)                                               
      +     201                 :     {                                                                             
      +     202              11 :         if (!is_scalar($name)) {                                                  
      +     203               1 :             throw new InvalidArgumentException('Invalid argument given');         
      +     204                 :         }                                                                         
      +     205                 :                                                                                   
      +     206              10 :         return isset($this->events[$name]);                                       
      +     207                 :     }                                                                             
      +     208                 :                                                                                   
      +     209                 :     /**                                                                           
      +     210                 :      * Returns total amount of events                                             
      +     211                 :      *                                                                            
      +     212                 :      * @return integer                                                            
      +     213                 :      */                                                                           
      +     214                 :     public function count()                                                       
      +     215                 :     {                                                                             
      +     216               1 :         return count($this->events);                                              
      +     217                 :     }                                                                             
      +     218                 :                                                                                   
      +     219                 :      /**                                                                          
      +     220                 :      * Return iterator object                                                     
      +     221                 :      *                                                                            
      +     222                 :      * In order to provide the possibility to directly iterate over the           
      +     223                 :      * IDS_Event object the IteratorAggregate is implemented. One can easily      
      +     224                 :      * use foreach() to iterate through all stored IDS_Event objects.             
      +     225                 :      *                                                                            
      +     226                 :      * @return Iterator                                                           
      +     227                 :      */                                                                           
      +     228                 :     public function getIterator()                                                 
      +     229                 :     {                                                                             
      +     230               1 :         return new ArrayObject($this->events);                                    
      +     231                 :     }                                                                             
      +     232                 :                                                                                   
      +     233                 :     /**                                                                           
      +     234                 :      * Checks if any events are registered                                        
      +     235                 :      *                                                                            
      +     236                 :      * @return boolean                                                            
      +     237                 :      */                                                                           
      +     238                 :     public function isEmpty()                                                     
      +     239                 :     {                                                                             
      +     240               4 :         return empty($this->events);                                              
      +     241                 :     }                                                                             
      +     242                 :                                                                                   
      +     243                 :     /**                                                                           
      +     244                 :      * Clears calculated/collected values                                         
      +     245                 :      *                                                                            
      +     246                 :      * @return void                                                               
      +     247                 :      */                                                                           
      +     248                 :     protected function clear()                                                    
      +     249                 :     {                                                                             
      +     250              52 :         $this->impact = 0;                                                        
      +     251              52 :         $this->tags   = array();                                                  
      +     252              52 :     }                                                                             
      +     253                 :                                                                                   
      +     254                 :     /**                                                                           
      +     255                 :      * This method returns the centrifuge property or null if not                 
      +     256                 :      * filled with data                                                           
      +     257                 :      *                                                                            
      +     258                 :      * @return array/null                                                         
      +     259                 :      */                                                                           
      +     260                 :     public function getCentrifuge()                                               
      +     261                 :     {                                                                             
      +     262               1 :         return ($this->centrifuge && count($this->centrifuge) > 0)                
      +     263               1 :             ? $this->centrifuge : null;                                           
      +     264                 :     }                                                                             
      +     265                 :                                                                                   
      +     266                 :     /**                                                                           
      +     267                 :      * This method sets the centrifuge property                                   
      +     268                 :      *                                                                            
      +     269                 :      * @param array $centrifuge the centrifuge data                               
      +     270                 :      *                                                                            
      +     271                 :      * @throws InvalidArgumentException if argument is illegal                    
      +     272                 :      *                                                                            
      +     273                 :      * @return boolean true is arguments were valid                               
      +     274                 :      */                                                                           
      +     275                 :     public function setCentrifuge($centrifuge = array())                          
      +     276                 :     {                                                                             
      +     277              18 :         if (is_array($centrifuge) && $centrifuge) {                               
      +     278              18 :             $this->centrifuge = $centrifuge;                                      
      +     279              18 :             return true;                                                          
      +     280                 :         }                                                                         
      +     281               0 :         throw new InvalidArgumentException('Invalid argument given');             
      +     282                 :     }                                                                             
      +     283                 :                                                                                   
      +     284                 :     /**                                                                           
      +     285                 :      * Directly outputs all available information                                 
      +     286                 :      *                                                                            
      +     287                 :      * @return string                                                             
      +     288                 :      */                                                                           
      +     289                 :     public function __toString()                                                  
      +     290                 :     {                                                                             
      +     291               2 :         if (!$this->isEmpty()) {                                                  
      +     292               1 :             $output  = '';                                                        
      +     293               1 :             $output .= 'Total impact: ' . $this->getImpact() . "<br/>\n";         
      +     294               1 :             $output .= 'Affected tags: ' . join(', ', $this->getTags()) .         
      +     295               1 :                 "<br/>\n";                                                        
      +     296                 :                                                                                   
      +     297               1 :             foreach ($this->events as $event) {                                   
      +     298                 :                 $output .= "<br/>\nVariable: " .                                  
      +     299               1 :                     htmlspecialchars($event->getName()) . ' | Value: ' .          
      +     300               1 :                     htmlspecialchars($event->getValue()) . "<br/>\n";             
      +     301               1 :                 $output .= 'Impact: ' . $event->getImpact() . ' | Tags: ' .       
      +     302               1 :                     join(', ', $event->getTags()) . "<br/>\n";                    
      +     303                 :                                                                                   
      +     304               1 :                 foreach ($event as $filter) {                                     
      +     305               1 :                     $output .= 'Description: ' . $filter->getDescription() .      
      +     306               1 :                         ' | ';                                                    
      +     307               1 :                     $output .= 'Tags: ' . join(', ', $filter->getTags()) .        
      +     308               1 :                         ' | ';                                                    
      +     309               1 :                     $output .= 'ID: ' . $filter->getId() .                        
      +     310               1 :                         "<br/>\n";                                                
      +     311               1 :                 }                                                                 
      +     312               1 :             }                                                                     
      +     313                 :                                                                                   
      +     314               1 :             $output .= '<br/>';                                                   
      +     315                 :                                                                                   
      +     316               1 :             if ($centrifuge = $this->getCentrifuge()) {                           
      +     317               0 :                 $output .= 'Centrifuge detection data';                           
      +     318                 :                 $output .= '<br/>  Threshold: ' .                                 
      +     319               0 :                     ((isset($centrifuge['threshold'])&&$centrifuge['threshold']) ?
      +     320               0 :                     $centrifuge['threshold'] : '---');                            
      +     321                 :                 $output .= '<br/>  Ratio: ' .                                     
      +     322               0 :                     ((isset($centrifuge['ratio'])&&$centrifuge['ratio']) ?        
      +     323               0 :                     $centrifuge['ratio'] : '---');                                
      +     324               0 :                 if(isset($centrifuge['converted'])) {                             
      +     325               0 :                     $output .= '<br/>  Converted: ' . $centrifuge['converted'];   
      +     326               0 :                 }                                                                 
      +     327               0 :                 $output .= "<br/><br/>\n";                                        
      +     328               0 :             }                                                                     
      +     329               1 :         }                                                                         
      +     330                 :                                                                                   
      +     331               2 :         return isset($output) ? $output : '';                                     
      +     332                 :     }                                                                             
      +     333                 : }                                                                                 
      +     334                 :                                                                                   
      +     335                 : /*                                                                                
      +     336                 :  * Local variables:                                                               
      +     337                 :  * tab-width: 4                                                                   
      +     338                 :  * c-basic-offset: 4                                                              
      +     339                 :  * End:                                                                           
      +     340                 :  */                                                                               
      +
      +
      +
      + + + + +
      Generated by PHPUnit 3.3.1 and Xdebug 2.1.0-dev at Mon Dec 22 13:57:42 CET 2008.
      + +
      + + + + diff --git a/dvwa/external/phpids/0.6/tests/coverage/butter.png b/dvwa/external/phpids/0.6/tests/coverage/butter.png new file mode 100644 index 0000000000000000000000000000000000000000..3c7e36f2da2e0557f70191ceb58b58187fa46292 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#8Y?HeiPce~l`DWkvL&t&CC>S|xv6<249-QVi6yBi3gww4844j8sS56%z5(x3 pRP%rec|2VlLpZJ{|M+}Ko`F@8$+T(TnfpL-22WQ%mvv4FO#nkKCNls4 literal 0 HcmV?d00001 diff --git a/dvwa/external/phpids/0.6/tests/coverage/chameleon.png b/dvwa/external/phpids/0.6/tests/coverage/chameleon.png new file mode 100644 index 0000000000000000000000000000000000000000..68046070133a2c309839b9d340ced4c521fa9d3b GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#8Y?HesrbxqN9F*9WJ_ElN}Tg^b5rw57@Uhz6H8K46v{J8G895GQWe}ieFNU7 psOA9`@_4#9hHzX@eo>Xe#K1g@abe4bR%xI(gQu&X%Q~loCID3dC3gS- literal 0 HcmV?d00001 diff --git a/dvwa/external/phpids/0.6/tests/coverage/close12_1.gif b/dvwa/external/phpids/0.6/tests/coverage/close12_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..e2f67d72efc158da4e069822cbe338915761e396 GIT binary patch literal 85 zcmZ?wbhEHbz lf$Gy9znh?Y?^x%Bps9Cfw!UsJn!aoAS>7kV)`>G%0|4uCA&me4 literal 0 HcmV?d00001 diff --git a/dvwa/external/phpids/0.6/tests/coverage/container-min.js b/dvwa/external/phpids/0.6/tests/coverage/container-min.js new file mode 100644 index 0000000..e2acfd3 --- /dev/null +++ b/dvwa/external/phpids/0.6/tests/coverage/container-min.js @@ -0,0 +1,17 @@ +/* +Copyright (c) 2008, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 2.5.2 +*/ +(function(){YAHOO.util.Config=function(D){if(D){this.init(D);}};var B=YAHOO.lang,C=YAHOO.util.CustomEvent,A=YAHOO.util.Config;A.CONFIG_CHANGED_EVENT="configChanged";A.BOOLEAN_TYPE="boolean";A.prototype={owner:null,queueInProgress:false,config:null,initialConfig:null,eventQueue:null,configChangedEvent:null,init:function(D){this.owner=D;this.configChangedEvent=this.createEvent(A.CONFIG_CHANGED_EVENT);this.configChangedEvent.signature=C.LIST;this.queueInProgress=false;this.config={};this.initialConfig={};this.eventQueue=[];},checkBoolean:function(D){return(typeof D==A.BOOLEAN_TYPE);},checkNumber:function(D){return(!isNaN(D));},fireEvent:function(D,F){var E=this.config[D];if(E&&E.event){E.event.fire(F);}},addProperty:function(E,D){E=E.toLowerCase();this.config[E]=D;D.event=this.createEvent(E,{scope:this.owner});D.event.signature=C.LIST;D.key=E;if(D.handler){D.event.subscribe(D.handler,this.owner);}this.setProperty(E,D.value,true);if(!D.suppressEvent){this.queueProperty(E,D.value);}},getConfig:function(){var D={},F,E;for(F in this.config){E=this.config[F];if(E&&E.event){D[F]=E.value;}}return D;},getProperty:function(D){var E=this.config[D.toLowerCase()];if(E&&E.event){return E.value;}else{return undefined;}},resetProperty:function(D){D=D.toLowerCase();var E=this.config[D];if(E&&E.event){if(this.initialConfig[D]&&!B.isUndefined(this.initialConfig[D])){this.setProperty(D,this.initialConfig[D]);return true;}}else{return false;}},setProperty:function(E,G,D){var F;E=E.toLowerCase();if(this.queueInProgress&&!D){this.queueProperty(E,G);return true;}else{F=this.config[E];if(F&&F.event){if(F.validator&&!F.validator(G)){return false;}else{F.value=G;if(!D){this.fireEvent(E,G);this.configChangedEvent.fire([E,G]);}return true;}}else{return false;}}},queueProperty:function(S,P){S=S.toLowerCase();var R=this.config[S],K=false,J,G,H,I,O,Q,F,M,N,D,L,T,E;if(R&&R.event){if(!B.isUndefined(P)&&R.validator&&!R.validator(P)){return false;}else{if(!B.isUndefined(P)){R.value=P;}else{P=R.value;}K=false;J=this.eventQueue.length;for(L=0;L0){G=F-1;do{D=E.subscribers[G];if(D&&D.obj==I&&D.fn==H){return true;}}while(G--);}return false;};YAHOO.lang.augmentProto(A,YAHOO.util.EventProvider);}());(function(){YAHOO.widget.Module=function(Q,P){if(Q){this.init(Q,P);}else{}};var F=YAHOO.util.Dom,D=YAHOO.util.Config,M=YAHOO.util.Event,L=YAHOO.util.CustomEvent,G=YAHOO.widget.Module,H,O,N,E,A={"BEFORE_INIT":"beforeInit","INIT":"init","APPEND":"append","BEFORE_RENDER":"beforeRender","RENDER":"render","CHANGE_HEADER":"changeHeader","CHANGE_BODY":"changeBody","CHANGE_FOOTER":"changeFooter","CHANGE_CONTENT":"changeContent","DESTORY":"destroy","BEFORE_SHOW":"beforeShow","SHOW":"show","BEFORE_HIDE":"beforeHide","HIDE":"hide"},I={"VISIBLE":{key:"visible",value:true,validator:YAHOO.lang.isBoolean},"EFFECT":{key:"effect",suppressEvent:true,supercedes:["visible"]},"MONITOR_RESIZE":{key:"monitorresize",value:true},"APPEND_TO_DOCUMENT_BODY":{key:"appendtodocumentbody",value:false}};G.IMG_ROOT=null;G.IMG_ROOT_SSL=null;G.CSS_MODULE="yui-module";G.CSS_HEADER="hd";G.CSS_BODY="bd";G.CSS_FOOTER="ft";G.RESIZE_MONITOR_SECURE_URL="javascript:false;";G.textResizeEvent=new L("textResize");function K(){if(!H){H=document.createElement("div");H.innerHTML=('
      '+'
      ');O=H.firstChild;N=O.nextSibling;E=N.nextSibling;}return H;}function J(){if(!O){K();}return(O.cloneNode(false));}function B(){if(!N){K();}return(N.cloneNode(false));}function C(){if(!E){K();}return(E.cloneNode(false));}G.prototype={constructor:G,element:null,header:null,body:null,footer:null,id:null,imageRoot:G.IMG_ROOT,initEvents:function(){var P=L.LIST;this.beforeInitEvent=this.createEvent(A.BEFORE_INIT);this.beforeInitEvent.signature=P;this.initEvent=this.createEvent(A.INIT);this.initEvent.signature=P;this.appendEvent=this.createEvent(A.APPEND); +this.appendEvent.signature=P;this.beforeRenderEvent=this.createEvent(A.BEFORE_RENDER);this.beforeRenderEvent.signature=P;this.renderEvent=this.createEvent(A.RENDER);this.renderEvent.signature=P;this.changeHeaderEvent=this.createEvent(A.CHANGE_HEADER);this.changeHeaderEvent.signature=P;this.changeBodyEvent=this.createEvent(A.CHANGE_BODY);this.changeBodyEvent.signature=P;this.changeFooterEvent=this.createEvent(A.CHANGE_FOOTER);this.changeFooterEvent.signature=P;this.changeContentEvent=this.createEvent(A.CHANGE_CONTENT);this.changeContentEvent.signature=P;this.destroyEvent=this.createEvent(A.DESTORY);this.destroyEvent.signature=P;this.beforeShowEvent=this.createEvent(A.BEFORE_SHOW);this.beforeShowEvent.signature=P;this.showEvent=this.createEvent(A.SHOW);this.showEvent.signature=P;this.beforeHideEvent=this.createEvent(A.BEFORE_HIDE);this.beforeHideEvent.signature=P;this.hideEvent=this.createEvent(A.HIDE);this.hideEvent.signature=P;},platform:function(){var P=navigator.userAgent.toLowerCase();if(P.indexOf("windows")!=-1||P.indexOf("win32")!=-1){return"windows";}else{if(P.indexOf("macintosh")!=-1){return"mac";}else{return false;}}}(),browser:function(){var P=navigator.userAgent.toLowerCase();if(P.indexOf("opera")!=-1){return"opera";}else{if(P.indexOf("msie 7")!=-1){return"ie7";}else{if(P.indexOf("msie")!=-1){return"ie";}else{if(P.indexOf("safari")!=-1){return"safari";}else{if(P.indexOf("gecko")!=-1){return"gecko";}else{return false;}}}}}}(),isSecure:function(){if(window.location.href.toLowerCase().indexOf("https")===0){return true;}else{return false;}}(),initDefaultConfig:function(){this.cfg.addProperty(I.VISIBLE.key,{handler:this.configVisible,value:I.VISIBLE.value,validator:I.VISIBLE.validator});this.cfg.addProperty(I.EFFECT.key,{suppressEvent:I.EFFECT.suppressEvent,supercedes:I.EFFECT.supercedes});this.cfg.addProperty(I.MONITOR_RESIZE.key,{handler:this.configMonitorResize,value:I.MONITOR_RESIZE.value});this.cfg.addProperty(I.APPEND_TO_DOCUMENT_BODY.key,{value:I.APPEND_TO_DOCUMENT_BODY.value});},init:function(U,T){var R,V;this.initEvents();this.beforeInitEvent.fire(G);this.cfg=new D(this);if(this.isSecure){this.imageRoot=G.IMG_ROOT_SSL;}if(typeof U=="string"){R=U;U=document.getElementById(U);if(!U){U=(K()).cloneNode(false);U.id=R;}}this.element=U;if(U.id){this.id=U.id;}V=this.element.firstChild;if(V){var Q=false,P=false,S=false;do{if(1==V.nodeType){if(!Q&&F.hasClass(V,G.CSS_HEADER)){this.header=V;Q=true;}else{if(!P&&F.hasClass(V,G.CSS_BODY)){this.body=V;P=true;}else{if(!S&&F.hasClass(V,G.CSS_FOOTER)){this.footer=V;S=true;}}}}}while((V=V.nextSibling));}this.initDefaultConfig();F.addClass(this.element,G.CSS_MODULE);if(T){this.cfg.applyConfig(T,true);}if(!D.alreadySubscribed(this.renderEvent,this.cfg.fireQueue,this.cfg)){this.renderEvent.subscribe(this.cfg.fireQueue,this.cfg,true);}this.initEvent.fire(G);},initResizeMonitor:function(){var Q=(YAHOO.env.ua.gecko&&this.platform=="windows");if(Q){var P=this;setTimeout(function(){P._initResizeMonitor();},0);}else{this._initResizeMonitor();}},_initResizeMonitor:function(){var P,R,T;function V(){G.textResizeEvent.fire();}if(!YAHOO.env.ua.opera){R=F.get("_yuiResizeMonitor");var U=this._supportsCWResize();if(!R){R=document.createElement("iframe");if(this.isSecure&&G.RESIZE_MONITOR_SECURE_URL&&YAHOO.env.ua.ie){R.src=G.RESIZE_MONITOR_SECURE_URL;}if(!U){T=[" + + '; +} + + + + +/** + * A ReCaptchaResponse is returned from recaptcha_check_answer() + */ +class ReCaptchaResponse { + var $is_valid; + var $error; +} + + +/** + * Calls an HTTP POST function to verify if the user's guess was correct + * @param string $privkey + * @param string $remoteip + * @param string $challenge + * @param string $response + * @param array $extra_params an array of extra variables to post to the server + * @return ReCaptchaResponse + */ +function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) +{ + if ($privkey == null || $privkey == '') { + die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create"); + } + + if ($remoteip == null || $remoteip == '') { + die ("For security reasons, you must pass the remote ip to reCAPTCHA"); + } + + + + //discard spam submissions + if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { + $recaptcha_response = new ReCaptchaResponse(); + $recaptcha_response->is_valid = false; + $recaptcha_response->error = 'incorrect-captcha-sol'; + return $recaptcha_response; + } + + $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify", + array ( + 'privatekey' => $privkey, + 'remoteip' => $remoteip, + 'challenge' => $challenge, + 'response' => $response + ) + $extra_params + ); + + $answers = explode ("\n", $response [1]); + $recaptcha_response = new ReCaptchaResponse(); + + if (trim ($answers [0]) == 'true') { + $recaptcha_response->is_valid = true; + } + else { + $recaptcha_response->is_valid = false; + $recaptcha_response->error = $answers [1]; + } + return $recaptcha_response; + +} + +/** + * gets a URL where the user can sign up for reCAPTCHA. If your application + * has a configuration page where you enter a key, you should provide a link + * using this function. + * @param string $domain The domain where the page is hosted + * @param string $appname The name of your application + */ +function recaptcha_get_signup_url ($domain = null, $appname = null) { + return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname)); +} + +function _recaptcha_aes_pad($val) { + $block_size = 16; + $numpad = $block_size - (strlen ($val) % $block_size); + return str_pad($val, strlen ($val) + $numpad, chr($numpad)); +} + +/* Mailhide related code */ + +function _recaptcha_aes_encrypt($val,$ky) { + if (! function_exists ("mcrypt_encrypt")) { + die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed."); + } + $mode=MCRYPT_MODE_CBC; + $enc=MCRYPT_RIJNDAEL_128; + $val=_recaptcha_aes_pad($val); + return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); +} + + +function _recaptcha_mailhide_urlbase64 ($x) { + return strtr(base64_encode ($x), '+/', '-_'); +} + +/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */ +function recaptcha_mailhide_url($pubkey, $privkey, $email) { + if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) { + die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " . + "you can do so at http://www.google.com/recaptcha/mailhide/apikey"); + } + + + $ky = pack('H*', $privkey); + $cryptmail = _recaptcha_aes_encrypt ($email, $ky); + + return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail); +} + +/** + * gets the parts of the email to expose to the user. + * eg, given johndoe@example,com return ["john", "example.com"]. + * the email is then displayed as john...@example.com + */ +function _recaptcha_mailhide_email_parts ($email) { + $arr = preg_split("/@/", $email ); + + if (strlen ($arr[0]) <= 4) { + $arr[0] = substr ($arr[0], 0, 1); + } else if (strlen ($arr[0]) <= 6) { + $arr[0] = substr ($arr[0], 0, 3); + } else { + $arr[0] = substr ($arr[0], 0, 4); + } + return $arr; +} + +/** + * Gets html to display an email address given a public an private key. + * to get a key, go to: + * + * http://www.google.com/recaptcha/mailhide/apikey + */ +function recaptcha_mailhide_html($pubkey, $privkey, $email) { + $emailparts = _recaptcha_mailhide_email_parts ($email); + $url = recaptcha_mailhide_url ($pubkey, $privkey, $email); + + return htmlentities($emailparts[0]) . "...@" . htmlentities ($emailparts [1]); + +} + + +?> diff --git a/dvwa/favicon.ico b/dvwa/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d8a08d70e38fd3544ad74821e3934a2f6c0f2f67 GIT binary patch literal 1406 zcmeH@*-sNu6vn@+6zfVw#a-)$DDL9EAu6(nbeWb)=XM$fC_zDjMsySkv5ibbYD=Uw zHYUWVgoH?liYPu9B$XKT$r#?$e*{kpC24&0#Rtyh+`l?F%y zkU>cZddet|MmC*I1*3{mD9VSU!~{b@F6`!FaH_e@4Ce&_676<@*v(pq{SP6&d<3!g z0mN=UTu<(!HRwZc&vU$g_Xet`8T?8WoX`AFeJWIM3$EAK!d1q>Wf9za4g6js6!#5` zjs3vqPZ3l~rF6dm742?BA|p_))`6D_;0+fcdm1qObrhq-9W+NU9K^`*2XM&-$>+w$ z@858{QNizDKf&!5ln-{HvoiqEVn8?)oiPCUjslt6@T$KL{x%h2UkJRT1>WXc=xD!- z>T(HOp|^c`0dL3$iQZg)$%X1lCmhi^xD~vv0%Euo;!qcw9tSWqH~?-nf;&pUYh?1~ zGMd^v=;?lnw*#+H<0>N$jW8AFO<6r%Ogr%3I=~WQMuK8&Cg~)NCW$4_ik)Z~n>}al zy!i`KbPH37XxXC0OVXAuTfSoDs?}@OGCf + +1.) Bond. James Bond + +
      \n"; + +$line3 = "3.) Romeo, Romeo! wherefore art thou Romeo?"; +$line3 = "--LINE MISSING--"; +echo $line3 . "\n\n

      \n"; + +$line4 = "NC4pI" . "FRoZSBwb29s" . "IG9uIH" . "RoZSByb29mIG1" . "1c3QgaGF" . "2ZSBh" . "IGxlY" . "Wsu"; +echo base64_decode( $line4 ); + +?> + + diff --git a/dvwa/hackable/uploads/dvwa_email.png b/dvwa/hackable/uploads/dvwa_email.png new file mode 100644 index 0000000000000000000000000000000000000000..22af62f292de46987bc891fe190f97715b754b32 GIT binary patch literal 667 zcmV;M0%ZM(P)4~Te3^nk?5Svg(jxVr$UAcli?MJ@f_ve4cFG{`^|0dtj zYVb3DuQ_ovoD>T(`op%yDdi%ZAZm6+7_^2h^18!5SQOy1vE>aqVM*^hK>dtJltA9> z8aCIVG79BL4*e3B309>$zt^|19QY&o3R6->%?YYjuqA+KU+|(Ti!}wgHtpHA# zI~9M)<$D<>R6zeL&If*(lICTR#t{~z%*a(Y-h`|y3UlVD*5&@ZAi^7s4#}LTWtdic z$>me~us|Z?o{UH2c)ki8{gK)aK}uoz&-|3VBnor3HsVYEwCcn(+a&nTntxP%B7vEg z6@K|35RD%LQ{EDV2*Ys0XMh#?Y$LjPnV5kvvZ!d5-@5N^>URoFPZ8nVw1C`S@WAzK z_}qX>6gJ{=D6tjzq+u%eL z`rm=3oA=pa@h>cQe1T8X^2zwPJr2(vpAP>It#1*#Xt!wcE8YMA002ovPDHLkV1kdQ BN(2A^ literal 0 HcmV?d00001 diff --git a/dvwa/hackable/users/1337.jpg b/dvwa/hackable/users/1337.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5183ae372e1034165b5bfa062c69a1ab4677f163 GIT binary patch literal 3681 zcmbW%XHe5!mjLj8XaT{*Kq#Wr(2LT7AP^ovsS472M8IdLOi^Dd;$Uj z9NfYp!u%o^`33m@c?5KN70d*NFf&8=;V?M=|2b%Q0LBdX0Uq=qVSo+>qKAQKJ%GSz zpNyb?1@NB%qN8Ux?UI@04C`q@<2is1L{Cq5+W#rwv^wVW9AJPkvJ1&;F>#o>f`tR& z3J)@im=W4_A2`h>$RdhvLGdhSxVU-F^NNazOGrv7A(gMFs9x2%c3oFb-@wq^!qUpx z#@5c=<9bL%T*XLoP^;E?+3_dhNWK>u&nY5q6t zf4E?$F1pjPFo6GYf#||dH$9AjQAnPNUCR{g8pt86@PHYvomo`(fd!#xM&@)2nmEHH zqO>AP`G@u|+5Zj}|NoNx7wo@XM1YMRbUHkG7@!Fpu~xx7iFx%hh7!fkl;F2|q!b&Z zUZ*y2#DOc2D<>L%DmpnL^z56nqRc8jokS%=$c!kd2p~~9A_@oInqH?v6sJp6$S7h5CEh3Q{8_6Z{(ricVBI7Lu1JtvckN1hztDQ9z z%~i(ZnsOx^UtMdKEdM9nx!H4J$;>}~Fs&NvkAms2)*PN%l#PR23Z`e+J`FO&Nu~jb z>-emp^Xh}1z{X+LGP?qZ2=Jx*bhC`PNJ>VfD`Ll=eCP}86;**XF%*=dB#7GD+B@z? zg;?OI-~dMLh+OsKa!w?!plkMwG&N0H?+j*5*qRUdU+uH~OLfgyPWj6p-LtVa#|#u# z>OD$8_o8g8QAurM{^Ra50b(qinbe;PfVk9jM2@OTjVj8 z0mOLvYrVU7^#W~&gEGrC(9`&vDxpQd%5^cXR|W!bXp{uKI9*A@`q=#Zs(FMvUU`va zGT???O_Bn^$>N2Rny89uzo7oo; znm<>boFGY!#i9vD4D3U(mR*PLc!4x|<%fBL{JCu_OOUT8A}@w(lbA8q!3i|r+hk6T zUfDSV3OTFuJ}2> zeZ^+btjzm_^Sd4Q1DPsPx*~(=M%v3by(Z3HbDr!&%TZ#4*nT$ZQXBc8#ph#Q_7Cww zusFHuKE{sF|6(G8OK@+@)64NnwOg&C zE*O=ADov=?@=r!84d`A(v`!tjJ#Ng_iQks5|5VzOWD^GVsn)x>QCEypd`{Gtc7?k~ zG%U)V#W%(|)n6!L|Fs4lUiZ6Dx1B!|=lvehVTeIaKJPQaNa~a z{dzlv$c@#RFf~B#TjR%=(J07lv;$5&dDcj?Nue?DehJ~FZoPjj~jjXoFW0+>X-&J0N|G-^}3Bq)f~BU|V*fneUR%yZ)JTDoYh`dS1n2rwsOa z1t+B!cWP$$-{%#d36*{m$w_}1% z?mhMwO}FEuk;dt`LB zvk0wB*k^xGFpxo^h^y4J`P`wNBad%lj?+rW1-+FPX z?K3s)@+2_>&THmtZYDYMR@!GM>6$30lHsGA$ONf6zg_|VO>6njTgqAef}!#fU;<|` z2G=-Dy&AoxyeV#=UAAc1AGHPF?G2wSP%=>{ZjgzEn_J|Y+JF8iF~%n;QF>SX#X$=B z25-|NqzOA(ZaARk)3v8;2PGA4>0%5eaWSjhVNla=DZi`^d(0Mm@m{$!C< z@Ue+8^+Yea)u{;$UouvH0tN2WAq6;mTKBfgsCQ;&H~a_v57t$JAkYfbOz;Ps40#_{ z6i_rGf{pniAk*awQ!M&J@*g$w6!~(e%%aktI9EzqVz&S4boKp=V7%IURf|D-<=G%6 z$b}tJsqCw#0j`zy6^)6L8w0RDy6Sz#hIqaA$f8xF7isrxAGAyQHW3q^`y@(*Wi-%$ z;p<~T#*?5v{mL4MK{>UpFARO#JyOA5Z{vot3!_NFAb9#pnIY24JkS)CN%l2+^#Y1p zwUs|?n2sWqhNJ}AI$eC5HEfikY9Z4W>x#q8ltT^o(7F?P8Kw)_Or%EmhwJ{S2FZIR z;@mn}UcNu!oWq2^%5&uOvm1Cd2qGq(+2t0Im)TQF!Cjse26Y# zRDQPB4<$x@uRm28Enn{BM2)EwwfP}yCq%FADaam})xtBNvfeDp67-3W^5(o+)mRbZ z&x8}+h-h1ryU8+vZ?iq~Jl(S*MvdkBy?3B|4%90anfvH{Rs%Z6ALbWUa{unWtU56C z4oX+?=>{R|RqIx(IzWv_JQVs@>Nl6Q99Ql`3_6#Hu>bF`BM1nD9X z>ei@_3+A0o8i2>XxHrRVMl{YYy z{swaH?@{H)+9}?({dUqu=Lu#uI^vX zrcZpUNHr+4WC-_t&rKXew_igL_2Mof4e%6Cj(P0U0NC)@bxnT6%vx*GpFIG^H31HO|e zyXMq4tE?SR8}fE;+FHl+)_ZLR^B$>u78$Y+5Nhu``lJi;3>@L5F=NGMmSGmq<#7iUJTG6 literal 0 HcmV?d00001 diff --git a/dvwa/hackable/users/admin.jpg b/dvwa/hackable/users/admin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fb7a9c7368e45c05501114229ea637cb42dca1e3 GIT binary patch literal 3543 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 QLLhVxAl{Z^Pwox<13R#Jg8%>k literal 0 HcmV?d00001 diff --git a/dvwa/hackable/users/pablo.jpg b/dvwa/hackable/users/pablo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a9549db9b0e70ace4cd841358779a0acfd97f56 GIT binary patch literal 2961 zcmbW&c{tSH8UXO`EX5b2qA4WH$d+WyR#~EGY`-E@_OUO?h}6h3 z7-ZivO2Z5yGMbrRWV_Svcb|Ko=l*r?ea~~=f6jZ(^M0Q9kF)o2j{@+YH!(8-Kp+4B zu@|s64Hy9&5GWK1;b12Y4h~Kj4;;o0zJ2?+co2L70th|?Lhyj3h@gCQ?v6I?d&h1 zFJEzR$9P=#^z!xz3JwXq9TpxDcRxPi!NbI)KOR5H$b6cWol{s;j4LTEE3bG}k8gP0 z*z~5ky@S}<)lKT@9T^=PpP2kOMV_6b(&iTyzb-AW|6nj#fBxLq{Po)f0w900*!geR zf4C5A7nnU3DD1Zj1isDQ5CoJ%MvYUz&<5rjASkOI0~b1zUQpM@C3oDGF6rE`ZvDfcPZSB;YcuUH7ebIF0b^ejOBQgUppM|yH5zilU7IhYpcTaqMx|H?# zgSK--T+ZS=-b$ea;+~S6>jlZm?3z35;rP^GgIYdUPN=eO#>WSxz;A$kE5_ECO&S|5 z!-{{LqnPj_ckaf`JnhJ#VMCX`W~vn|fpk7@y`Ry~RTNtoeG>VuMjga-K5t~)1|d*u+io>e;FMKo9O3A0zj zI|_E?bq#kL2CjCk>y(ju(O7X#k9-NFC@ra2Fz9t;NVSbX`29?Ktu^~Y4p&p0(~aigHSH@pm&)~)vBlp3=HU*RO$!6{dY z14~4z&Oo$muwXM*mCLIiuasBOZvDH1)jsB^g|uGE4JQh-YX9}?;vPFAdUlRxDfgyi zqfbA+Hi2sy|L(yNt5J>j6m_EOMWg-b-)Aww-p2=RQV5lOEWXTD(i-U(+MWL1&i?(@ z2@+YX*_iDwV4*1?CRaDesCA?FhBpTrCh~B?Sx9|ccw<7*QQ1H}hNL+2 zGq;!kS+(L;7)&lVd>0R==zFihJIl9ErV>@-9s3X19iaf2*XiR(v+u&$P7$sI%c$(K zw_Krei~i8bFS)1dEUjislWurg_h~)~Rr@Xz$VV|avAL<#Yoy)A;1^_-Bs`3pb9Ovb zt!bvNxm~2Yq!*;E0LTO+-N>)GpxvdN@4*!#iY;i5ovEV0I?Ihq7HHe2EoB5}tCDUVJ=cEmMDf(S@Y^NfPCow2?R` zJghQmdB9TrONV+UBXmU+K(zJr4BpITjm&&9tpz7n^z6IlQ-h zf_?pWU*q`6Y zHGz4eoY@4?4Hr(nBOULqY*7Q3cA+Ez3>AN?-M)!q8mt*xF%tH@e8IexVcwIJu`uu3 z%U*=$iJwF#^Q!5q(2tmUgN_~Cb*Vn#7Zj4waz}tPZy1#T(VcGl(C+J@Z0dyJwQ^=L zMPiPSM%~>>{=0AVC*JwaPCOGP(oI{{nEK8cOpymNrmjvULq(!O@E_O6zvf1bhNF~f z9J{J(+afi@eS3-BLjI!O&udIB3q6Dk-K2?c?srdC!2%FG2dTF3-pypQXI*y%N0C__ ze#QNP{4P-=gZR8p(mP?gbgvB8W4WmxX#uREynHdXk%Z76?tn$}!R5%wkIv3-r~ z^&XPFT#XV$DS=v7m=mTo;FW)_j;u4|_#nkZG|Dw^a{_;IzmVihzUSh^`!UkdMK0TI zPg8u%N-lpcR6l9KAZPXX7oP-&o&Ff-9vDTi!dgGW#%qZ z7vub_FzkZD)%mm7$aM6=uz*h8yiqiIB+Y60u0;E+tm}`oyKfcN8nvq$z6`^AuxNE6Ee7)nSp= znkeaE7E*S7*LD9+eJd>@nu3W;`jEXTox%h;VRJcz1cD}#&gizNXqr-0LNr1Llk@qJ z^|?(jscQ6LNhuBQg{#^YZlR|Xh#8)`H>R`Zav zyIomMU)LGKP!KW3LS3P0ch)V2_W;_FFBf;b*x!QPP|ro)k#oqFjIY0Lai`)ztxFrj z#z5GEPTPC<)PpZiYgpwz&m-(87DnqnYdf3K*rOjvI0D+q9=g37Y-7Mv2Uy%vW8{3T WjwbVR2w8J5x8jzJg{)zFQ~v-2O=zD0 literal 0 HcmV?d00001 diff --git a/dvwa/hackable/users/smithy.jpg b/dvwa/hackable/users/smithy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b824c76e307f4069afc41750cac3cd2f925602a GIT binary patch literal 4382 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 literal 0 HcmV?d00001 diff --git a/dvwa/ids_log.php b/dvwa/ids_log.php new file mode 100644 index 0000000..d01e081 --- /dev/null +++ b/dvwa/ids_log.php @@ -0,0 +1,32 @@ + +

      PHPIDS Log

      + +

      " . dvwaReadIdsLog() . "

      +

      + +
      + +
      + + " . dvwaClearIdsLog() . " +
      "; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/index.php b/dvwa/index.php new file mode 100644 index 0000000..f672abe --- /dev/null +++ b/dvwa/index.php @@ -0,0 +1,50 @@ + +

      Welcome to Damn Vulnerable Web Application!

      +

      Damn Vulnerable Web Application (DVWA) is a PHP/MySQL web application that is damn vulnerable. Its main goal is to be an aid for security professionals to test their skills and tools in a legal environment, help web developers better understand the processes of securing web applications and to aid both students & teachers to learn about web application security in a controlled class room environment.

      +

      The aim of DVWA is to practice some of the most common web vulnerability, with various difficultly levels, with a simple straightforward interface.

      +
      +
      + +

      General Instructions

      +

      It is up to the user how they approach DVWA. Either by working through every module at a fixed level, or selecting any module and working up to reach the highest level they can before moving onto the next one. There is not a fixed object to complete a module; however users should feel that they have successfully exploited the system as best as they possible could by using that particular vulnerability.

      +

      Please note, there are both documented and undocumented vulnerability with this software. This is intentional. You are encouraged to try and discover as many issues as possible.

      +

      DVWA also includes a Web Application Firewall (WAF), PHPIDS, which can be enabled at any stage to further increase the difficulty. This will demonstrate how adding another layer of security may block certain malicious actions. Note, there are also various public methods at bypassing these protections (so this can be see an as extension for more advance users)!

      +

      There is a help button at the bottom of each page, which allows you to view hints & tips for that vulnerability. There are also additional links for further background reading, which relates to that security issue.

      +
      +
      + +

      WARNING!

      +

      Damn Vulnerable Web Application is damn vulnerable! Do not upload it to your hosting provider's public html folder or any Internet facing servers, as they will be compromised. It is recommend using a virtual machine (such as " . dvwaExternalLinkUrlGet( 'https://www.virtualbox.org/','VirtualBox' ) . " or " . dvwaExternalLinkUrlGet( 'https://www.vmware.com/','VMware' ) . "), which is set to NAT networking mode. Inside a guest machine, you can downloading and install " . dvwaExternalLinkUrlGet( 'https://www.apachefriends.org/en/xampp.html','XAMPP' ) . " for the web server and database.

      +
      +

      Disclaimer

      +

      We do not take responsibility for the way in which any one uses this application (DVWA). We have made the purposes of the application clear and it should not be used maliciously. We have given warnings and taken measures to prevent users from installing DVWA on to live web servers. If your web server is compromised via an installation of DVWA it is not our responsibility it is the responsibility of the person/s who uploaded and installed it.

      +
      +
      + +

      More Training Resources

      +

      DVWA aims to cover the most commonly seen vulnerabilities found in today's web applications. However there are plenty of other issues with web applications. Should you wish to explore any additional attack vectors, or want more difficult challenges, you may wish to look into the following other projects:

      +
        +
      • " . dvwaExternalLinkUrlGet( 'http://www.itsecgames.com/', 'bWAPP') . "
      • +
      • " . dvwaExternalLinkUrlGet( 'http://sourceforge.net/projects/mutillidae/files/mutillidae-project/', 'NOWASP') . " (formerly known as " . dvwaExternalLinkUrlGet( 'http://www.irongeek.com/i.php?page=mutillidae/mutillidae-deliberately-vulnerable-php-owasp-top-10', 'Mutillidae' ) . ")
      • +
      • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/OWASP_Broken_Web_Applications_Project', 'OWASP Broken Web Applications Project +') . "
      • +
      +
      +
      +
      "; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/instructions.php b/dvwa/instructions.php new file mode 100644 index 0000000..8d17c37 --- /dev/null +++ b/dvwa/instructions.php @@ -0,0 +1,61 @@ + array( 'legend' => 'Read Me', 'file' => 'README.md' ), + 'PDF' => array( 'legend' => 'PDF Guide', 'file' => 'docs/pdf.html' ), + 'changelog' => array( 'legend' => 'Change Log', 'file' => 'CHANGELOG.md' ), + 'copying' => array( 'legend' => 'Copying', 'file' => 'COPYING.txt' ), + 'PHPIDS-license' => array( 'legend' => 'PHPIDS License', 'file' => DVWA_WEB_PAGE_TO_PHPIDS . 'LICENSE' ), +); + +$selectedDocId = isset( $_GET[ 'doc' ] ) ? $_GET[ 'doc' ] : ''; +if( !array_key_exists( $selectedDocId, $docs ) ) { + $selectedDocId = 'readme'; +} +$readFile = $docs[ $selectedDocId ][ 'file' ]; + +$instructions = file_get_contents( DVWA_WEB_PAGE_TO_ROOT.$readFile ); + +function urlReplace( $matches ) { + return dvwaExternalLinkUrlGet( $matches[1] ); +} + +// Make links and obfuscate the referer... +$instructions = preg_replace_callback( + '/((http|https|ftp):\/\/([[:alnum:]|.|\/|?|=]+))/', + 'urlReplace', + $instructions +); + +$instructions = nl2br( $instructions ); + +$docMenuHtml = ''; +foreach( array_keys( $docs ) as $docId ) { + $selectedClass = ( $docId == $selectedDocId ) ? ' selected' : ''; + $docMenuHtml .= "{$docs[$docId]['legend']}"; +} +$docMenuHtml = "
      {$docMenuHtml}
      "; + +$page[ 'body' ] .= " +
      +

      Instructions

      + + {$docMenuHtml} + + + {$instructions} + +
      "; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/login.php b/dvwa/login.php new file mode 100644 index 0000000..d0ca8bc --- /dev/null +++ b/dvwa/login.php @@ -0,0 +1,133 @@ +Need to run 'setup.php'." ); + dvwaRedirect( DVWA_WEB_PAGE_TO_ROOT . 'setup.php' ); + } + + $query = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';"; + $result = @mysql_query( $query ) or die( '
      ' . mysql_error() . '.
      Try installing again.
      ' ); + if( $result && mysql_num_rows( $result ) == 1 ) { // Login Successful... + dvwaMessagePush( "You have logged in as '{$user}'" ); + dvwaLogin( $user ); + dvwaRedirect( DVWA_WEB_PAGE_TO_ROOT . 'index.php' ); + } + + // Login failed + dvwaMessagePush( 'Login failed' ); + dvwaRedirect( 'login.php' ); +} + +$messagesHtml = messagesPopAllToHtml(); + +Header( 'Cache-Control: no-cache, must-revalidate'); // HTTP/1.1 +Header( 'Content-Type: text/html;charset=utf-8' ); // TODO- proper XHTML headers... +Header( 'Expires: Tue, 23 Jun 2009 12:00:00 GMT' ); // Date in the past + +// Anti-CSRF +generateSessionToken(); + +echo " + + + + + + + + + Login :: Damn Vulnerable Web Application (DVWA) v" . dvwaVersionGet() . " + + + + + + + +
      + +
      + +
      + +

      + +
      + +
      + +
      + +
      + +
      + +
      + + +
      + +
      + +

      + +
      + + " . tokenField() . " + +
      + +
      + + {$messagesHtml} + +
      +
      +
      +
      +
      +
      +
      +
      + + +
      + +
      + +

      " . dvwaExternalLinkUrlGet( 'http://www.dvwa.co.uk/', 'Damn Vulnerable Web Application (DVWA)' ) . " is a RandomStorm OpenSource project.

      + +
      + +
      + + + +"; + +?> diff --git a/dvwa/logout.php b/dvwa/logout.php new file mode 100644 index 0000000..e02be14 --- /dev/null +++ b/dvwa/logout.php @@ -0,0 +1,17 @@ + diff --git a/dvwa/php.ini b/dvwa/php.ini new file mode 100644 index 0000000..0c30998 --- /dev/null +++ b/dvwa/php.ini @@ -0,0 +1,5 @@ +; This file attempts to overwrite the original php.ini file. Doesnt always work. + +magic_quotes_gpc = Off +allow_url_fopen on +allow_url_include on \ No newline at end of file diff --git a/dvwa/phpinfo.php b/dvwa/phpinfo.php new file mode 100644 index 0000000..4a3c2b5 --- /dev/null +++ b/dvwa/phpinfo.php @@ -0,0 +1,10 @@ + diff --git a/dvwa/robots.txt b/dvwa/robots.txt new file mode 100644 index 0000000..c2aab7e --- /dev/null +++ b/dvwa/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/dvwa/security.php b/dvwa/security.php new file mode 100644 index 0000000..2a4a7ce --- /dev/null +++ b/dvwa/security.php @@ -0,0 +1,125 @@ +Security level is currently: $securityLevel.

      "; + } + $securityOptionsHtml .= ""; +} + +$phpIdsHtml = 'PHPIDS is currently: '; +if( dvwaPhpIdsIsEnabled() ) { + $phpIdsHtml .= 'enabled. [Disable PHPIDS]'; +} +else { + $phpIdsHtml .= 'disabled. [Enable PHPIDS]'; +} + +// Anti-CSRF +generateSessionToken(); + +// Able to write to the PHPIDS log file? +$WarningHtml = ''; +if( !is_writable( $PHPIDSPath ) ) { + $WarningHtml .= "

      Cannot write to the PHPIDS log file: ${PHPIDSPath}
      "; +} + + +$page[ 'body' ] .= " +
      +

      DVWA Security

      +
      + +

      Security Level

      + + {$securityHtml} + +
      + {$securityLevelHtml} +

      You can set the security level to low, medium, high or impossible. The security level changes the vulnerability level of DVWA:

      +
        +
      1. Low - This security level is completely vulnerable and has no security measures at all. It's use is to be as an example of how web application vulnerabilities manifest through bad coding practices and to serve as a platform to teach or learn basic exploitation techniques.
      2. +
      3. Medium - This setting is mainly to give an example to the user of bad security practices, where the developer has tried but failed to secure an application. It also acts as a challenge to users to refine their exploitation techniques.
      4. +
      5. High - This option is an extension to the medium difficulty, with a mixture of harder or alternative bad practices to attempt to secure the code. The vulnerability may not allow the same extent of the exploitation, similar in various Capture The Flags (CTFs) competitions.
      6. +
      7. Impossible - This level should be secure against all vulnerabilities. It is used to compare the vulnerable source code to the secure source code.
        + Priority to DVWA v1.9, this level was known as 'high'.
      8. +
      + + + " . tokenField() . " +
      + +
      +
      +
      + +

      PHPIDS

      + {$WarningHtml} +

      " . dvwaExternalLinkUrlGet( 'https://github.com/PHPIDS/PHPIDS', 'PHPIDS' ) . " v" . dvwaPhpIdsVersionGet() . " (PHP-Intrusion Detection System) is a security layer for PHP based web applications.

      +

      PHPIDS works by filtering any user supplied input against a blacklist of potentially malicious code. It is used in DVWA to serve as a live example of how Web Application Firewalls (WAFs) can help improve security and in some cases how WAFs can be circumvented.

      +

      You can enable PHPIDS across this site for the duration of your session.

      + +

      {$phpIdsHtml}

      + [\">Simulate attack] - + [View IDS log] +
      "; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/setup.php b/dvwa/setup.php new file mode 100644 index 0000000..9faffc6 --- /dev/null +++ b/dvwa/setup.php @@ -0,0 +1,79 @@ + +

      Database Setup

      + +

      Click on the 'Create / Reset Database' button below to create or reset your database.
      + If you get an error make sure you have the correct user credentials in: " . realpath( getcwd() ) . "/config/config.inc.php

      + +

      If the database already exists, it will be cleared and the data will be reset.
      + You can also use this to reset the administrator credentials (\"admin // password\") at any stage.

      +
      +
      + +

      Setup Check

      + + {$DVWAOS}
      + Backend database: {$DBMS}
      + PHP version: " . phpversion() . "
      +
      + {$SERVER_NAME}
      +
      + {$phpDisplayErrors}
      + {$phpSafeMode}
      + {$phpURLInclude}
      + {$phpURLFopen}
      + {$phpMagicQuotes}
      + {$phpGD}
      +
      + {$DVWARecaptcha}
      +
      + {$DVWAUploadsWrite}
      + {$DVWAPHPWrite}
      +
      + Status in red, indicate there will be an issue when trying to complete some modules.
      +


      + + +
      + + " . tokenField() . " +
      +
      +
      +
      "; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/brute/help/help.php b/dvwa/vulnerabilities/brute/help/help.php new file mode 100644 index 0000000..ebe4c68 --- /dev/null +++ b/dvwa/vulnerabilities/brute/help/help.php @@ -0,0 +1,69 @@ +
      +

      Help - Brute Force (Login)

      + +
      + + + + +
      +

      About

      +

      Password cracking is the process of recovering passwords from data that has been stored in or transmitted by a computer system. + A common approach is to repeatedly try guesses for the password.

      + +

      Users often choose weak passwords. Examples of insecure choices include single words found in dictionaries, family names, any too short password + (usually thought to be less than 6 or 7 characters), or predictable patterns + (e.g. alternating vowels and consonants, which is known as leetspeak, so "password" becomes "p@55w0rd").

      + +

      Creating a targeted wordlists, which is generated towards the target, often gives the highest success rate. There are public tools out there that will create a dictionary + based on a combination of company websites, personal social networks and other common information (such as birthdays or year of graduation). + +

      A last resort is to try every possible password, known as a brute force attack. In theory, if there is no limit to the number of attempts, a brute force attack will always + be successful since the rules for acceptable passwords must be publicly known; but as the length of the password increases, so does the number of possible passwords + making the attack time longer.

      + +


      + +

      Objective

      +

      Your goal is to get the administrator’s password by brute forcing. Bonus points for getting the other four user passwords!

      + +


      + +

      Low Level

      +

      The developer has completely missed out any protections methods, allowing for anyone to try as many times as they wish, to login to any user without any repercussions.

      + +
      + +

      Medium Level

      +

      This stage adds a sleep on the failed login screen. This mean when you login incorrectly, there will be an extra two second wait before the page is visible.

      + +

      This will only slow down the amount of requests which can be processed a minute, making it longer to brute force.

      + +
      + +

      High Level

      +

      There has been an "anti Cross-Site Request Forgery (CSRF) token" used. There is a old myth that this protection will stop brute force attacks. This is not the case. + This level also extends on the medium level, by waiting when there is a failed login but this time it is a random amount of time between two and four seconds. + The idea of this is to try and confuse any timing predictions.

      + +

      Using a form could have a similar effect as a CSRF token.

      + +
      + +

      Impossible Level

      +

      Brute force (and user enumeration) should not be possible in the impossible level. The developer has added a "lock out" feature, where if there are five bad logins within + the last 15 minutes, the locked out user cannot log in.

      + +

      If the locked out user tries to login, even with a valid password, it will say their username or password is incorrect. This will make it impossible to know + if there is a valid account on the system, with that password, and if the account is locked.

      + +

      This can cause a "Denial of Service" (DoS), by having someone continually trying to login to someone's account. + This level would need to be extended by blacklisting the attacker (e.g. IP address, country, user-agent).

      +
      + +
      + +
      + +

      Reference:

      +
      diff --git a/dvwa/vulnerabilities/brute/index.php b/dvwa/vulnerabilities/brute/index.php new file mode 100644 index 0000000..76a9508 --- /dev/null +++ b/dvwa/vulnerabilities/brute/index.php @@ -0,0 +1,68 @@ + +

      Vulnerability: Brute Force

      + +
      +

      Login

      + +
      + Username:
      +
      + Password:
      +
      +
      + \n"; + +if( $vulnerabilityFile == 'high.php' || $vulnerabilityFile == 'impossible.php' ) + $page[ 'body' ] .= " " . tokenField(); + +$page[ 'body' ] .= " +
      + {$html} +
      + +

      More Information

      +
        +
      • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Testing_for_Brute_Force_(OWASP-AT-004)' ) . "
      • +
      • " . dvwaExternalLinkUrlGet( 'http://www.symantec.com/connect/articles/password-crackers-ensuring-security-your-password' ) . "
      • +
      • " . dvwaExternalLinkUrlGet( 'http://www.sillychicken.co.nz/Security/how-to-brute-force-http-forms-in-windows.html' ) . "
      • +
      +
      \n"; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/brute/source/high.php b/dvwa/vulnerabilities/brute/source/high.php new file mode 100644 index 0000000..1d6c706 --- /dev/null +++ b/dvwa/vulnerabilities/brute/source/high.php @@ -0,0 +1,42 @@ +' . mysql_error() . '' ); + + if( $result && mysql_num_rows( $result ) == 1 ) { + // Get users details + $avatar = mysql_result( $result, 0, "avatar" ); + + // Login successful + $html .= "

      Welcome to the password protected area {$user}

      "; + $html .= ""; + } + else { + // Login failed + sleep( rand( 0, 3 ) ); + $html .= "

      Username and/or password incorrect.
      "; + } + + mysql_close(); +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/brute/source/impossible.php b/dvwa/vulnerabilities/brute/source/impossible.php new file mode 100644 index 0000000..6e46238 --- /dev/null +++ b/dvwa/vulnerabilities/brute/source/impossible.php @@ -0,0 +1,96 @@ +prepare( 'SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;' ); + $data->bindParam( ':user', $user, PDO::PARAM_STR ); + $data->execute(); + $row = $data->fetch(); + + // Check to see if the user has been locked out. + if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) ) { + // User locked out. Note, using this method would allow for user enumeration! + //$html .= "

      This account has been locked due to too many incorrect logins.
      "; + + // Calculate when the user would be allowed to login again + $last_login = $row[ 'last_login' ]; + $last_login = strtotime( $last_login ); + $timeout = strtotime( "{$last_login} +{$lockout_time} minutes" ); + $timenow = strtotime( "now" ); + + // Check to see if enough time has passed, if it hasn't locked the account + if( $timenow > $timeout ) + $account_locked = true; + } + + // Check the database (if username matches the password) + $data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' ); + $data->bindParam( ':user', $user, PDO::PARAM_STR); + $data->bindParam( ':password', $pass, PDO::PARAM_STR ); + $data->execute(); + $row = $data->fetch(); + + // If its a valid login... + if( ( $data->rowCount() == 1 ) && ( $account_locked == false ) ) { + // Get users details + $avatar = $row[ 'avatar' ]; + $failed_login = $row[ 'failed_login' ]; + $last_login = $row[ 'last_login' ]; + + // Login successful + $html .= "

      Welcome to the password protected area {$user}

      "; + $html .= ""; + + // Had the account been locked out since last login? + if( $failed_login >= $total_failed_login ) { + $html .= "

      Warning: Someone might of been brute forcing your account.

      "; + $html .= "

      Number of login attempts: {$failed_login}.
      Last login attempt was at: ${last_login}.

      "; + } + + // Reset bad login count + $data = $db->prepare( 'UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;' ); + $data->bindParam( ':user', $user, PDO::PARAM_STR ); + $data->execute(); + } + else { + // Login failed + sleep( rand( 2, 4 ) ); + + // Give the user some feedback + $html .= "

      Username and/or password incorrect.

      Alternative, the account has been locked because of too many failed logins.
      If this is the case, please try again in {$lockout_time} minutes.
      "; + + // Update bad login count + $data = $db->prepare( 'UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;' ); + $data->bindParam( ':user', $user, PDO::PARAM_STR ); + $data->execute(); + } + + // Set the last login time + $data = $db->prepare( 'UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;' ); + $data->bindParam( ':user', $user, PDO::PARAM_STR ); + $data->execute(); +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/brute/source/low.php b/dvwa/vulnerabilities/brute/source/low.php new file mode 100644 index 0000000..3ab2988 --- /dev/null +++ b/dvwa/vulnerabilities/brute/source/low.php @@ -0,0 +1,31 @@ +' . mysql_error() . '' ); + + if( $result && mysql_num_rows( $result ) == 1 ) { + // Get users details + $avatar = mysql_result( $result, 0, "avatar" ); + + // Login successful + $html .= "

      Welcome to the password protected area {$user}

      "; + $html .= ""; + } + else { + // Login failed + $html .= "

      Username and/or password incorrect.
      "; + } + + mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/brute/source/medium.php b/dvwa/vulnerabilities/brute/source/medium.php new file mode 100644 index 0000000..195b377 --- /dev/null +++ b/dvwa/vulnerabilities/brute/source/medium.php @@ -0,0 +1,34 @@ +' . mysql_error() . '' ); + + if( $result && mysql_num_rows( $result ) == 1 ) { + // Get users details + $avatar = mysql_result( $result, 0, "avatar" ); + + // Login successful + $html .= "

      Welcome to the password protected area {$user}

      "; + $html .= ""; + } + else { + // Login failed + sleep( 2 ); + $html .= "

      Username and/or password incorrect.
      "; + } + + mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/captcha/help/help.php b/dvwa/vulnerabilities/captcha/help/help.php new file mode 100644 index 0000000..aa9dfae --- /dev/null +++ b/dvwa/vulnerabilities/captcha/help/help.php @@ -0,0 +1,62 @@ +
      +

      Help - Insecure CAPTCHA

      + +
      + + + + +
      +

      About

      +

      A is a program that can tell whether its user is a human or a computer. You've probably seen + them - colourful images with distorted text at the bottom of Web registration forms. CAPTCHAs are used by many websites to prevent abuse from + "bots", or automated programs usually written to generate spam. No computer program can read distorted text as well as humans can, so bots + cannot navigate sites protected by CAPTCHAs.

      + +

      CAPTCHAs are often used to protect sensitive functionality from automated bots. Such functionality typically includes user registration and changes, + password changes, and posting content. In this example, the CAPTCHA is guarding the change password functionality for the user account. This provides + limited protection from CSRF attacks as well as automated bot guessing.

      + +


      + +

      Objective

      +

      Your aim, change the current user's password in a automated manner because of the poor CAPTCHA system.

      + +


      + +

      Low Level

      +

      The issue with this CAPTCHA is that it is easily bypassed. The developer has made the assumption that all users will progress through screen 1, complete the CAPTCHA, and then + move on to the next screen where the password is actually updated. By submitting the new password directly to the change page, the user may bypass the CAPTCHA system.

      + +

      The parameters required to complete this challenge in low security would be similar to the following:

      +
      Spoiler: ?step=2&password_new=password&password_conf=password&Change=Change.
      + +
      + +

      Medium Level

      +

      The developer has attempted to place state around the session and keep track of whether the user successfully completed the + CAPTCHA prior to submitting data. Because the state variable (Spoiler: passed_captcha) is on the client side, + it can also be manipulated by the attacker like so:

      +
      Spoiler: ?step=2&password_new=password&password_conf=password&passed_captcha=true&Change=Change.
      + +
      + +

      High Level

      +

      There has been development code left in, which was never removed in production. It is possible to mimic the development values, to allow + invalid values in be placed into the CAPTCHA field.

      +

      You will need to spoof your user-agent (Spoiler: reCAPTCHA) as well as use the CAPTCHA value of + (Spoiler: hidd3n_valu3) to skip the check.

      + +
      + +

      Impossible Level

      +

      In the impossible level, the developer has removed all avenues of attack. The process has been simplified so that data and CAPTCHA verification occurs in one + single step. Alternatively, the developer could have moved the state variable server side (from the medium level), so the user cannot alter it.

      +
      + +
      + +
      + +

      Reference:

      +
      diff --git a/dvwa/vulnerabilities/captcha/index.php b/dvwa/vulnerabilities/captcha/index.php new file mode 100644 index 0000000..d02db91 --- /dev/null +++ b/dvwa/vulnerabilities/captcha/index.php @@ -0,0 +1,98 @@ +reCAPTCHA API key missing from config file: " . realpath( dirname( dirname( getcwd() ) ) . "/config/config.inc.php" ) . "
      "; + $html = "Please register for a key from reCAPTCHA: " . dvwaExternalLinkUrlGet('https://www.google.com/recaptcha/admin/create'); + $hide_form = true; +} + +$page[ 'body' ] .= " +
      +

      Vulnerability: Insecure CAPTCHA

      + + {$WarningHtml} + +
      +
      \n"; + +if( $vulnerabilityFile == 'impossible.php' ) { + $page[ 'body' ] .= " + Current password:
      +
      "; +} + +$page[ 'body' ] .= " New password:
      +
      + Confirm new password:
      +
      + + " . recaptcha_get_html( $_DVWA[ 'recaptcha_public_key' ] ); +if( $vulnerabilityFile == 'high.php' ) + $page[ 'body' ] .= "\n\n \n"; + +if( $vulnerabilityFile == 'high.php' || $vulnerabilityFile == 'impossible.php' ) + $page[ 'body' ] .= "\n " . tokenField(); + +$page[ 'body' ] .= " +
      + + +
      + {$html} +
      + +

      More Information

      +
        +
      • " . dvwaExternalLinkUrlGet( 'http://www.captcha.net/' ) . "
      • +
      • " . dvwaExternalLinkUrlGet( 'https://www.google.com/recaptcha/' ) . "
      • +
      • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Testing_for_Captcha_(OWASP-AT-012)' ) . "
      • +
      +
      \n"; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/captcha/source/high.php b/dvwa/vulnerabilities/captcha/source/high.php new file mode 100644 index 0000000..ba02a4a --- /dev/null +++ b/dvwa/vulnerabilities/captcha/source/high.php @@ -0,0 +1,50 @@ +is_valid && ( $_POST[ 'recaptcha_response_field' ] != 'hidd3n_valu3' || $_SERVER[ 'HTTP_USER_AGENT' ] != 'reCAPTCHA' ) ) { + // What happens when the CAPTCHA was entered incorrectly + $html .= "

      The CAPTCHA was incorrect. Please try again.
      "; + $hide_form = false; + return; + } + else { + // CAPTCHA was correct. Do both new passwords match? + if( $pass_new == $pass_conf ) { + $pass_new = mysql_real_escape_string( $pass_new ); + $pass_new = md5( $pass_new ); + + // Update database + $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "' LIMIT 1;"; + $result = mysql_query( $insert ) or die( '
      ' . mysql_error() . '
      ' ); + + // Feedback for user + $html .= "
      Password Changed.
      "; + } + else { + // Ops. Password mismatch + $html .= "
      Both passwords must match.
      "; + $hide_form = false; + } + } + + mysql_close(); +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/captcha/source/impossible.php b/dvwa/vulnerabilities/captcha/source/impossible.php new file mode 100644 index 0000000..c913986 --- /dev/null +++ b/dvwa/vulnerabilities/captcha/source/impossible.php @@ -0,0 +1,68 @@ +is_valid ) { + // What happens when the CAPTCHA was entered incorrectly + $html .= "

      The CAPTCHA was incorrect. Please try again.
      "; + $hide_form = false; + return; + } + else { + // Check that the current password is correct + $data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' ); + $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); + $data->bindParam( ':password', $pass_curr, PDO::PARAM_STR ); + $data->execute(); + + // Do both new password match and was the current password correct? + if( ( $pass_new == $pass_conf) && ( $data->rowCount() == 1 ) ) { + // Update the database + $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' ); + $data->bindParam( ':password', $pass_new, PDO::PARAM_STR ); + $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); + $data->execute(); + + // Feedback for the end user - success! + $html .= "
      Password Changed.
      "; + } + else { + // Feedback for the end user - failed! + $html .= "
      Either your current password is incorrect or the new passwords did not match.
      Please try again.
      "; + $hide_form = false; + } + } +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/captcha/source/low.php b/dvwa/vulnerabilities/captcha/source/low.php new file mode 100644 index 0000000..f5103cd --- /dev/null +++ b/dvwa/vulnerabilities/captcha/source/low.php @@ -0,0 +1,75 @@ +is_valid ) { + // What happens when the CAPTCHA was entered incorrectly + $html .= "

      The CAPTCHA was incorrect. Please try again.
      "; + $hide_form = false; + return; + } + else { + // CAPTCHA was correct. Do both new passwords match? + if( $pass_new == $pass_conf ) { + // Show next stage for the user + $html .= " +

      You passed the CAPTCHA! Click the button to confirm your changes.
      +
      + + + + +
      "; + } + else { + // Both new passwords do not match. + $html .= "
      Both passwords must match.
      "; + $hide_form = false; + } + } +} + +if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) { + // Hide the CAPTCHA form + $hide_form = true; + + // Get input + $pass_new = $_POST[ 'password_new' ]; + $pass_conf = $_POST[ 'password_conf' ]; + + // Check to see if both password match + if( $pass_new == $pass_conf ) { + // They do! + $pass_new = mysql_real_escape_string( $pass_new ); + $pass_new = md5( $pass_new ); + + // Update database + $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; + $result = mysql_query( $insert ) or die( '
      ' . mysql_error() . '
      ' ); + + // Feedback for the end user + $html .= "
      Password Changed.
      "; + } + else { + // Issue with the passwords matching + $html .= "
      Passwords did not match.
      "; + $hide_form = false; + } + + mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/captcha/source/medium.php b/dvwa/vulnerabilities/captcha/source/medium.php new file mode 100644 index 0000000..8fed102 --- /dev/null +++ b/dvwa/vulnerabilities/captcha/source/medium.php @@ -0,0 +1,83 @@ +is_valid ) { + // What happens when the CAPTCHA was entered incorrectly + $html .= "

      The CAPTCHA was incorrect. Please try again.
      "; + $hide_form = false; + return; + } + else { + // CAPTCHA was correct. Do both new passwords match? + if( $pass_new == $pass_conf ) { + // Show next stage for the user + $html .= " +

      You passed the CAPTCHA! Click the button to confirm your changes.
      +
      + + + + + +
      "; + } + else { + // Both new passwords do not match. + $html .= "
      Both passwords must match.
      "; + $hide_form = false; + } + } +} + +if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) { + // Hide the CAPTCHA form + $hide_form = true; + + // Get input + $pass_new = $_POST[ 'password_new' ]; + $pass_conf = $_POST[ 'password_conf' ]; + + // Check to see if they did stage 1 + if( !$_POST[ 'passed_captcha' ] ) { + $html .= "

      You have not passed the CAPTCHA.
      "; + $hide_form = false; + return; + } + + // Check to see if both password match + if( $pass_new == $pass_conf ) { + // They do! + $pass_new = mysql_real_escape_string( $pass_new ); + $pass_new = md5( $pass_new ); + + // Update database + $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; + $result = mysql_query( $insert ) or die( '
      ' . mysql_error() . '
      ' ); + + // Feedback for the end user + $html .= "
      Password Changed.
      "; + } + else { + // Issue with the passwords matching + $html .= "
      Passwords did not match.
      "; + $hide_form = false; + } + + mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/csrf/help/help.php b/dvwa/vulnerabilities/csrf/help/help.php new file mode 100644 index 0000000..c025b03 --- /dev/null +++ b/dvwa/vulnerabilities/csrf/help/help.php @@ -0,0 +1,57 @@ +
      +

      Help - Cross Site Request Forgery (CSRF)

      + +
      + + + + +
      +

      About

      +

      CSRF is an attack that forces an end user to execute unwanted actions on a web application in which they are currently authenticated. + With a little help of social engineering (such as sending a link via email/chat), an attacker may force the users of a web application to execute actions of + the attacker's choosing.

      + +

      A successful CSRF exploit can compromise end user data and operation in case of normal user. If the targeted end user is + the administrator account, this can compromise the entire web application.

      + +

      This attack may also be called "XSRF", similar to "Cross Site scripting (XSS)", and they are often used together.

      + +


      + +

      Objective

      +

      Your task is to make the current user change their own password, without them knowing about their actions, using a CSRF attack.

      + +


      + +

      Low Level

      +

      There are no measures in place to protect against this attack. This means a link can be crafted to achieve a certain action (in this case, change the current users password). + Then with some basic social engineering, have the target click the link (or just visit a certain page), to trigger the action.

      +
      Spoiler: ?password_new=password&password_conf=password&Change=Change.
      + +
      + +

      Medium Level

      +

      For the medium level challenge, there is a check to see where the last requested page came from. The developer believes if it matches the current domain, + it must of come from the web application so it can be trusted.

      +

      It may be required to link in multiple vulnerabilities to exploit this vector, such as reflective XSS.

      + +
      + +

      High Level

      +

      In the high level, the developer has added an "anti Cross-Site Request Forgery (CSRF) token". In order by bypass this protection method, another vulnerability will be required.

      +
      Spoiler: e.g. Javascript is a executed on the client side, in the browser.
      + +
      + +

      Impossible Level

      +

      In the impossible level, the challenge will extent the high level and asks for the current user's password. As this cannot be found out (only predicted or brute forced), + there is not an attack vector here.

      +
      + +
      + +
      + +

      Reference:

      +
      diff --git a/dvwa/vulnerabilities/csrf/index.php b/dvwa/vulnerabilities/csrf/index.php new file mode 100644 index 0000000..a587625 --- /dev/null +++ b/dvwa/vulnerabilities/csrf/index.php @@ -0,0 +1,76 @@ + +

      Vulnerability: Cross Site Request Forgery (CSRF)

      + +
      +

      Change your admin password:

      +
      + +
      "; + +if( $vulnerabilityFile == 'impossible.php' ) { + $page[ 'body' ] .= " + Current password:
      +
      "; +} + +$page[ 'body' ] .= " + New password:
      +
      + Confirm new password:
      +
      +
      + \n"; + +if( $vulnerabilityFile == 'high.php' || $vulnerabilityFile == 'impossible.php' ) + $page[ 'body' ] .= " " . tokenField(); + +$page[ 'body' ] .= " +
      + {$html} +
      + +

      More Information

      +
        +
      • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Cross-Site_Request_Forgery' ) . "
      • +
      • " . dvwaExternalLinkUrlGet( 'http://www.cgisecurity.com/csrf-faq.html' ) . "
      • +
      • " . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/Cross-site_request_forgery ' ) . "
      • +
      +
    \n"; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/csrf/source/high.php b/dvwa/vulnerabilities/csrf/source/high.php new file mode 100644 index 0000000..29542c7 --- /dev/null +++ b/dvwa/vulnerabilities/csrf/source/high.php @@ -0,0 +1,35 @@ +' . mysql_error() . '' ); + + // Feedback for the user + $html .= "
    Password Changed.
    "; + } + else { + // Issue with passwords matching + $html .= "
    Passwords did not match.
    "; + } + + mysql_close(); +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/csrf/source/impossible.php b/dvwa/vulnerabilities/csrf/source/impossible.php new file mode 100644 index 0000000..eb98a51 --- /dev/null +++ b/dvwa/vulnerabilities/csrf/source/impossible.php @@ -0,0 +1,48 @@ +prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' ); + $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); + $data->bindParam( ':password', $pass_curr, PDO::PARAM_STR ); + $data->execute(); + + // Do both new passwords match and does the current password match the user? + if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) { + // It does! + $pass_new = stripslashes( $pass_new ); + $pass_new = mysql_real_escape_string( $pass_new ); + $pass_new = md5( $pass_new ); + + // Update database with new password + $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' ); + $data->bindParam( ':password', $pass_new, PDO::PARAM_STR ); + $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR ); + $data->execute(); + + // Feedback for the user + $html .= "
    Password Changed.
    "; + } + else { + // Issue with passwords matching + $html .= "
    Passwords did not match or current password incorrect.
    "; + } +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/csrf/source/low.php b/dvwa/vulnerabilities/csrf/source/low.php new file mode 100644 index 0000000..4e5cbd0 --- /dev/null +++ b/dvwa/vulnerabilities/csrf/source/low.php @@ -0,0 +1,29 @@ +' . mysql_error() . '' ); + + // Feedback for the user + $html .= "
    Password Changed.
    "; + } + else { + // Issue with passwords matching + $html .= "
    Passwords did not match.
    "; + } + + mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/csrf/source/medium.php b/dvwa/vulnerabilities/csrf/source/medium.php new file mode 100644 index 0000000..b0b1c3d --- /dev/null +++ b/dvwa/vulnerabilities/csrf/source/medium.php @@ -0,0 +1,36 @@ +' . mysql_error() . '' ); + + // Feedback for the user + $html .= "
    Password Changed.
    "; + } + else { + // Issue with passwords matching + $html .= "
    Passwords did not match.
    "; + } + } + else { + // Didn't come from a trusted source + $html .= "
    That request didn't look correct.
    "; + } + + mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/exec/help/help.php b/dvwa/vulnerabilities/exec/help/help.php new file mode 100644 index 0000000..55d60fc --- /dev/null +++ b/dvwa/vulnerabilities/exec/help/help.php @@ -0,0 +1,62 @@ +
    +

    Help - Command Injection

    + +
    + + + + +
    +

    About

    +

    The purpose of the command injection attack is to inject and execute commands specified by the attacker in the vulnerable application. + In situation like this, the application, which executes unwanted system commands, is like a pseudo system shell, and the attacker may use it + as any authorized system user. However, commands are executed with the same privileges and environment as the web service has.

    + +

    Command injection attacks are possible in most cases because of lack of correct input data validation, which can be manipulated by the attacker + (forms, cookies, HTTP headers etc.).

    + +

    The syntax and commands may differ between the Operating Systems (OS), such as Linux and Windows, depending on their desired actions.

    + +

    This attack may also be called "Remote Command Execution (RCE)".

    + +


    + +

    Objective

    +

    Remotely, find out the user of the web service on the OS, as well as the machines hostname via RCE.

    + +


    + +

    Low Level

    +

    This allows for direct input into one of many PHP functions that will execute commands on the OS. It is possible to escape out of the designed command and + executed unintentional actions.

    +

    This can be done by adding on to the request, "once the command has executed successfully, run this command". +

    Spoiler: To add a command "&&". Example: 127.0.0.1 && dir.
    + +
    + +

    Medium Level

    +

    The developer has read up on some of the issues with command injection, and placed in various pattern patching to filter the input. However, this isn't enough.

    +

    Various other system syntaxes can be used to break out of the desired command.

    +
    Spoiler: e.g. background the ping command.
    + +
    + +

    High Level

    +

    In the high level, the developer goes back to the drawing board and puts in even more pattern to match. But even this isn't enough.

    +

    The developer has either made a slight typo with the filters and believes a certain PHP command will save them from this mistake.

    +
    Spoiler: 
    +			removes all leading & trailing spaces, right?.
    + +
    + +

    Impossible Level

    +

    In the impossible level, the challenge has been re-written, only to allow a very stricted input. If this doesn't match and doesn't produce a certain result, + it will not be allowed to execute. Rather than "black listing" filtering (allowing any input and removing unwanted), this uses "white listing" (only allow certain values).

    +
    + +
    + +
    + +

    Reference:

    +
    diff --git a/dvwa/vulnerabilities/exec/index.php b/dvwa/vulnerabilities/exec/index.php new file mode 100644 index 0000000..4297a81 --- /dev/null +++ b/dvwa/vulnerabilities/exec/index.php @@ -0,0 +1,67 @@ + +

    Vulnerability: Command Injection

    + +
    +

    Ping a device

    + +
    +

    + Enter an IP address: + + +

    \n"; + +if( $vulnerabilityFile == 'impossible.php' ) + $page[ 'body' ] .= " " . tokenField(); + +$page[ 'body' ] .= " +
    + {$html} +
    + +

    More Information

    +
      +
    • " . dvwaExternalLinkUrlGet( 'http://www.scribd.com/doc/2530476/Php-Endangers-Remote-Code-Execution' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://www.ss64.com/bash/' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://www.ss64.com/nt/' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Command_Injection' ) . "
    • +
    +
    \n"; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/exec/source/high.php b/dvwa/vulnerabilities/exec/source/high.php new file mode 100644 index 0000000..2f4a5a7 --- /dev/null +++ b/dvwa/vulnerabilities/exec/source/high.php @@ -0,0 +1,37 @@ + '', + ';' => '', + '| ' => '', + '-' => '', + '$' => '', + '(' => '', + ')' => '', + '`' => '', + '||' => '', + ); + + // Remove any of the charactars in the array (blacklist). + $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); + + // Determine OS and execute the ping command. + if( stristr( php_uname( 's' ), 'Windows NT' ) ) { + // Windows + $cmd = shell_exec( 'ping ' . $target ); + } + else { + // *nix + $cmd = shell_exec( 'ping -c 4 ' . $target ); + } + + // Feedback for the end user + $html .= "
    {$cmd}
    "; +} + +?> diff --git a/dvwa/vulnerabilities/exec/source/impossible.php b/dvwa/vulnerabilities/exec/source/impossible.php new file mode 100644 index 0000000..a2d405e --- /dev/null +++ b/dvwa/vulnerabilities/exec/source/impossible.php @@ -0,0 +1,41 @@ +{$cmd}"; + } + else { + // Ops. Let the user name theres a mistake + $html .= '
    ERROR: You have entered an invalid IP.
    '; + } +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/exec/source/low.php b/dvwa/vulnerabilities/exec/source/low.php new file mode 100644 index 0000000..121362f --- /dev/null +++ b/dvwa/vulnerabilities/exec/source/low.php @@ -0,0 +1,21 @@ +{$cmd}"; +} + +?> diff --git a/dvwa/vulnerabilities/exec/source/medium.php b/dvwa/vulnerabilities/exec/source/medium.php new file mode 100644 index 0000000..99da211 --- /dev/null +++ b/dvwa/vulnerabilities/exec/source/medium.php @@ -0,0 +1,30 @@ + '', + ';' => '', + ); + + // Remove any of the charactars in the array (blacklist). + $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); + + // Determine OS and execute the ping command. + if( stristr( php_uname( 's' ), 'Windows NT' ) ) { + // Windows + $cmd = shell_exec( 'ping ' . $target ); + } + else { + // *nix + $cmd = shell_exec( 'ping -c 4 ' . $target ); + } + + // Feedback for the end user + $html .= "
    {$cmd}
    "; +} + +?> diff --git a/dvwa/vulnerabilities/fi/file1.php b/dvwa/vulnerabilities/fi/file1.php new file mode 100644 index 0000000..7514461 --- /dev/null +++ b/dvwa/vulnerabilities/fi/file1.php @@ -0,0 +1,21 @@ + +

    Vulnerability: File Inclusion

    +
    +

    File 1

    +
    + Hello " . dvwaCurrentUser() . "
    + Your IP address is: {$_SERVER[ 'REMOTE_ADDR' ]}

    + [back] +
    + +

    More info

    +
      +
    • " . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/Remote_File_Inclusion' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Top_10_2007-A3' ) . "
    • +
    +
    \n"; + +?> diff --git a/dvwa/vulnerabilities/fi/file2.php b/dvwa/vulnerabilities/fi/file2.php new file mode 100644 index 0000000..cfa47ab --- /dev/null +++ b/dvwa/vulnerabilities/fi/file2.php @@ -0,0 +1,19 @@ + +

    Vulnerability: File Inclusion

    +
    +

    File 2

    +
    + \"I needed a password eight characters long so I picked Snow White and the Seven Dwarves.\" ~ Nick Helm

    + [back]
    + +

    More info

    +
      +
    • " . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/Remote_File_Inclusion' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Top_10_2007-A3' ) . "
    • +
    +
    \n"; + +?> diff --git a/dvwa/vulnerabilities/fi/file3.php b/dvwa/vulnerabilities/fi/file3.php new file mode 100644 index 0000000..401bcb6 --- /dev/null +++ b/dvwa/vulnerabilities/fi/file3.php @@ -0,0 +1,29 @@ + +

    Vulnerability: File Inclusion

    +
    +

    File 3

    +
    + Welcome back " . dvwaCurrentUser() . "
    + Your IP address is: "; +if( array_key_exists( 'HTTP_X_FORWARDED_FOR', $_SERVER )) + $page[ 'body' ] .= $_SERVER[ 'HTTP_X_FORWARDED_FOR' ]; +else + $page[ 'body' ] .= "**Missing Header**"; +$page[ 'body' ] .= "
    + Your user-agent address is: {$_SERVER[ 'HTTP_USER_AGENT' ]}
    + You came form: {$_SERVER[ 'HTTP_REFERER' ]}
    + I'm hosted at: {$_SERVER[ 'HTTP_HOST' ]}

    + [back] +
    + +

    More info

    +
      +
    • " . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/Remote_File_Inclusion' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Top_10_2007-A3' ) . "
    • +
    +
    \n"; + +?> diff --git a/dvwa/vulnerabilities/fi/file4.php b/dvwa/vulnerabilities/fi/file4.php new file mode 100644 index 0000000..da7012e --- /dev/null +++ b/dvwa/vulnerabilities/fi/file4.php @@ -0,0 +1,14 @@ + +

    Vulnerability: File Inclusion

    +
    +

    File 4 (Hidden)

    +
    + Good job!
    + This file isn't listed at all on DVWA. If you are reading this, you did something right ;-)
    + +
    \n"; + +?> diff --git a/dvwa/vulnerabilities/fi/help/help.php b/dvwa/vulnerabilities/fi/help/help.php new file mode 100644 index 0000000..997577e --- /dev/null +++ b/dvwa/vulnerabilities/fi/help/help.php @@ -0,0 +1,63 @@ +
    +

    Help - File Inclusion

    + +
    + + + + +
    +

    About

    +

    Some web applications allow the user to specify input that is used directly into file streams or allows the user to upload files to the server. + At a later time the web application accesses the user supplied input in the web applications context. By doing this, the web application is allowing + the potential for malicious file execution.

    + +

    If the file chosen to be included is local on the target machine, it is called "Local File Inclusion (LFI). But files may also be included on other + machines, which then the attack is a "Remote File Inclusion (RFI).

    + +

    When RFI is not an option. using another vulnerability with LFI (such as file upload and directory traversal) can often achieve the same effect.

    + +

    Note, the term "file inclusion" is not the same as "arbitrary file access" or "file disclosure".

    + +


    + +

    Objective

    +

    Read all five famous quotes from '../hackable/flags/fi.php' using only the file inclusion.

    + +


    + +

    Low Level

    +

    This allows for direct input into one of many PHP functions that will include the content when executing.

    + +

    Depending on the web service configuration will depend if RFI is a possibility.

    +
    Spoiler: LFI: ?page=../../../../../../etc/passwd.
    +			Spoiler: RFI: ?page=http://www.evilsite.com/evil.php.
    + +
    + +

    Medium Level

    +

    The developer has read up on some of the issues with LFI/RFI, and decided to filter the input. However, the patterns that are used, isn't enough.

    +
    Spoiler: LFI: Possible, due to it only cycling through the pattern matching once.
    +			Spoiler: RFI: .
    + +
    + +

    High Level

    +

    The developer has had enough. They decided to only allow certain files to be used. However as there are multiple files with the same basename, + they use a wildcard to include them all.

    +
    Spoiler: LFI: The filename only has start with a certain value..
    +			Spoiler: RFI: Need to link in another vulnerability, such as file upload.
    + +
    + +

    Impossible Level

    +

    The developer calls it quits and hardcodes only the allowed pages, with there exact filenames. By doing this, it removes all avenues of attack.

    +
    + +
    + +
    + +

    Reference:

    + +
    diff --git a/dvwa/vulnerabilities/fi/include.php b/dvwa/vulnerabilities/fi/include.php new file mode 100644 index 0000000..45d1a4c --- /dev/null +++ b/dvwa/vulnerabilities/fi/include.php @@ -0,0 +1,30 @@ +The PHP function allow_url_include is not enabled.
    "; +} +if( !ini_get( 'allow_url_fopen' ) ) { + $WarningHtml .= "
    The PHP function allow_url_fopen is not enabled.
    "; +} + + +$page[ 'body' ] .= " +
    +

    Vulnerability: File Inclusion

    + + {$WarningHtml} + +
    + [file1.php] - [file2.php] - [file3.php] +
    + +

    More Information

    +
      +
    • " . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/Remote_File_Inclusion' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Top_10_2007-A3' ) . "
    • +
    +
    \n"; + +?> diff --git a/dvwa/vulnerabilities/fi/index.php b/dvwa/vulnerabilities/fi/index.php new file mode 100644 index 0000000..20a0c91 --- /dev/null +++ b/dvwa/vulnerabilities/fi/index.php @@ -0,0 +1,44 @@ + diff --git a/dvwa/vulnerabilities/fi/source/high.php b/dvwa/vulnerabilities/fi/source/high.php new file mode 100644 index 0000000..839d15a --- /dev/null +++ b/dvwa/vulnerabilities/fi/source/high.php @@ -0,0 +1,13 @@ + diff --git a/dvwa/vulnerabilities/fi/source/impossible.php b/dvwa/vulnerabilities/fi/source/impossible.php new file mode 100644 index 0000000..2d62dd5 --- /dev/null +++ b/dvwa/vulnerabilities/fi/source/impossible.php @@ -0,0 +1,13 @@ + diff --git a/dvwa/vulnerabilities/fi/source/low.php b/dvwa/vulnerabilities/fi/source/low.php new file mode 100644 index 0000000..a6c0aca --- /dev/null +++ b/dvwa/vulnerabilities/fi/source/low.php @@ -0,0 +1,6 @@ + diff --git a/dvwa/vulnerabilities/fi/source/medium.php b/dvwa/vulnerabilities/fi/source/medium.php new file mode 100644 index 0000000..679bc45 --- /dev/null +++ b/dvwa/vulnerabilities/fi/source/medium.php @@ -0,0 +1,10 @@ + diff --git a/dvwa/vulnerabilities/sqli/help/help.php b/dvwa/vulnerabilities/sqli/help/help.php new file mode 100644 index 0000000..065404e --- /dev/null +++ b/dvwa/vulnerabilities/sqli/help/help.php @@ -0,0 +1,60 @@ +
    +

    Help - SQL Injection

    + +
    + + + + +
    +

    About

    +

    A SQL injection attack consists of insertion or "injection" of a SQL query via the input data from the client to the application. + A successful SQL injection exploit can read sensitive data from the database, modify database data (insert/update/delete), execute administration operations on the database + (such as shutdown the DBMS), recover the content of a given file present on the DBMS file system (load_file) and in some cases issue commands to the operating system.

    + +

    SQL injection attacks are a type of injection attack, in which SQL commands are injected into data-plane input in order to effect the execution of predefined SQL commands.

    + +

    This attack may also be called "SQLi".

    + +


    + +

    Objective

    +

    There are 5 users in the database, with id's from 1 to 5. Your mission... to steal their passwords via SQLi.

    + +


    + +

    Low Level

    +

    The SQL query uses RAW input that is directly controlled by the attacker. All they need to-do is escape the query and then they are able + to execute any SQL query they wish.

    +
    Spoiler: ?id=a' UNION SELECT "text1","text2";-- -&Submit=Submit.
    + +
    + +

    Medium Level

    +

    The medium level uses a form of SQL injection protection, with the function of + "". + However due to the SQL query not having quotes around the parameter, this will not fully protect the query from being altered.

    + +

    The text box has been replaced with a pre-defined dropdown list and uses POST to submit the form.

    +
    Spoiler: ?id=a UNION SELECT 1,2;-- -&Submit=Submit.
    + +
    + +

    High Level

    +

    This is very similar to the low level, however this time the attacker is inputting the value in a different manner. + The input values are being transferred to the vulnerable query via session variables using another page, rather than a direct GET request.

    +
    Spoiler: ID: a' UNION SELECT "text1","text2";-- -&Submit=Submit.
    + +
    + +

    Impossible Level

    +

    The queries are now parameterized queries (rather than being dynamic). This means the query has been defined by the developer, + and has distinguish which sections are code, and the rest is data.

    +
    + +
    + +
    + +

    Reference:

    +
    diff --git a/dvwa/vulnerabilities/sqli/index.php b/dvwa/vulnerabilities/sqli/index.php new file mode 100644 index 0000000..5837b1b --- /dev/null +++ b/dvwa/vulnerabilities/sqli/index.php @@ -0,0 +1,99 @@ +The PHP function \"Magic Quotes\" is enabled.
    "; +} +// Is PHP function safe_mode enabled? +if( ini_get( 'safe_mode' ) == true ) { + $WarningHtml .= "
    The PHP function \"Safe mode\" is enabled.
    "; +} + +$page[ 'body' ] .= " +
    +

    Vulnerability: SQL Injection

    + + {$WarningHtml} + +
    "; +if( $vulnerabilityFile == 'high.php' ) { + $page[ 'body' ] .= "Click here to change your ID."; +} +else { + $page[ 'body' ] .= " +
    +

    + User ID:"; + if( $vulnerabilityFile == 'medium.php' ) { + $page[ 'body' ] .= "\n "; + } + else + $page[ 'body' ] .= "\n "; + + $page[ 'body' ] .= "\n +

    \n"; + + if( $vulnerabilityFile == 'impossible.php' ) + $page[ 'body' ] .= " " . tokenField(); + + $page[ 'body' ] .= " +
    "; +} +$page[ 'body' ] .= " + {$html} +
    + +

    More Information

    +
      +
    • " . dvwaExternalLinkUrlGet( 'http://www.securiteam.com/securityreviews/5DP0N1P76E.html' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/SQL_injection' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/SQL_Injection' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://bobby-tables.com/' ) . "
    • +
    +
    \n"; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/sqli/session-input.php b/dvwa/vulnerabilities/sqli/session-input.php new file mode 100644 index 0000000..f11436b --- /dev/null +++ b/dvwa/vulnerabilities/sqli/session-input.php @@ -0,0 +1,32 @@ +

    "; + $page[ 'body' ] .= "Session ID: {$_SESSION[ 'id' ]}


    "; + $page[ 'body' ] .= ""; +} + +$page[ 'body' ] .= " +
    + + +
    +
    +
    + +"; + +dvwaSourceHtmlEcho( $page ); + +?> + + diff --git a/dvwa/vulnerabilities/sqli/source/high.php b/dvwa/vulnerabilities/sqli/source/high.php new file mode 100644 index 0000000..092c9b4 --- /dev/null +++ b/dvwa/vulnerabilities/sqli/source/high.php @@ -0,0 +1,29 @@ +Something went wrong.' ); + + // Get results + $num = mysql_numrows( $result ); + $i = 0; + while( $i < $num ) { + // Get values + $first = mysql_result( $result, $i, "first_name" ); + $last = mysql_result( $result, $i, "last_name" ); + + // Feedback for end user + $html .= "
    ID: {$id}
    First name: {$first}
    Surname: {$last}
    "; + + // Increase loop count + $i++; + } + + mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/sqli/source/impossible.php b/dvwa/vulnerabilities/sqli/source/impossible.php new file mode 100644 index 0000000..41e57c1 --- /dev/null +++ b/dvwa/vulnerabilities/sqli/source/impossible.php @@ -0,0 +1,33 @@ +prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' ); + $data->bindParam( ':id', $id, PDO::PARAM_INT ); + $data->execute(); + $row = $data->fetch(); + + // Make sure only 1 result is returned + if( $data->rowCount() == 1 ) { + // Get values + $first = $row[ 'first_name' ]; + $last = $row[ 'last_name' ]; + + // Feedback for end user + $html .= "
    ID: {$id}
    First name: {$first}
    Surname: {$last}
    "; + } + } +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/sqli/source/low.php b/dvwa/vulnerabilities/sqli/source/low.php new file mode 100644 index 0000000..4094cec --- /dev/null +++ b/dvwa/vulnerabilities/sqli/source/low.php @@ -0,0 +1,29 @@ +' . mysql_error() . '' ); + + // Get results + $num = mysql_numrows( $result ); + $i = 0; + while( $i < $num ) { + // Get values + $first = mysql_result( $result, $i, "first_name" ); + $last = mysql_result( $result, $i, "last_name" ); + + // Feedback for end user + $html .= "
    ID: {$id}
    First name: {$first}
    Surname: {$last}
    "; + + // Increase loop count + $i++; + } + + mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/sqli/source/medium.php b/dvwa/vulnerabilities/sqli/source/medium.php new file mode 100644 index 0000000..2ef9eef --- /dev/null +++ b/dvwa/vulnerabilities/sqli/source/medium.php @@ -0,0 +1,30 @@ +' . mysql_error() . '' ); + + // Get results + $num = mysql_numrows( $result ); + $i = 0; + while( $i < $num ) { + // Display values + $first = mysql_result( $result, $i, "first_name" ); + $last = mysql_result( $result, $i, "last_name" ); + + // Feedback for end user + $html .= "
    ID: {$id}
    First name: {$first}
    Surname: {$last}
    "; + + // Increase loop count + $i++; + } + + //mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/sqli_blind/cookie-input.php b/dvwa/vulnerabilities/sqli_blind/cookie-input.php new file mode 100644 index 0000000..5e31aa2 --- /dev/null +++ b/dvwa/vulnerabilities/sqli_blind/cookie-input.php @@ -0,0 +1,31 @@ +

    "; + $page[ 'body' ] .= ""; +} + +$page[ 'body' ] .= " +
    + + +
    +
    +
    + +"; + +dvwaSourceHtmlEcho( $page ); + +?> + + diff --git a/dvwa/vulnerabilities/sqli_blind/help/help.php b/dvwa/vulnerabilities/sqli_blind/help/help.php new file mode 100644 index 0000000..dcc645d --- /dev/null +++ b/dvwa/vulnerabilities/sqli_blind/help/help.php @@ -0,0 +1,62 @@ +
    +

    Help - SQL Injection (Blind)

    + +
    + + + + +
    +

    About

    +

    When an attacker executes SQL injection attacks, sometimes the server responds with error messages from the database server complaining that the SQL query's syntax is incorrect. + Blind SQL injection is identical to normal SQL Injection except that when an attacker attempts to exploit an application, rather then getting a useful error message, + they get a generic page specified by the developer instead. This makes exploiting a potential SQL Injection attack more difficult but not impossible. + An attacker can still steal data by asking a series of True and False questions through SQL statements, and monitoring how the web application response + (valid entry retunred or 404 header set).

    + +

    "time based" injection method is often used when there is no visible feedback in how the page different in its response (hence its a blind attack). + This means the attacker will wait to see how long the page takes to response back. If it takes longer than normal, their query was successful.

    + +


    + +

    Objective

    +

    Find the version of the SQL database software through a blind SQL attack.

    + +


    + +

    Low Level

    +

    The SQL query uses RAW input that is directly controlled by the attacker. All they need to-do is escape the query and then they are able + to execute any SQL query they wish.

    +
    Spoiler: ?id=1' AND sleep 5&Submit=Submit.
    + +
    + +

    Medium Level

    +

    The medium level uses a form of SQL injection protection, with the function of + "". + However due to the SQL query not having quotes around the parameter, this will not fully protect the query from being altered.

    + +

    The text box has been replaced with a pre-defined dropdown list and uses POST to submit the form.

    +
    Spoiler: ?id=1 AND sleep 3&Submit=Submit.
    + +
    + +

    High Level

    +

    This is very similar to the low level, however this time the attacker is inputting the value in a different manner. + The input values are being set on a different page, rather than a GET request.

    +
    Spoiler: ID: 1' AND sleep 10&Submit=Submit.
    +			Spoiler: Should be able to cut out the middle man..
    + +
    + +

    Impossible Level

    +

    The queries are now parameterized queries (rather than being dynamic). This means the query has been defined by the developer, + and has distinguish which sections are code, and the rest is data.

    +
    + +
    + +
    + +

    Reference:

    +
    diff --git a/dvwa/vulnerabilities/sqli_blind/index.php b/dvwa/vulnerabilities/sqli_blind/index.php new file mode 100644 index 0000000..ad5dff9 --- /dev/null +++ b/dvwa/vulnerabilities/sqli_blind/index.php @@ -0,0 +1,99 @@ +The PHP function \"Magic Quotes\" is enabled.
    "; +} +// Is PHP function safe_mode enabled? +if( ini_get( 'safe_mode' ) == true ) { + $WarningHtml .= "
    The PHP function \"Safe mode\" is enabled.
    "; +} + +$page[ 'body' ] .= " +
    +

    Vulnerability: SQL Injection (Blind)

    + + {$WarningHtml} + +
    "; +if( $vulnerabilityFile == 'high.php' ) { + $page[ 'body' ] .= "Click here to change your ID."; +} +else { + $page[ 'body' ] .= " +
    +

    + User ID:"; + if( $vulnerabilityFile == 'medium.php' ) { + $page[ 'body' ] .= "\n "; + } + else + $page[ 'body' ] .= "\n "; + + $page[ 'body' ] .= "\n +

    \n"; + + if( $vulnerabilityFile == 'impossible.php' ) + $page[ 'body' ] .= " " . tokenField(); + + $page[ 'body' ] .= " +
    "; +} +$page[ 'body' ] .= " + {$html} +
    + +

    More Information

    +
      +
    • " . dvwaExternalLinkUrlGet( 'http://www.securiteam.com/securityreviews/5DP0N1P76E.html' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/SQL_injection' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://pentestmonkey.net/cheat-sheet/sql-injection/mysql-sql-injection-cheat-sheet' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Blind_SQL_Injection' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://bobby-tables.com/' ) . "
    • +
    +
    \n"; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/sqli_blind/source/high.php b/dvwa/vulnerabilities/sqli_blind/source/high.php new file mode 100644 index 0000000..ce25901 --- /dev/null +++ b/dvwa/vulnerabilities/sqli_blind/source/high.php @@ -0,0 +1,33 @@ + 0 ) { + // Feedback for end user + $html .= '
    User ID exists in the database.
    '; + } + else { + // Might sleep a random amount + if( rand( 0, 5 ) == 3 ) { + sleep( rand( 2, 4 ) ); + } + + // User wasn't found, so the page wasn't! + header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' ); + + // Feedback for end user + $html .= '
    User ID is MISSING from the database.
    '; + } + + mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/sqli_blind/source/impossible.php b/dvwa/vulnerabilities/sqli_blind/source/impossible.php new file mode 100644 index 0000000..25cb7cf --- /dev/null +++ b/dvwa/vulnerabilities/sqli_blind/source/impossible.php @@ -0,0 +1,35 @@ +prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' ); + $data->bindParam( ':id', $id, PDO::PARAM_INT ); + $data->execute(); + + // Get results + if( $data->rowCount() == 1 ) { + // Feedback for end user + $html .= '
    User ID exists in the database.
    '; + } + else { + // User wasn't found, so the page wasn't! + header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' ); + + // Feedback for end user + $html .= '
    User ID is MISSING from the database.
    '; + } + } +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/sqli_blind/source/low.php b/dvwa/vulnerabilities/sqli_blind/source/low.php new file mode 100644 index 0000000..b73eecc --- /dev/null +++ b/dvwa/vulnerabilities/sqli_blind/source/low.php @@ -0,0 +1,28 @@ + 0 ) { + // Feedback for end user + $html .= '
    User ID exists in the database.
    '; + } + else { + // User wasn't found, so the page wasn't! + header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' ); + + // Feedback for end user + $html .= '
    User ID is MISSING from the database.
    '; + } + + mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/sqli_blind/source/medium.php b/dvwa/vulnerabilities/sqli_blind/source/medium.php new file mode 100644 index 0000000..9d77fa6 --- /dev/null +++ b/dvwa/vulnerabilities/sqli_blind/source/medium.php @@ -0,0 +1,26 @@ + 0 ) { + // Feedback for end user + $html .= '
    User ID exists in the database.
    '; + } + else { + // Feedback for end user + $html .= '
    User ID is MISSING from the database.
    '; + } + + //mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/upload/help/help.php b/dvwa/vulnerabilities/upload/help/help.php new file mode 100644 index 0000000..c4aee98 --- /dev/null +++ b/dvwa/vulnerabilities/upload/help/help.php @@ -0,0 +1,54 @@ +
    +

    Help - File Upload

    + +
    + + + + +
    +

    About

    +

    Uploaded files represent a significant risk to web applications. The first step in many attacks is to get some code to the system to be attacked. + Then the attacker only needs to find a way to get the code executed. Using a file upload helps the attacker accomplish the first step.

    + +

    The consequences of unrestricted file upload can vary, including complete system takeover, an overloaded file system, forwarding attacks to backend systems, + and simple defacement. It depends on what the application does with the uploaded file, including where it is stored.

    + +


    + +

    Objective

    +

    Execute any PHP function of your choosing on the target system (such as + or ) thanks to this file upload vulnerability.

    + +


    + +

    Low Level

    +

    Low level will not check the contents of the file being uploaded in any way. It relies only on trust.

    +
    Spoiler: Upload any valid PHP file with command in it.
    + +
    + +

    Medium Level

    +

    When using the medium level, it will check the reported file type from the client when its being uploaded.

    +
    Spoiler: Worth looking for any restrictions within any "hidden" form fields.
    + +
    + +

    High Level

    +

    Once the file has been received from the client, the server will try to resize any image that was included in the request.

    +
    Spoiler: need to link in another vulnerability, such as file includion.
    + +
    + +

    Impossible Level

    +

    This will check everything from all the levels so far, as well then to re-encode the image. This will make a new image, therefor stripping + any "non-image" code (including metadata).

    +
    + +
    + +
    + +

    Reference:

    +
    + diff --git a/dvwa/vulnerabilities/upload/index.php b/dvwa/vulnerabilities/upload/index.php new file mode 100644 index 0000000..442a7b0 --- /dev/null +++ b/dvwa/vulnerabilities/upload/index.php @@ -0,0 +1,76 @@ +Incorrect folder permissions: " . realpath( dirname( dirname( getcwd() ) ) ) . "/hackable/uploads/" . "
    Folder is not writable.
    "; +} +// Is PHP-GD installed? +if( ( !extension_loaded( 'gd' ) || !function_exists( 'gd_info' ) ) ) { + $WarningHtml .= "
    The PHP module PHP-GD is not installed.
    "; +} + +$page[ 'body' ] .= " +
    +

    Vulnerability: File Upload

    + + {$WarningHtml} + +
    +
    + + Choose an image to upload:

    +
    +
    + \n"; + +if( $vulnerabilityFile == 'impossible.php' ) + $page[ 'body' ] .= " " . tokenField(); + +$page[ 'body' ] .= " +
    + {$html} +
    + +

    More Information

    +
      +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Unrestricted_File_Upload' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://blogs.securiteam.com/index.php/archives/1268' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://www.acunetix.com/websitesecurity/upload-forms-threat/' ) . "
    • +
    +
    "; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/upload/source/high.php b/dvwa/vulnerabilities/upload/source/high.php new file mode 100644 index 0000000..65376a3 --- /dev/null +++ b/dvwa/vulnerabilities/upload/source/high.php @@ -0,0 +1,35 @@ +Your image was not uploaded.'; + } + else { + // Yes! + $html .= "
    {$target_path} succesfully uploaded!
    "; + } + } + else { + // Invalid file + $html .= '
    Your image was not uploaded. We can only accept JPEG or PNG images.
    '; + } +} + +?> diff --git a/dvwa/vulnerabilities/upload/source/impossible.php b/dvwa/vulnerabilities/upload/source/impossible.php new file mode 100644 index 0000000..bea2037 --- /dev/null +++ b/dvwa/vulnerabilities/upload/source/impossible.php @@ -0,0 +1,62 @@ +${target_file} succesfully uploaded!"; + } + else { + // No + $html .= '
    Your image was not uploaded.
    '; + } + + // Delete any temp files + if( file_exists( $temp_file ) ) + unlink( $temp_file ); + } + else { + // Invalid file + $html .= '
    Your image was not uploaded. We can only accept JPEG or PNG images.
    '; + } +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/upload/source/low.php b/dvwa/vulnerabilities/upload/source/low.php new file mode 100644 index 0000000..904403b --- /dev/null +++ b/dvwa/vulnerabilities/upload/source/low.php @@ -0,0 +1,19 @@ +Your image was not uploaded.'; + } + else { + // Yes! + $html .= "
    {$target_path} succesfully uploaded!
    "; + } +} + +?> diff --git a/dvwa/vulnerabilities/upload/source/medium.php b/dvwa/vulnerabilities/upload/source/medium.php new file mode 100644 index 0000000..66f3bc8 --- /dev/null +++ b/dvwa/vulnerabilities/upload/source/medium.php @@ -0,0 +1,33 @@ +Your image was not uploaded.'; + } + else { + // Yes! + $html .= "
    {$target_path} succesfully uploaded!
    "; + } + } + else { + // Invalid file + $html .= '
    Your image was not uploaded. We can only accept JPEG or PNG images.
    '; + } +} + +?> diff --git a/dvwa/vulnerabilities/view_help.php b/dvwa/vulnerabilities/view_help.php new file mode 100644 index 0000000..2a6e141 --- /dev/null +++ b/dvwa/vulnerabilities/view_help.php @@ -0,0 +1,26 @@ +' . file_get_contents( DVWA_WEB_PAGE_TO_ROOT . "vulnerabilities/{$id}/help/help.php" ) . ' + {$help} +
    \n"; + +dvwaHelpHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/view_source.php b/dvwa/vulnerabilities/view_source.php new file mode 100644 index 0000000..aea076a --- /dev/null +++ b/dvwa/vulnerabilities/view_source.php @@ -0,0 +1,69 @@ + +

    {$vuln} Source

    + +
    + + + + +
    " . highlight_string( $source, true ) . "
    +
    +

    + +
    + +
    +
    \n"; + +dvwaSourceHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/view_source_all.php b/dvwa/vulnerabilities/view_source_all.php new file mode 100644 index 0000000..9ce2484 --- /dev/null +++ b/dvwa/vulnerabilities/view_source_all.php @@ -0,0 +1,102 @@ + +

    {$vuln}

    +
    + +

    Impossible {$vuln} Source

    + + + + +
    {$impsrc}
    +
    + +

    High {$vuln} Source

    + + + + +
    {$highsrc}
    +
    + +

    Medium {$vuln} Source

    + + + + +
    {$medsrc}
    +
    + +

    Low {$vuln} Source

    + + + + +
    {$lowsrc}
    +

    + +
    + +
    + +
    \n"; + +dvwaSourceHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/xss_r/help/help.php b/dvwa/vulnerabilities/xss_r/help/help.php new file mode 100644 index 0000000..ffb3840 --- /dev/null +++ b/dvwa/vulnerabilities/xss_r/help/help.php @@ -0,0 +1,57 @@ +
    +

    Help - Cross Site Scripting (Reflected)

    + +
    + + + + +
    +

    About

    +

    "Cross-Site Scripting (XSS)" attacks are a type of injection problem, in which malicious scripts are injected into the otherwise benign and trusted web sites. + XSS attacks occur when an attacker uses a web application to send malicious code, generally in the form of a browser side script, + to a different end user. Flaws that allow these attacks to succeed are quite widespread and occur anywhere a web application using input from a user in the output, + without validating or encoding it.

    + +

    An attacker can use XSS to send a malicious script to an unsuspecting user. The end user's browser has no way to know that the script should not be trusted, + and will execute the JavaScript. Because it thinks the script came from a trusted source, the malicious script can access any cookies, session tokens, or other + sensitive information retained by your browser and used with that site. These scripts can even rewrite the content of the HTML page.

    + +

    Because its a reflected XSS, the malicious code is not stored in the remote web application, so requires some social engineering (such as a link via email/chat).

    + +


    + +

    Objective

    +

    One way or another, steal the cookie of a logged in user.

    + +


    + +

    Low Level

    +

    Low level will not check the requested input, before including it to be used in the output text.

    +
    Spoiler: ?name=<script>alert("XSS");</script>.
    + +
    + +

    Medium Level

    +

    The developer has tried to add a simple pattern matching to remove any references to "<script>", to disable any JavaScript.

    +
    Spoiler: Its cAse sENSiTiVE.
    + +
    + +

    High Level

    +

    The developer now believes they can disable all JavaScript by removing the pattern "<s*c*r*i*p*t".

    +
    Spoiler: HTML events.
    + +
    + +

    Impossible Level

    +

    Using inbuilt PHP functions (such as ""), + its possible to escape any values which would alter the behaviour of the input.

    +
    + +
    + +
    + +

    Reference:

    +
    diff --git a/dvwa/vulnerabilities/xss_r/index.php b/dvwa/vulnerabilities/xss_r/index.php new file mode 100644 index 0000000..25686ef --- /dev/null +++ b/dvwa/vulnerabilities/xss_r/index.php @@ -0,0 +1,66 @@ + +

    Vulnerability: Reflected Cross Site Scripting (XSS)

    + +
    +
    +

    + What's your name? + + +

    \n"; + +if( $vulnerabilityFile == 'impossible.php' ) + $page[ 'body' ] .= " " . tokenField(); + +$page[ 'body' ] .= " +
    + {$html} +
    + +

    More Information

    +
      +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/Cross-site_scripting' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://www.cgisecurity.com/xss-faq.html' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://www.scriptalert1.com/' ) . "
    • +
    +
    \n"; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/xss_r/source/high.php b/dvwa/vulnerabilities/xss_r/source/high.php new file mode 100644 index 0000000..be918c3 --- /dev/null +++ b/dvwa/vulnerabilities/xss_r/source/high.php @@ -0,0 +1,12 @@ +Hello ${name}"; +} + +?> diff --git a/dvwa/vulnerabilities/xss_r/source/impossible.php b/dvwa/vulnerabilities/xss_r/source/impossible.php new file mode 100644 index 0000000..2651802 --- /dev/null +++ b/dvwa/vulnerabilities/xss_r/source/impossible.php @@ -0,0 +1,18 @@ +Hello ${name}"; +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/xss_r/source/low.php b/dvwa/vulnerabilities/xss_r/source/low.php new file mode 100644 index 0000000..3c72d37 --- /dev/null +++ b/dvwa/vulnerabilities/xss_r/source/low.php @@ -0,0 +1,9 @@ +Hello ' . $_GET[ 'name' ] . ''; +} + +?> diff --git a/dvwa/vulnerabilities/xss_r/source/medium.php b/dvwa/vulnerabilities/xss_r/source/medium.php new file mode 100644 index 0000000..38bc4a9 --- /dev/null +++ b/dvwa/vulnerabilities/xss_r/source/medium.php @@ -0,0 +1,12 @@ +', '', $_GET[ 'name' ] ); + + // Feedback for end user + $html .= "
    Hello ${name}
    "; +} + +?> diff --git a/dvwa/vulnerabilities/xss_s/help/help.php b/dvwa/vulnerabilities/xss_s/help/help.php new file mode 100644 index 0000000..339a949 --- /dev/null +++ b/dvwa/vulnerabilities/xss_s/help/help.php @@ -0,0 +1,56 @@ +
    +

    Help - Cross Site Scripting (Stored)

    + +
    + + + + +
    +

    "Cross-Site Scripting (XSS)" attacks are a type of injection problem, in which malicious scripts are injected into the otherwise benign and trusted web sites. + XSS attacks occur when an attacker uses a web application to send malicious code, generally in the form of a browser side script, + to a different end user. Flaws that allow these attacks to succeed are quite widespread and occur anywhere a web application using input from a user in the output, + without validating or encoding it.

    + +

    An attacker can use XSS to send a malicious script to an unsuspecting user. The end user's browser has no way to know that the script should not be trusted, + and will execute the JavaScript. Because it thinks the script came from a trusted source, the malicious script can access any cookies, session tokens, or other + sensitive information retained by your browser and used with that site. These scripts can even rewrite the content of the HTML page.

    + +

    The XSS is stored in the database. The XSS is permanent, until the database is reset or the payload is manually deleted.

    + +


    + +

    Objective

    +

    Redirect everyone to a web page of your choosing.

    + +


    + +

    Low Level

    +

    Low level will not check the requested input, before including it to be used in the output text.

    +
    Spoiler: Either name or message field: <script>alert("XSS");</script>.
    + +
    + +

    Medium Level

    +

    The developer had added some protection, however hasn't done every field the same way.

    +
    Spoiler: name field: <sCriPt>alert("XSS");</sCriPt>.
    + +
    + +

    High Level

    +

    The developer believe they have disabled all script usage by removing the pattern "<s*c*r*i*p*t".

    +
    Spoiler: HTML events.
    + +
    + +

    Impossible Level

    +

    Using inbuilt PHP functions (such as ""), + its possible to escape any values which would alter the behaviour of the input.

    +
    + +
    + +
    + +

    Reference:

    +
    diff --git a/dvwa/vulnerabilities/xss_s/index.php b/dvwa/vulnerabilities/xss_s/index.php new file mode 100644 index 0000000..67d50b7 --- /dev/null +++ b/dvwa/vulnerabilities/xss_s/index.php @@ -0,0 +1,79 @@ + +

    Vulnerability: Stored Cross Site Scripting (XSS)

    + +
    +
    + + + + + + + + + + + + + +
    Name *
    Message *
     
    \n"; + +if( $vulnerabilityFile == 'impossible.php' ) + $page[ 'body' ] .= " " . tokenField(); + +$page[ 'body' ] .= " +
    + {$html} +
    +
    + + " . dvwaGuestbook() . " +
    + +

    More Information

    +
      +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'https://en.wikipedia.org/wiki/Cross-site_scripting' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://www.cgisecurity.com/xss-faq.html' ) . "
    • +
    • " . dvwaExternalLinkUrlGet( 'http://www.scriptalert1.com/' ) . "
    • +
    +
    \n"; + +dvwaHtmlEcho( $page ); + +?> diff --git a/dvwa/vulnerabilities/xss_s/source/high.php b/dvwa/vulnerabilities/xss_s/source/high.php new file mode 100644 index 0000000..a66a80c --- /dev/null +++ b/dvwa/vulnerabilities/xss_s/source/high.php @@ -0,0 +1,24 @@ +' . mysql_error() . '' ); + + //mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/xss_s/source/impossible.php b/dvwa/vulnerabilities/xss_s/source/impossible.php new file mode 100644 index 0000000..3529ee7 --- /dev/null +++ b/dvwa/vulnerabilities/xss_s/source/impossible.php @@ -0,0 +1,31 @@ +prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' ); + $data->bindParam( ':message', $message, PDO::PARAM_STR ); + $data->bindParam( ':name', $name, PDO::PARAM_STR ); + $data->execute(); +} + +// Generate Anti-CSRF token +generateSessionToken(); + +?> diff --git a/dvwa/vulnerabilities/xss_s/source/low.php b/dvwa/vulnerabilities/xss_s/source/low.php new file mode 100644 index 0000000..fbb2dbc --- /dev/null +++ b/dvwa/vulnerabilities/xss_s/source/low.php @@ -0,0 +1,22 @@ +' . mysql_error() . '' ); + + //mysql_close(); +} + +?> diff --git a/dvwa/vulnerabilities/xss_s/source/medium.php b/dvwa/vulnerabilities/xss_s/source/medium.php new file mode 100644 index 0000000..f32b125 --- /dev/null +++ b/dvwa/vulnerabilities/xss_s/source/medium.php @@ -0,0 +1,24 @@ +', '', $name ); + $name = mysql_real_escape_string( $name ); + + // Update database + $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );"; + $result = mysql_query( $query ) or die( '
    ' . mysql_error() . '
    ' ); + + //mysql_close(); +} + +?>

    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 ae`Ov5PRq~Ecmc|QEhs)4n~bU~{{I8iQOall literal 0 HcmV?d00001 diff --git a/dvwa/docs/pdf.html b/dvwa/docs/pdf.html new file mode 100644 index 0000000..dae1304 --- /dev/null +++ b/dvwa/docs/pdf.html @@ -0,0 +1 @@ +Damn Vulnerable Web Application (DVWA) Official Documentation PDF v1.3 diff --git a/dvwa/dvwa/css/help.css b/dvwa/dvwa/css/help.css new file mode 100644 index 0000000..abe9ebf --- /dev/null +++ b/dvwa/dvwa/css/help.css @@ -0,0 +1,25 @@ +body { + background-color: #e7e7e7; + font-family: Arial, Helvetica, sans-serif; + font-size: 13px; +} + +h1 { + font-size: 25px; +} + +div#container { +} + +div#code { + background-color: #ffffff; +} + +div#area { + margin-left: 30px; +} + +span.spoiler { + background-color: black; + color: black; +} diff --git a/dvwa/dvwa/css/login.css b/dvwa/dvwa/css/login.css new file mode 100644 index 0000000..e4727a0 --- /dev/null +++ b/dvwa/dvwa/css/login.css @@ -0,0 +1,59 @@ +body { + background: #fefffe; + font: 12px/15px Arial, Helvetica, sans-serif; + line-height: 20px; + color: #6b6b6b; +} + +#wrapper { + text-align: center; + margin: 0 auto; +} + +#content { + display: inline-block; + padding: 20px; + width: auto; +} + +#footer { + position: absolute; + width: 100%; + height: 50px; + bottom: 0px; + left: 0px; +} + +label { + float: left; + text-align: right; + margin-right: 0.5em; + display: block; + overflow: hidden; + padding-right: 50px; + font-weight: bold; +} + +.loginInput { + float: left; + color: #6B6B6B; + width: 320px; + background-color: #F4F4F4; + border: 1px; + border-style: solid; + border-color: #c4c4c4; + padding: 6px; + margin-bottom: 12px; +} + +fieldset { + width: 350px; + padding: 10px 20px 10px 20px; + overflow: hidden; + border-style: none; +} + +p { + font-size: 10px; +} + diff --git a/dvwa/dvwa/css/main.css b/dvwa/dvwa/css/main.css new file mode 100644 index 0000000..82e6658 --- /dev/null +++ b/dvwa/dvwa/css/main.css @@ -0,0 +1,266 @@ +body { + margin: 0; + color: #2f2f2f; + font: 12px/15px Arial, Helvetica, sans-serif; + min-width: 981px; + height: 100%; + position: relative; +} + +body.home { + background: #e7e7e7; +} + +div.clear { + clear: both; +} + +a { + color: #99cc33; + text-decoration: underline; + font-weight: bold; +} + +a img { + border: 0; +} + +a: hover { + text-decoration: none; +} + +input, textarea, select { + font: 100% arial,sans-serif; + vertical-align: middle; +} + +form,fieldset { + margin: 0; + padding: 0; + border-style: none; +} + +em { + font-weight: bold; + font-style: normal; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0px; +} + +h1 { + font-size: 200%; +} + +h2 { + font-size: 160%; +} + + +h3 { + font-size: 130%; +} + +hr { + border-width: 0px; + color: #C3D9FF; + background-color: #C3D9FF; + height: 1px; +} + +ul.menuBlocks { + list-style-type: none; + padding-left: 0px; + margin-top: 0px; + margin-bottom: 0px; + margin-left: 0px; +} + +ul + ul, ul + ul.menuBlocks, ul + h1, ul + h2, ul + p { + margin-top: 20px; +} + +.fixed { + font-family: Fixed, Courier, monospace; + font-size: 13px; +} + +div.warning { + border: 2px solid #ff0000; + padding: 10px 20px 10px 20px; + color: #800000; + margin-top: 15px; + margin-bottom: 15px; +} + +div.warning h1 { + color: #ff0000; +} + +div.message { + border: 1px solid #C0C0C0; + padding: 5px; + margin: 10px 0px 10px 0px; + background-color: #f8fafa; + width: 45%; +} + +div#container { + width: 900px; + height: 100%; + margin-left: auto; + margin-right: auto; + background: #f4f4f4; + font-size: 13px; +} + +div#header { + padding: 10px; + overflow: hidden; + background: #2f2f2f; + border-bottom: 5px solid #A1CC33; + text-align: center; +} + +div#system_info { + padding: 10px; + text-align: right; +} + +div#main_body { + float: right; + width: 693px; + background: #f4f4f4; + padding-top: 20px; + padding-bottom: 10px; + font-size: 13px; +} + +div.body_padded { + padding-left: 20px; + padding-right: 20px; +} + +div#main_menu { + float: left; + width: 200px; + height: 100%; + background-color: #f4f4f4; + padding-top: 10px; + padding-bottom: 10px; +} + +div#main_menu li { + border-width: 1px; + border-style: solid; + border-color: #D2D4D4 #6B778C #6B778C #D2D4D4; + padding: 3px 5px 3px 5px; + margin-bottom: 3px; + background-color: #bebebe; +} + +div#main_menu li a { + color: #000000; + text-decoration: none; + text-decoration: none; +} + +div#main_menu li.selected { + border-color: #758DAE #758DAE #758DAE #758DAE; + background-color: #99cc33; +} + +div#main_menu li.selected a { + color: #F9F7ED; +} + +div#main_menu li: hover { + border-color: #D2D4D4; +} + +div#main_menu li: hover a { + color: #F9F7ED; +} + +div#main_menu_padded { + padding: 15px; +} + +div#footer { + color: #999999; + background: #2f2f2f; + padding: 10px; + text-align: center; + border-top: 5px solid #A1CC33; +} + +input.popup_button { + border-width: 1px; + border-style: solid; + border-color: #D2D4D4 #6B778C #6B778C #D2D4D4; + padding: 3px 5px 3px 5px; + margin-bottom: 3px; + background-color: #C3C3C3; + float: right; +} + +div.vulnerable_code_area { + background-color: #f8fafa; + border-width: 1px; + border-style: solid; + border-color: #000000; + padding: 10px 20px 10px 20px; + margin-bottom: 20px; +} + +div#guestbook_comments { + width: 45%; + background-color: #f8fafa; + border-width: 1px; + border-style: solid; + border-color: #C0C0C0; + padding: 5px 10px 5px 10px; + margin-bottom: 5px; +} + +div#idslog { + border: 1px solid #C0C0C0; + padding: 5px; + margin: 10px 0px 10px 0px; + background-color: #f8fafa; +} + +pre { + color: red; +} + +div.submenu { + border-bottom: 1px solid #000000; + margin-bottom: 15px; + padding: 4px 0px 10px 0px; + font-size: 13px; +} + +span.submenu_item { + padding: 0px 10px 0px 10px; +} + +span.submenu_item + span.submenu_item { + border-left: 1px dashed #000000; + font-size: 13px; +} + +span.selected { + font-weight: bold; +} + +span.success { + + color:green; +} + +span.failure { + color:red; + font-weight: bold; +} diff --git a/dvwa/dvwa/css/source.css b/dvwa/dvwa/css/source.css new file mode 100644 index 0000000..7d996c2 --- /dev/null +++ b/dvwa/dvwa/css/source.css @@ -0,0 +1,20 @@ +body { + background-color: #e7e7e7; + font-family: Arial, Helvetica, sans-serif; + font-size: 13px; +} + +h1 { + font-size: 25px; +} + +div#container { +} + +div#code { + background-color: #ffffff; +} + +div#area { + margin-left: 30px; +} diff --git a/dvwa/dvwa/images/RandomStorm.png b/dvwa/dvwa/images/RandomStorm.png new file mode 100644 index 0000000000000000000000000000000000000000..7328c05f53fcf16775c3761f9ea9702a9b69e878 GIT binary patch literal 4515 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%0DqN(T0^}90Z z7Cr><37utd$l^%VsK-{Lp=rG;1|zvJuKAvRh8vVRTaDy_fRKJ?{Rrtj(fAXrU{d zSTntsQyhWhl6);@jr1QSAiPY>@xmKLXYP;A+{?*^EzvV+OyYsj69Pzkpgbns0t2B6 znFes8XZTK1PiYg8vBStpvl$Fgt4Bmn)(5-%Od1cXE{`yB3ANyc^j*R*m_vdqVEkA! zAR(zBKVxeJ8rHbaIAuz;bTx3=(kH)adhh#9$nmGI*ot=~?Ze(qS+<#?)wADr1Uw#G zw)KEIDi9(kk&`4udqXc(9v+h*nFeu_NZ<;T-s7^(u+eRYk4s2PCe3AW$E627@kLwZ zgY;cjTI+WntTQNhLYTHgr{OZ0O$WcwMrsa8g2BK95~Zi-Mky7*2?glf8-5KtUk;$< zkTSA`kn?Ovq=Vi?AVVx2leJ&`JtnH4B;&JogB8Mmzxq8IeAOsA52_+W&Sc3rIho2& z+YQnj;07K9WgZdTg{clnTTg^hQCZTo-votF%P*Hlk$9T?myLLec`XMq8>tm>v-`0# zHMPNKVEqZ@ujEU%9`Yhsw{Hw-iCf|a1d2MF8+hO*Ytk^hG8s3StI36urBEZhfdjz1 z!#PtK#iCMBqwrEvR%Q}@ocPNt{aa#~b^e%&+>@n;2?l&BoN$2fOfXfXt|YdAhZBbO zr55x2cb(jio;lzhux6JF(H+bMv;s5EM@nJ~HxJUYSMPugp+icta29mJZ*nzyfK=p< z@JPt0+^*f@>f(12vVX@BAB-5MOz!A;Yl!<Al+q)I^%u?UH* zh|Q>oLJvas;qduG$Ob*fFcE;nHWq-KxOf9OGHesEfOJU78xsU)&qgs8*Bgy{`ko48 zl`!>`x!K4?WXR+)iR8$rn&7^dWZZNJX~~3AA0Wci zu@MR~w*FHVuiSBn7?KyU35o{jH!%XB5)Cpz5M2zF%@&M-IFnD{)iv*y@RssfR#7mQ zvI^O;NTHFBWw~pu|EdlmZOV4^3?l(6Lgb85rF){>+uv+pLio_fElEpwPpNrl7{y*v{VNx;43peHE8&ys|ZGkwuv2x^K#$UZ?HKj0O> zgrcU{YGQYCUJ#nLe9P&O2o?v_m!ODQV=7r0ph#KuyRIWyA~F&hP<(*B$Y$^H2Nrb)$Jy6L!f_cR9^DlS#SH=b~+{H3uZy5~cgr$Q; zrE|v2fVs<1DJp?6p+$vZ)mpYvT8p=fC2Q1*Ev>MA0D! zETgK_m7lO^PzP)*(tdCp?6bl{o13`s(?s2BLY*i&@Ss`_>q`;lvfxofgRCbYDk>=? zyueKm5`z-~poTCwKjLhaBbT*Pfxzw_08(c{DO=BMZln&TUQUh zjx^9s^bmc-*vn8M1LXVj%g~t8VrKbYzkic}@2~GR^aip--~IS~P)=t@OFvLEJ3BM? z?9usHT=&UNWACGv!2u53_O|8`pqbRLpQ~bK6tcS^kj__b+Umq0Ss=E)IrfULes@%ojunhI*#+5T500bU~RX56&*l%uJKe zU`Hl2vOS@`$PqaaxHHkfbfLHsWvQnh3OmcFf>b?DCaWw1N|Dc8~q+_Sqy@6s94~4AWXduu2=4;Q}7_{1vK3t<%}4p0WCa*N8+w$LXdF*cyw#w;qa66sAdw8KyamCt|iHsIG*7 zPT~(LQ1~zXIy8<44L}?Jgh@0J!48cfFZA9@fF`KBgU~4QMDNlhXrnn>gxt|PTLx%? r<{LsI$c=>dI#eJ5Jwb2pX5aq-d;o8GPOU;e00000NkvXXu0mjfcWq+Z literal 0 HcmV?d00001 diff --git a/dvwa/dvwa/images/login_logo.png b/dvwa/dvwa/images/login_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..11c59f464248c8eb13331277f594814cc807b631 GIT binary patch literal 9088 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 KMNUMnLSTY2vD&}@ literal 0 HcmV?d00001 diff --git a/dvwa/dvwa/images/spanner.png b/dvwa/dvwa/images/spanner.png new file mode 100644 index 0000000000000000000000000000000000000000..efafbcff668ed4ccf7413e42f6b94a5370eb99b5 GIT binary patch literal 464 zcmV;>0WbcEP)TdclTv+cPBpl^P+9;opb(pzRcWr zG7(%vbj4<~^*w(4_`20iGn+kY{ZV(fRUQu z_*F8Uu10nP`U;ds=X4Yo7cb%WW#FSg|C*x%)ikZ#_m&iT3aFD&?i7zxq*080R?~G4 zPzFiSw1?6ty1S(T^PwI*zaotS)Nz)6)Q!$h%b%&LrmMkD9k@R!dyy8S%X-z__~ae!%$W@%Rp6K~{u~Mn*<%KzH-z_=>`CXhxB3VWWm&Y{3_QhhqM& zkphwPT!T1#ON6SctLf*@pZ>M?Sp-~*5XPssZ{L!?o;`cU;49Iq-i6SUCr>D}+S}V} zM8N~dJnvB6@?18X&5k8~Rm2NDOUvBcT-}#1UrJ$`3;91rdS_E|TEXoA0000tZc1;&jXq_u^Je{73Le(6>KoY+iKO z*@2}c6?_(RqXf^Hnu2B%YBhaj`LD560fhpeOQlrM5i5RU{#4ASW|?(%v4>bqWJA@St?1jj)wkw{Q17ID|h>(}y ziGXSqy-X%UqtW1VXJ`7#)8Aro(PLwS!IerS+U+)a?&ZtNDrk$vpMo`lLAbkPaIIF0 zq1Eg9%B$~UTLKOafWc!N!r?I4Y?h&IZtCdv*VwdpV0IQ>UidoGG^tc749&8@FjVkS z%nSyPh5A_d-r=FX($uj9(G?JjK|JnHG^&GdBC3Ly0*{Please check the config file." ); + dvwaPageReload(); +} + + +// Create database +$drop_db = "DROP DATABASE IF EXISTS {$_DVWA[ 'db_database' ]};"; +if( !@mysql_query( $drop_db ) ) { + dvwaMessagePush( "Could not drop existing database
    SQL: ".mysql_error() ); + dvwaPageReload(); +} + +$create_db = "CREATE DATABASE {$_DVWA[ 'db_database' ]};"; +if( !@mysql_query( $create_db ) ) { + dvwaMessagePush( "Could not create database
    SQL: ".mysql_error() ); + dvwaPageReload(); +} +dvwaMessagePush( "Database has been created." ); + + +// Create table 'users' +if( !@mysql_select_db( $_DVWA[ 'db_database' ] ) ) { + dvwaMessagePush( 'Could not connect to database.' ); + dvwaPageReload(); +} + +$create_tb = "CREATE TABLE users (user_id int(6),first_name varchar(15),last_name varchar(15), user varchar(15), password varchar(32),avatar varchar(70), last_login TIMESTAMP, failed_login INT(3), PRIMARY KEY (user_id));"; +if( !mysql_query( $create_tb ) ) { + dvwaMessagePush( "Table could not be created
    SQL: ".mysql_error() ); + dvwaPageReload(); +} +dvwaMessagePush( "'users' table was created." ); + + +// Insert some data into users +// Get the base directory for the avatar media... +$baseUrl = 'http://'.$_SERVER[ 'SERVER_NAME' ].$_SERVER[ 'PHP_SELF' ]; +$stripPos = strpos( $baseUrl, 'setup.php' ); +$baseUrl = substr( $baseUrl, 0, $stripPos ).'hackable/users/'; + +$insert = "INSERT INTO users VALUES + ('1','admin','admin','admin',MD5('password'),'{$baseUrl}admin.jpg', NOW(), '0'), + ('2','Gordon','Brown','gordonb',MD5('abc123'),'{$baseUrl}gordonb.jpg', NOW(), '0'), + ('3','Hack','Me','1337',MD5('charley'),'{$baseUrl}1337.jpg', NOW(), '0'), + ('4','Pablo','Picasso','pablo',MD5('letmein'),'{$baseUrl}pablo.jpg', NOW(), '0'), + ('5','Bob','Smith','smithy',MD5('password'),'{$baseUrl}smithy.jpg', NOW(), '0');"; +if( !mysql_query( $insert ) ) { + dvwaMessagePush( "Data could not be inserted into 'users' table
    SQL: ".mysql_error() ); + dvwaPageReload(); +} +dvwaMessagePush( "Data inserted into 'users' table." ); + + +// Create guestbook table +$create_tb_guestbook = "CREATE TABLE guestbook (comment_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, comment varchar(300), name varchar(100), PRIMARY KEY (comment_id));"; +if( !mysql_query( $create_tb_guestbook ) ) { + dvwaMessagePush( "Table could not be created
    SQL: ".mysql_error() ); + dvwaPageReload(); +} +dvwaMessagePush( "'guestbook' table was created." ); + + +// Insert data into 'guestbook' +$insert = "INSERT INTO guestbook VALUES ('1','This is a test comment.','test');"; +if( !mysql_query( $insert ) ) { + dvwaMessagePush( "Data could not be inserted into 'guestbook' table
    SQL: ".mysql_error() ); + dvwaPageReload(); +} +dvwaMessagePush( "Data inserted into 'guestbook' table." ); + + +// Done +dvwaMessagePush( "Setup successful!" ); +if( !dvwaIsLoggedIn()) + dvwaMessagePush( "Please login." ); +dvwaPageReload(); + +?> diff --git a/dvwa/dvwa/includes/DBMS/PGSQL.php b/dvwa/dvwa/includes/DBMS/PGSQL.php new file mode 100644 index 0000000..5af7287 --- /dev/null +++ b/dvwa/dvwa/includes/DBMS/PGSQL.php @@ -0,0 +1,105 @@ +Please check the config file." ); + dvwaPageReload(); +} + +// Create database +$drop_db = "DROP DATABASE IF EXISTS {$_DVWA[ 'db_database' ]};"; + +if( !@pg_query($drop_db) ) { + dvwaMessagePush( "Could not drop existing database
    SQL: " . pg_last_error() ); + dvwaPageReload(); +} + +$create_db = "CREATE DATABASE {$_DVWA[ 'db_database' ]};"; + +if( !@pg_query ( $create_db ) ) { + dvwaMessagePush( "Could not create database
    SQL: " . pg_last_error() ); + dvwaPageReload(); +} + +dvwaMessagePush( "Database has been created." ); + + +// Connect to server AND connect to the database +$dbconn = @pg_connect("host={$_DVWA[ 'db_server' ]} port={$_DVWA[ 'db_port' ]} dbname={$_DVWA[ 'db_database' ]} user={$_DVWA[ 'db_user' ]} password={$_DVWA[ 'db_password' ]}"); + + +// Create table 'users' + +$drop_table = "DROP TABLE IF EXISTS users;"; + +if( !pg_query($drop_table) ) { + dvwaMessagePush( "Could not drop existing users table
    SQL: " . pg_last_error() ); + dvwaPageReload(); +} + +$create_tb = "CREATE TABLE users (user_id integer UNIQUE, first_name text, last_name text, username text, password text, avatar text, PRIMARY KEY (user_id));"; + +if( !pg_query( $create_tb ) ) { + dvwaMessagePush( "Table could not be created
    SQL: " . pg_last_error() ); + dvwaPageReload(); +} + +dvwaMessagePush( "'users' table was created." ); + +// Get the base directory for the avatar media... +$baseUrl = 'http://'.$_SERVER[ 'SERVER_NAME' ].$_SERVER[ 'PHP_SELF' ]; +$stripPos = strpos( $baseUrl, 'dvwa/setup.php' ); +$baseUrl = substr( $baseUrl, 0, $stripPos ).'dvwa/hackable/users/'; + +$insert = "INSERT INTO users VALUES + ('1','admin','admin','admin',MD5('password'),'{$baseUrl}admin.jpg'), + ('2','Gordon','Brown','gordonb',MD5('abc123'),'{$baseUrl}gordonb.jpg'), + ('3','Hack','Me','1337',MD5('charley'),'{$baseUrl}1337.jpg'), + ('4','Pablo','Picasso','pablo',MD5('letmein'),'{$baseUrl}pablo.jpg'), + ('5','bob','smith','smithy',MD5('password'),'{$baseUrl}smithy.jpg');"; +if( !pg_query( $insert ) ) { + dvwaMessagePush( "Data could not be inserted into 'users' table
    SQL: " . pg_last_error() ); + dvwaPageReload(); +} + +dvwaMessagePush( "Data inserted into 'users' table." ); + +// Create guestbook table + +$drop_table = "DROP table IF EXISTS guestbook;"; + +if( !@pg_query($drop_table) ) { + dvwaMessagePush( "Could not drop existing users table
    SQL: " . pg_last_error() ); + dvwaPageReload(); +} + +$create_tb_guestbook = "CREATE TABLE guestbook (comment text, name text, comment_id SERIAL PRIMARY KEY);"; + +if( !pg_query( $create_tb_guestbook ) ) { + dvwaMessagePush( "guestbook table could not be created
    SQL: " . pg_last_error() ); + dvwaPageReload(); +} + +dvwaMessagePush( "'guestbook' table was created." ); + +// Insert data into 'guestbook' +$insert = "INSERT INTO guestbook (comment, name) VALUES('This is a test comment.','admin')"; + +if( !pg_query( $insert ) ) { + dvwaMessagePush( "Data could not be inserted into 'guestbook' table
    SQL: " . pg_last_error() ); + dvwaPageReload(); +} +dvwaMessagePush( "Data inserted into 'guestbook' table." ); + +dvwaMessagePush( "Setup successful!" ); +dvwaPageReload(); + +pg_close($dbconn); + +?> diff --git a/dvwa/dvwa/includes/dvwaPage.inc.php b/dvwa/dvwa/includes/dvwaPage.inc.php new file mode 100644 index 0000000..88ff699 --- /dev/null +++ b/dvwa/dvwa/includes/dvwaPage.inc.php @@ -0,0 +1,562 @@ + 'Damn Vulnerable Web Application (DVWA) v' . dvwaVersionGet() . '', + 'title_separator' => ' :: ', + 'body' => '', + 'page_id' => '', + 'help_button' => '', + 'source_button' => '', + ); + return $returnArray; +} + + +function dvwaSecurityLevelGet() { + return isset( $_COOKIE[ 'security' ] ) ? $_COOKIE[ 'security' ] : 'impossible'; +} + + +function dvwaSecurityLevelSet( $pSecurityLevel ) { + if( $pSecurityLevel == 'impossible' ) { + $httponly = true; + } + else { + $httponly = false; + } + setcookie( session_name(), session_id(), null, '/', null, null, $httponly ); + setcookie( 'security', $pSecurityLevel, NULL, NULL, NULL, NULL, $httponly ); +} + + +// Start message functions -- + +function dvwaMessagePush( $pMessage ) { + $dvwaSession =& dvwaSessionGrab(); + if( !isset( $dvwaSession[ 'messages' ] ) ) { + $dvwaSession[ 'messages' ] = array(); + } + $dvwaSession[ 'messages' ][] = $pMessage; +} + + +function dvwaMessagePop() { + $dvwaSession =& dvwaSessionGrab(); + if( !isset( $dvwaSession[ 'messages' ] ) || count( $dvwaSession[ 'messages' ] ) == 0 ) { + return false; + } + return array_shift( $dvwaSession[ 'messages' ] ); +} + + +function messagesPopAllToHtml() { + $messagesHtml = ''; + while( $message = dvwaMessagePop() ) { // TODO- sharpen! + $messagesHtml .= "