3

我有这样的php代码

<?php
    $input_from_user = "w' onclick = 'alert(document.cookie);'";
    $i_am_barcelona_fan = htmlentities($input_from_user);
?>
<input type = 'text' name = 'messi_fan' value ='<?php echo $i_am_barcelona_fan;?>' />

htmlentities用来防止 XSS 攻击,但我仍然容易受到上述字符串的攻击。为什么我的代码容易受到 XSS 攻击?我怎样才能保护我的代码免受它的影响?

4

2 回答 2

2

永远(永远)不要相信引入到您的 PHP 代码中的外部输入。在代码中使用外部输入之前,请始终对其进行清理和验证。filter_var 和 filter_input 函数可以净化文本并验证文本格式(例如电子邮件地址)。

外部输入可以是任何东西:$_GET 和 $_POST 表单输入数据,$_SERVER 超全局中的一些值,以及通过 fopen('php://input', 'r') 的 HTTP 请求正文。请记住,外部输入不仅限于用户提交的表单数据。上传和下载的文件、会话值、cookie 数据以及来自第三方 Web 服务的数据也是外部输入。

虽然外部数据可以在以后存储、组合和访问,但它仍然是外部输入。每次在代码中处理、输出、连接或包含数据时,都要问问自己数据是否被正确过滤以及是否可以信任。

数据可能会根据其目的进行不同的过滤。例如,当未经过滤的外部输入传递到 HTML 页面输出时,它可以在您的站点上执行 HTML 和 JavaScript!这称为跨站点脚本 (XSS),可能是一种非常危险的攻击。避免 XSS 的一种方法是在将所有用户生成的数据输出到页面之前对其进行清理,方法是使用 strip_tags 函数删除 HTML 标记,或者使用 htmlentities 或 htmlspecialchars 函数将具有特殊含义的字符转义到它们各自的 HTML 实体中。

另一个示例是传递要在命令行上执行的选项。这可能非常危险(通常是个坏主意),但您可以使用内置的 escapeshellarg 函数来清理已执行命令的参数。

最后一个示例是接受外部输入以确定要从文件系统加载的文件。这可以通过将文件名更改为文件路径来利用。您需要从文件路径中删除“/”、“../”、空字节或其他字符,以便它无法加载隐藏、非公共或敏感文件。

了解数据过滤 ( http://www.php.net/manual/en/book.filter.php )

了解 filter_var ( http://php.net/manual/en/function.filter-var.php )

于 2013-04-04T04:52:34.267 回答
2

您也没有告诉 PHP 转义引号,htmlspecialchars()而是应该使用:

<input type = 'text' name = 'messi_fan' value ='<?php echo htmlspecialchars($input_from_user, ENT_QUOTES, 'UTF-8'); ?>' />

演示

于 2013-04-04T04:56:53.223 回答