防止JavaScript内联网址注入

时间:2014-02-05 19:09:29

标签: javascript php zend-framework xss

对于用户输入个人网站网址的字段,然后在公共资料中显示,如何在服务器端阻止js注入。

例如输入值 - > '的javascript:/ ** /警报(document.domain的)'

if (!preg_match('/^https?:\/\/.*$/D', $value)) {
        $value = 'http://' . $value;
    }
    if(filter_var($url, FILTER_VALIDATE_URL) == FALSE){
        return false;
    }
    try {
        $uri = Zend_Uri_Http::fromString($value);
    }
    catch (Zend_Uri_Exception $e) {
        return false;
    }
    return $uri->valid();

然后这将显示为:

$escapedWebsite = htmlspecialchars($url, ENT_QUOTES, 'UTF-8')
'<a href="'. $escapedWebsite .'" target="_blank" rel="nofollow">' . $escapedWebsite . '</a>';

页面呈现为:

<a href="javascript:/**/alert(document.domain)" target="_blank" rel="nofollow">javascript:/**/alert(document.domain)</a>

1 个答案:

答案 0 :(得分:0)

Perosnally,我喜欢使用parse_url来验证URI:

$incomingUrl = $_POST['website'];
$parsedUrl = parse_url($incomingUrl);

if (parsedUrl !== false) { /* valid! */ }

当然您也可以使用filter_input

validate_input(INPUT_POST, 'website', FILTER_VALIDATE_URL)