我应该使用 strip_tags() 还是 htmlspecialchars() 回显用户提交的链接?

Should I echo User Submitted Links Here With strip_tags() or htmlspecialchars()?

必须在我的页面上安全地回显用户提交的 link,以便回显用户提交的 url 不包含 html 或 javascript 来分解 html 我的页面。 通过 html 分解,我的意思是恶意用户在 url 提交输入字段(在我的 link 提交网络表单上)和他的 html 输入混乱中添加了 html 标签在将他的 url 作为我页面上的 link 输出期间,我页面上的 html。或者用户广告 Javascipt 发出警报或将其他访问者从我的页面重定向到钓鱼网站。必须防止恶意用户提交 url 具有以下部分的内容:

?search=<script>alert('hacked')</script>

真的要防止用户做这样的事情。防止他们在我的其他访问者加载我的页面或单击恶意用户提交的 link 时添加代码,然后他们无法触发恶意代码或无法重定向到恶意站点。 我有两个选择。不确定哪个有效... 这两个中哪一个是有效的回声,我应该坚持哪一个:

A.

//WHICH OF THE FOLLOWING TWO ECHOES IS BEST ?
//OPTION 1
echo 'Link: <a href=' .'"' .strip_tags($url) .'"' .'>' .'<b>' .strip_tags($url) .'</b>' .'</a>'; echo '<br>';

B.

//OPTION 2
echo 'Link: <a href=' .'"' .htmlspecialchars($url) .'"' .'>' .'<b>' .htmlspecialchars($url) .'</b>' .'</a>'; echo '<br>'; 

上下文

$query = "SELECT id,date_and_time,domain,domain_email,ip,url,anchor,description,keyword From $table WHERE $column = ? LIMIT $offset,$max";
$stmt = mysqli_stmt_init($conn);
if(mysqli_stmt_prepare($stmt,$query))
{
    mysqli_stmt_bind_param($stmt,'s',$find);
    mysqli_stmt_execute($stmt);
    if($result = mysqli_stmt_get_result($stmt))
    {
        $columns = mysqli_fetch_array($result);
        
        $submission_id = $columns['id'];
        $submission_date_and_time = $columns['date_and_time'];
        $domain = $columns['domain'];
        $domain_email = $columns['email'];
        $ip = $columns['ip'];
        $url = $columns['url'];
        $anchor = $columns['anchor'];
        $description = $columns['description'];
        $keyword = $columns['keyword'];
        $keyphrase = $columns['keyphrase'];
            
        echo 'Submission Id: ' .$submission_id; echo '<br>';
        echo 'Submission Date And Time: ' .$submission_date_and_time; echo '<br>';
        echo 'Email: ' .$domain_email; echo '<br>';
        echo 'Domain: ' .$domain; echo '<br>';
        echo 'Url: ' .$url; echo '<br>';
        echo 'Anchor: ' .$anchor; echo '<br>';
        echo 'Description: ' .$description; echo '<br>';
        echo 'Keyword: ' .$keyword; echo '<br>';
        echo 'Keyphrase: ' .$keyword; echo '<br>';
        //WHICH OF THE FOLLOWING TWO ECHOES IS BEST ?
        //OPTION 1
        echo 'Link: <a href=' .'"' .strip_tags($url) .'"' .'>' .'<b>' .strip_tags($url) .'</b>' .'</a>'; echo '<br>';
        //OPTION 2
        echo 'Link: <a href=' .'"' .htmlspecialchars($url) .'"' .'>' .'<b>' .htmlspecialchars($url) .'</b>' .'</a>'; echo '<br>'; 
    }
    else
    {
        //Error Messages for Production Mode only.
        echo 'Record fetching failed!';
        echo 'Error: ' .mysqli_stmt_error($stmt);
        echo 'Error: ' .mysqli_stmt_errno($stmt);
    }
mysqli_stmt_close($stmt);
}
mysqli_close($conn);

或者,如果您有更好的编码方式来安全地输出用户提交的 link,那么我想看看您是如何做到的。

在 HTML 上下文中输出任何内容时始终使用 htmlspecialchars()。养成对每个字符串都这样做的习惯,不管它包含什么。

至于strip_tags(),很多人怀疑它的用处。它只是一个愚蠢的正则表达式,用于删除 <> 之间的信息。它可能会保护您免受某些攻击,但绝对不是安全措施。这种影响可能只是偶然的。如果您需要删除 <> 之间的信息,您最好使用纯正则表达式,这可能更快更容易实现。

如果 URL 来自用户输入,则需要验证该输入是否正确 URL。 PHP 有一个过滤器 FILTER_VALIDATE_URL 来验证 URL 可以用来拒绝无效输入。