1
<?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サイトを追加するための入力を提供する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 の show 出力は有効です

4

1 に答える 1

3

アンカーhref属性を介して XSS を防ぐには、次の 3 つのことを行う必要があります。

  1. 値を引用符で囲みます
  2. 特別な意味を持つ任意の文字をエンコードする
  3. 存在する場合は、URL のプロトコルをホワイトリストに登録してください。

上記の最初の 2 つを既に実行しているため (この目的htmlspecialcharsでは優先するhtmlentities必要があります)、(3) のみを処理する必要があります。これを行う 1 つの方法は、URL の前で総当たり攻撃を行うことですがhttp://、これは別のプロトコル (HTTPS など) を使用する URL を壊してしまいます。

より良い解決策は、許可されたプロトコルのホワイトリストを使用することです。次に例を示します。

$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
}
于 2013-09-27T09:39:29.260 に答える