通过url(PHP)防止xss攻击

通过url(PHP)防止xss攻击,php,xss,url-validation,Php,Xss,Url Validation,我试图通过url避免XSS攻击 网址: 我试过了 var_dump(filter_var('http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29', FILTER_VALIDATE_URL)); 和其他使用正则表达式的url_验证,但根本不起作用。 上面的链接显示了所有的信息,但是我的css和一些java脚本函数不起作用。 请建议最好的解决方案 如果您使用的是MVC,那么在路由

我试图通过url避免XSS攻击
网址: 我试过了

var_dump(filter_var('http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29', FILTER_VALIDATE_URL));
和其他使用正则表达式的url_验证,但根本不起作用。 上面的链接显示了所有的信息,但是我的css和一些java脚本函数不起作用。
请建议最好的解决方案

如果您使用的是MVC,那么在路由之前尝试解码所有值,并使用stript_tags()来消除这些问题。正如文件所说,这个案子不应该影响任何事情

如果没有,请创建一个实用程序函数,并在从URI检索变量时执行相同的操作。但我绝不是XSS专家,所以这可能只是其中的一部分


来自Janis Peisenieks的步骤1:用户提供的转义输出

如果要在用户提供的页面中包含数据,请转义输出。在这个简化的列表中,我们将继续使用一个简单的转义操作:HTML encode any,&,“,”。例如,PHP提供了htmlspecialchars()函数来完成这个常见任务

步骤2:始终使用XHTML

通读OWASP的XSS预防策略,很明显,如果在HTML中使用不带引号的属性,防止注入需要付出更多的努力。相反,在带引号的属性中,转义数据与转义标记内内容的数据所需的过程相同,我们已经在上面概述了转义操作.这是因为在引用属性的上下文中偷偷插入结构重要内容的唯一麻烦制造者是结束引用

显然,为了包含引用的属性,您的标记不必是XHTML。但是,针对XHTML进行测试和验证使得测试是否所有属性都引用变得很容易

步骤3:仅允许CSS和JavaScript中的字母数字数据值

我们需要将您允许从页面CSS和Javascript部分输出的用户数据限制为字母数字(例如,类似[a-zA-Z0-9]+的正则表达式)在Javascript中,这意味着用户数据只能在分配给变量的带引号的字符串中输出(例如,var userId=“ALPHANUMERIC_user_ID_HERE”;),在CSS中,这意味着用户数据只能在属性值的上下文中输出(例如,p{color:#字母数字_USER_color_HERE;}。)这可能看起来很严厉,但是,嘿,这应该是一个简单的XSS教程

现在,需要明确的是,您应该始终验证用户数据,以确保它满足您的期望,即使是对于在标记或属性中输出的数据,如前面的示例所示。然而,这对于CSS和JavaScript区域尤其重要,因为可能的数据结构的复杂性使得防止XSS非常困难攻击

您可能希望用户能够向您的JavaScript提供的常见数据(如Facebook、Youtube和Twitter ID)都可以在满足此限制的同时使用。而且,CSS颜色属性和其他样式也可以集成

步骤4:URL编码URL查询字符串参数

如果用户数据是在链接查询字符串的URL参数内输出的,请确保对数据进行URL编码。同样,以PHP为例,您可以简单地使用urlencode()函数。现在,让我们澄清一下这一点,并通过几个示例进行处理,因为我已经看到关于这一点的许多混淆

必须进行URL编码吗

以下示例输出的用户数据必须是URL编码的,因为它被用作查询字符串中的值

http://site.com?id=USER_DATA_HERE_MUST_BE_URL_ENCODED“>

不能进行URL编码

以下示例为整个URL输出用户提供的数据。在这种情况下,应使用标准转义函数(HTML encode any,&,“,”)转义用户数据,而不是URL编码。URL编码此示例将导致格式错误的链接

尝试改用

输出

http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/%22ns=%22alert%280x0000DC%29
http://10.0.4.2/onlineArcNew/html/terms_conditions_1.php/"ns="alert(0x0000DC)
http%3A%2F%2F10.0.4.2%2FonlineArcNew%2Fhtml%2Fterms_conditions_1.php%2F%26%2334%3Bns%3D%26%2334%3Balert%280x0000DC%29
使用的功能

function sanitiseURL($url, $encode = false) {
    $url = filter_var(urldecode($url), FILTER_SANITIZE_SPECIAL_CHARS);
    if (! filter_var($url, FILTER_VALIDATE_URL))
        return false;
    return $encode ? urlencode($url) : $url;
}

我也使用过url_encode,但它无法阻止我在问题中提出的问题。第2步:始终使用XHTML。Dude HTML5呢?@Robert site是用核心php制作的,很久以前,所以,请让我知道我是否可以验证这些类型的url为错误的url…如果这个链接是你的url或链接来自数据库…因为如果它来自url..你应该d filter
$\u GET
我没有在这一页上获取或处理任何参数。你说在这一页上没有获取任何参数是什么意思?没有使用任何变量,所以我可以过滤$\u GET为什么正则表达式不起作用?我不理解使用preg\u match和正则表达式中允许的字符,例如
[a-zA-Z0-9]+
regex应该在params上使用。我也尝试了这个方法,但我不必存储它,我必须执行这个链接,在行的末尾它包含javascript函数,这个函数说它是有效的url,所以不能解决我的目的。。
function sanitiseURL($url, $encode = false) {
    $url = filter_var(urldecode($url), FILTER_SANITIZE_SPECIAL_CHARS);
    if (! filter_var($url, FILTER_VALIDATE_URL))
        return false;
    return $encode ? urlencode($url) : $url;
}