我有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攻击? 我怎样才能从它我的代码保护?
你不告诉PHP转义引号,以及,你应该使用htmlspecialchars()
代替:
<input type = 'text' name = 'messi_fan' value ='<?php echo htmlspecialchars($input_from_user, ENT_QUOTES, 'UTF-8'); ?>' />
演示
永远不要(永远)信任介绍给你的PHP代码的外国输入。 始终消毒并在代码中使用它之前验证外国输入。 该filter_var和filter_input功能可以消毒文字和验证文本格式(例如电子邮件地址)。
外来输入可以是任何东西:$ _GET和$ _POST形式的输入数据,在$ _SERVER超全局一些值,并且HTTP请求经由身体的fopen(“PHP://输入”,“R”)。 请记住,国外输入不限于形成用户提交的数据。 上传和下载的文件,会话值,Cookie数据,以及来自第三方的Web服务数据是外国输入了。
而国外的数据可以存储,合并,后来访问,它仍然是外国输入。 每次处理时间,输出,串联,或在您的代码数据,问自己,如果数据被正确过滤,能不能信任。
数据可能会有所不同根据其目的进行过滤。 例如,当未经过滤的外国输入被传递到HTML页面的输出,它可以在您的网站上执行HTML和JavaScript! 这就是所谓的跨站点脚本(XSS),可以是一个非常危险的攻击。 避免XSS的一种方式是通过用strip_tags功能删除HTML标签或转义具有特殊含义的字符与ヶ辆或用htmlspecialchars功能各自的HTML实体将其输出到你的页面之前,消毒所有用户生成的数据。
另一个例子是通过被在命令行上执行的选项。 这可以是非常危险的(并且通常是一个坏主意),但你可以使用内置的escapeshellarg功能消毒执行的命令的参数。
最后一个例子是接受外来输入来确定一个文件从文件系统加载。 这可以通过更改文件名的文件路径被利用。 您需要删除“/”,“../”,空字节,或其他字符的文件路径,以便它不能加载隐藏的,非公开的,或敏感文件。
了解数据过滤( http://www.php.net/manual/en/book.filter.php )
了解filter_var( http://php.net/manual/en/function.filter-var.php )