0

在数据库(MySQL)的输出上使用 htmlspeciachars,还有什么要考虑的来防止 XSS?

从数据库(在本例中为 MySQL)获取数据时在输出上使用 htmlspecialchars 是否正确,可以防止 XSS?在这种情况下,要在 HTML 文档中显示 HTML?还有什么你应该考虑的吗?我的意思是在哪些其他情况下你可能容易受到 XSS 攻击?

假设我有一个网站,我在其中创建了一个登录系统,供用户发布新帖子,用户可以在这里删除这些新闻帖子,但这里使用了一个 JavaScript 函数和 alertbox() 来确保用户真的想删除这条新闻,如果是,则新闻 ID 通过 URL 传递,如下所示:

echo '<a class="btn-small btn-danger" onclick="deleteNews('. htmlspecialchars($newsidfk) .')" ">Delete news</a>'; 

Javascript函数:

//alert deleteNews
function deleteNews($newsidfk)
{
var ans = window.confirm(Are you sure you want to delete this news post?');
        if (ans == true)
        {
            window.location.href="delete.php?news_id_fk="+$newsidfk;
        }
}

还有什么我应该考虑的东西来防止 XSS,或者这里不能做 XSS?假设我有一个字符串而不是数字,我应该做一些 JavaScript 编码,也许是 encodeURI() 函数吗?

使用 htmlspecialchars 阻止例如脚本标签、链接标签和 img 标签运行是否正确?这就是 XSS 的工作方式,因为有人可以,例如,窃取用户的私人信息?

我了解到在显示数据库输出时应该始终进行清理,但是存储到数据库中的输入呢?您是否也应该对此进行清理,还是仅使用 PDO 准备好的语句或其他东西就足够了,以及如何这样做?

我在 wiki 上的这篇文章中阅读了有关 HTML 清理的内容: http ://en.wikipedia.org/wiki/HTML_sanitization

4

2 回答 2

1

从数据库(在本例中为 MySQL)获取数据时在输出上使用 htmlspecialchars 是否正确,可以防止 XSS?在这种情况下,要在 HTML 文档中显示 HTML?还有什么你应该考虑的吗?我的意思是在哪些其他情况下你可能容易受到 XSS 攻击?

是的,这是正确的。有时被忽视的完整故事的一部分是字符编码。虽然默认情况下这工作得很好,但如果您没有检查您在输入的数据上使用的编码是否也向函数本身发出信号,则可能会出现问题。htmlspecialchars

例如,如果您使用 PHP 5.3,并且您的数据库中有 UTF-8 编码的字符串并且您这样查询它们并且您在 HTML 中使用 UTF-8,那么您还应该告诉htmlspecialchars

$flags    = ENT_COMPAT | ENT_HTML401;
$encoding = 'UTF-8'

htmlspecialchars($string, $flags, $encoding);

尽管如果您使用的是 PHP 5.4,UTF-8 是默认编码,您不需要提供它:

htmlspecialchars($string);
于 2013-01-06T23:19:20.917 回答
1

始终将 JavaScript 文字输出为 JSON。

<a class="btn-small btn-danger" onclick="deleteNews(<?php echo htmlspecialchars(json_encode($newsidfk)); ?>)" ">Delete news</a>

<script>
var data = <?php echo json_encode($data); ?>
</script>
于 2013-01-06T22:25:28.447 回答