voku/anti-xss

4.1.42 2023-07-03 14:40 UTC

README

SWUbanner

Build Status codecov.io Codacy Badge Latest Stable Version Total Downloads License Donate to this project using Paypal Donate to this project using Patreon

㊙️ AntiXSS

"跨站脚本(XSS)是一种计算机安全漏洞,通常存在于Web应用程序中。XSS允许攻击者向其他用户查看的网页中注入客户端脚本。跨站脚本漏洞可能被攻击者用来绕过如同源策略等访问控制。截至2007年,Symantec记录的所有安全漏洞中,约有84%是由网站上的跨站脚本引起的。" - http://en.wikipedia.org/wiki/Cross-site_scripting

DEMO

http://anti-xss-demo.suckup.de/

注意

  1. 使用 filter_input() - 不要直接使用 GLOBAL-Array(例如 $_SESSION, $_GET, $_POST, $_SERVER)

  2. 如果需要更灵活的解决方案,请使用 html-sanitizerHTML Purifier

  3. 添加 "内容安全策略" 的 内容安全策略简介

  4. 不要编写自己的正则表达式来解析HTML!

  5. 阅读此文本 -> XSS(跨站脚本)预防备忘单

  6. 测试此工具 -> Zed Attack Proxy (ZAP)

通过 "composer require" 安装

composer require voku/anti-xss

用法

use voku\helper\AntiXSS;

require_once __DIR__ . '/vendor/autoload.php'; // example path

$antiXss = new AntiXSS();

示例 1: (HTML 字符)

$harm_string = "Hello, i try to <script>alert('Hack');</script> your site";
$harmless_string = $antiXss->xss_clean($harm_string);

// Hello, i try to alert&#40;'Hack'&#41;; your site

示例 2: (十六进制 HTML 字符)

$harm_string = "<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>";
$harmless_string = $antiXss->xss_clean($harm_string);
    
// <IMG >

示例 3: (十六进制 Unicode 字符)

$harm_string = "<a href='&#x2000;javascript:alert(1)'>CLICK</a>";
$harmless_string = $antiXss->xss_clean($harm_string);
    
// <a >CLICK</a>

示例 4: (Unicode 字符)

$harm_string = "<a href=\"\u0001java\u0003script:alert(1)\">CLICK<a>";
$harmless_string = $antiXss->xss_clean($harm_string);
    
// <a >CLICK</a>

示例 5.1: (非内联 CSS)

$harm_string = '<li style="list-style-image: url(javascript:alert(0))">';
$harmless_string = $antiXss->xss_clean($harm_string);

// <li >

示例 5.2: (带内联 CSS)

$harm_string = '<li style="list-style-image: url(javascript:alert(0))">';
$antiXss->removeEvilAttributes(array('style')); // allow style-attributes
$harmless_string = $antiXss->xss_clean($harm_string);

// <li style="list-style-image: url(alert&#40;0&#41;)">

示例 6: (检查字符串是否包含 XSS 攻击)

$harm_string = "\x3cscript src=http://www.example.com/malicious-code.js\x3e\x3c/script\x3e";
$harmless_string = $antiXss->xss_clean($harm_string);

// 

$antiXss->isXssFound(); 

// true

示例 7: (允许例如 iframes)

$harm_string = "<iframe width="560" onclick="alert('xss')" height="315" src="https://www.youtube.com/embed/foobar?rel=0&controls=0&showinfo=0" frameborder="0" allowfullscreen></iframe>";

$antiXss->removeEvilHtmlTags(array('iframe'));

$harmless_string = $antiXss->xss_clean($harm_string);

// <iframe width="560"  height="315" src="https://www.youtube.com/embed/foobar?rel=0&controls=0&showinfo=0" frameborder="0" allowfullscreen></iframe>

单元测试

  1. Composer 是运行测试的前提条件。
composer install
  1. 可以通过从根目录运行此命令来执行测试
./vendor/bin/phpunit

AntiXss 方法

addDoNotCloseHtmlTags(string[] $strings): $this

向 "_do_not_close_html_tags"-数组添加一些字符串。

参数

  • string[] $strings

返回

  • $this

addEvilAttributes(string[] $strings): $this

向 "_evil_attributes"-数组添加一些字符串。

参数

  • string[] $strings

返回

  • $this

addEvilHtmlTags(string[] $strings): $this

向 "_evil_html_tags"-数组添加一些字符串。

参数

  • string[] $strings

返回

  • $this

addNeverAllowedCallStrings(string[] $strings): $this

向 "_never_allowed_call_strings"-数组添加一些字符串。

参数

  • string[] $strings

