我应该使用 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 可以用来拒绝无效输入。
必须在我的页面上安全地回显用户提交的 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 可以用来拒绝无效输入。