href安全性,防止xss攻击

时间:2013-09-27 09:18:35

标签: javascript xss

<?PHP
//fetch website data from db..

$website=htmlentities("javascript:alert()");
?>

<a href="<?PHP echo $website;?>">Click me</a>//without http will get attack
<a href="http://<?PHP echo $website;?>">Click me</a>

我有一个Web应用程序,为用户添加他们的网站提供输入。

然而我考虑安全问题,我做了测试。如果我添加http://它将不会运行javascript。我的问题是我还需要做什么来保护href安全吗?

$url="example.php?name=Peter&age=37";

if(!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED)){echo "URL is not valid";}
else{echo "URL is valid";}

我使用了validate_url,但是这个返回无效。从W3例子来看,W3显示输出有效

1 个答案:

答案 0 :(得分:1)

要通过锚href属性阻止XSS,您需要做三件事:

  1. 将值放在引号
  2. 对具有特殊含义的任何字符进行编码
  3. 确保将URL的协议列入白名单(如果存在)
  4. 您已经在执行上面的前两个(尽管htmlspecialchars应优先于htmlentities用于此目的),因此您只需要处理(3)。一种方法是在URL前面强制http://,但这会破坏使用不同协议的任何URL(例如HTTPS)。

    更好的解决方案是使用允许协议的白名单,例如:

    $allowed = [null, 'http', 'https']; // null = not specified
    
    $scheme = parse_url($website, PHP_URL_SCHEME);
    if ($scheme === false) {
        // seriously malformed URL, what to do?
    }
    else if (!in_array($scheme, $allowed, true)) {
        // protocol not allowed, don't display the link!
    }
    else {
        // everything OK
    }