我有像这样的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攻击?我怎样才能保护我的代码免受其侵害?
答案 0 :(得分: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)
答案 1 :(得分:2)
你也没有告诉PHP逃避引号,你应该使用htmlspecialchars()
代替:
<input type = 'text' name = 'messi_fan' value ='<?php echo htmlspecialchars($input_from_user, ENT_QUOTES, 'UTF-8'); ?>' />