返回

  • $this

addNeverAllowedJsCallbackRegex(string[] $strings): $this

将一些字符串添加到 "_never_allowed_js_callback_regex"-数组中。

参数

  • string[] $strings

返回

  • $this

addNeverAllowedOnEventsAfterwards(string[] $strings): $this

将一些字符串添加到 "_never_allowed_on_events_afterwards"-数组中。

参数

  • string[] $strings

返回

  • $this

addNeverAllowedRegex(string[] $strings): $this

将一些字符串添加到 "_never_allowed_regex"-数组中。

参数

  • string[] $strings

返回

  • $this

addNeverAllowedStrAfterwards(string[] $strings): $this

将一些字符串添加到 "_never_allowed_str_afterwards"-数组中。

参数

  • string[] $strings

返回

  • $this

isXssFound(): bool|null

检查 "AntiXSS->xss_clean()" 方法在上次运行中是否发现了 XSS 攻击。

参数:

返回

  • bool|null <p>如果 "xss_clean()" 没有运行,将返回 null.</p>

removeDoNotCloseHtmlTags(string[] $strings): $this

从 "_do_not_close_html_tags"-数组中移除一些字符串。


WARNING: 仅在有充分理由的情况下使用此方法。

参数

  • string[] $strings

返回

  • $this

removeEvilAttributes(string[] $strings): $this

从 "_evil_attributes"-数组中移除一些字符串。


WARNING: 仅在有充分理由的情况下使用此方法。

参数

  • string[] $strings

返回

  • $this

removeEvilHtmlTags(string[] $strings): $this

从 "_evil_html_tags"-数组中移除一些字符串。


WARNING: 仅在有充分理由的情况下使用此方法。

参数

  • string[] $strings

返回

  • $this

removeNeverAllowedCallStrings(string[] $strings): $this

从 "_never_allowed_call_strings"-数组中移除一些字符串。


WARNING: 仅在有充分理由的情况下使用此方法。

参数

  • string[] $strings

返回

  • $this

removeNeverAllowedJsCallbackRegex(string[] $strings): $this

从 "_never_allowed_js_callback_regex"-数组中移除一些字符串。


WARNING: 仅在有充分理由的情况下使用此方法。

参数

  • string[] $strings

返回

  • $this

removeNeverAllowedOnEventsAfterwards(string[] $strings): $this

从 "_never_allowed_on_events_afterwards"-数组中移除一些字符串。


WARNING: 仅在有充分理由的情况下使用此方法。

参数

  • string[] $strings

返回

  • $this

removeNeverAllowedRegex(string[] $strings): $this

从 "_never_allowed_regex"-数组中移除一些字符串。


WARNING: 仅在有充分理由的情况下使用此方法。

参数

  • string[] $strings

返回

  • $this

removeNeverAllowedStrAfterwards(string[] $strings): $this

从 "_never_allowed_str_afterwards"-数组中移除一些字符串。


WARNING: 仅在有充分理由的情况下使用此方法。

参数

  • string[] $strings

返回

  • $this

setReplacement(string $string): $this

设置不允许的字符串的替换字符串。

参数

  • string $string

返回

  • $this

setStripe4byteChars(bool $bool): $this

设置是否条纹 4-字节字符的选项。


INFO: 如果你的数据库(MySQL)不能使用 "utf8mb4" -> 防止存储 XSS 攻击

参数

  • bool $bool

返回

  • $this

xss_clean(string|string[] $str): string|string[]

XSS 清理


通过清理数据,防止 "跨站脚本" 攻击。此方法做了大量工作,但非常彻底,旨在防止最隐蔽的 XSS 尝试。但请记住,没有任何方法是100%万无一失的...


注意: 应仅用于处理提交的数据。这不应该用于通用运行时处理。

参数

  • TXssCleanInput $str <p>输入数据,例如字符串或字符串数组</p>

返回

  • string|string[]

支持

有关支持和捐赠,请访问 Github | 问题 | PayPal | Patreon

有关状态更新和发布公告,请访问 发布 | Twitter | Patreon

如需专业支持,请联系

谢谢

  • 感谢 GitHub(微软)提供代码托管和良好的基础设施,包括问题管理等。
  • 感谢 IntelliJ,它们提供了最好的PHP IDE,并且为我提供了PhpStorm的开放源代码许可!
  • 感谢 Travis CI,它是最好的、最易用的持续集成工具!
  • 感谢 StyleCI,它提供了简单但强大的代码风格检查。
  • 感谢 PHPStan 以及 Psalm,它们提供了真正优秀的静态分析工具,并在代码中发现了错误!

许可证

FOSSA Status