为什么我的代码容易受到XSS攻击?

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 攻击?我应该如何保护我的代码免受攻击?

1
htmlentities()并不是防止XSS攻击的万无一失的解决方案。 - Jakub
2
这是因为你是巴塞罗那球迷。很多人都很嫉妒。 - SomeShinyObject
一个有关预防 XSS 的好文章。http://www.ibm.com/developerworks/web/library/wa-secxss/ 希望能对您有所帮助。 - Hiren Pandya
1
我的问题有什么问题吗?有人投票关闭了我的问题。 - open source guy
2个回答

2

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

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

Demo


2
永远不要相信引入到你的PHP代码中的外部输入。在使用外部输入之前,始终对其进行清理和验证。filter_var和filter_input函数可以清理文本并验证文本格式(例如电子邮件地址)。
外部输入可以是任何东西:$_GET和$_POST表单输入数据,$_SERVER超全局变量中的某些值以及通过fopen('php:// input','r')访问的HTTP请求正文。请记住,外部输入不仅限于用户提交的表单数据。上传和下载的文件、会话值、cookie数据以及来自第三方网络服务的数据也都属于外部输入。
虽然外部数据可以存储、组合和稍后访问,但它仍然是外部输入。每次在代码中处理、输出、连接或包含数据时,请问自己这些数据是否已经适当地过滤并且是否可信。
根据其目的,数据可能会有不同的过滤方式。例如,当未经过滤的外部输入传递到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


比起清洗,更重要的是适当的转义。在某些情况下,这个字符串可以被认为是“健全”的。 - Ja͢ck
清理会从外部输入中删除(或转义)非法或不安全的字符。有时在将其包含在HTML页面中时,需要允许一些安全的HTML标记。这很难做到,许多人通过使用其他更受限制的格式(如Markdown或BBCode)来避免这种情况,尽管存在像HTML Purifier这样的白名单库来解决这个问题。 示例在此处:http://www.php.net/manual/en/filter.filters.sanitize.php - medina
仍然取决于上下文,哪些字符确实是非法或不安全的;而转义可以在原始值“离开”系统时应用。允许安全子集的HTML并不是这个问题的一部分。 - Ja͢ck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接