2017-08-08 39 views
0

如果以前有人问过这个问题,我们表示抱歉 - 但在这种情况下,我觉得信息过多,而不是太少。在我看来,每个地方似乎都有矛盾的观点。 任何澄清将不胜感激。我是否需要在HTML表单中使用htmlspecialchars()用户输入来防止XSS?

我有一个用户注册表单。我已验证了不同的字段,但我没有对数据使用任何清理功能(例如htmlspecialchars),因为我读here,最好将其保留到输出(例如在用户配置文件中)。我使用PDO准备好的语句来插入我的数据,所以我在那里安全,据我所知。

但是,通过各种漏洞扫描程序运行我的域名后,他们报告说我的注册表单非常不安全,并可能成为XSS攻击的受害者。我相信的代码导致,这是如下的片断:

<input type="text" placeholder="Username" name="user" maxlength="32" value="<?php echo test_input($user); ?>" pattern="^[a-zA-Z0-9]*$" required> 

我回声荷兰国际集团用户的输入回形式的情况下,他们有一个错误在另一个领域,以修正后重新提交。因此可能会将有害的脚本回显到页面中。

但是,当然这只是来自该特定用户的输入?他们可能造成的唯一危害是他们自己?扫描仪是错误的还是基本不知道风险?

我有一般字符串,电子邮件地址,URL的字段。我采取了哪些步骤来确保访问者访问我的网站的安全?

非常感谢您给我任何帮助/澄清!

编辑

function test_input($data) 
    { 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data, ENT_QUOTES | ENT_HTML5, 'UTF-8'); 
    return $data; 
    } 
+0

'test_input()'做了什么? –

+0

对不起,这是我现在添加的用于防止危险脚本运行的功能。我会将其添加到原始帖子。基本上我的问题是,如果在这个阶段是必要的,或者我只是返回用户输入的内容?感谢您指出了这一点。 – user2228716

+0

[伟大的逃避现实(或:你需要知道怎么处理文本中的文本)](http://kunststube.net/escapism/) – deceze

回答

0

我需要在一个HTML表单进行htmlspecialchars()用户的输入,以防止XSS?

您需要东西htmlspecialchars通常是一个不错的选择。它很简单,不会破坏输入。

但是,当然这只是该特定用户的输入?

它来自该特定用户的输入浏览器

该用户可能访问了一个邪恶的第三方网站,该网站将XSS攻击作为其网站上表单输入的默认值。然后他们将action的表格设置为您的网站。然后他们用JS提交表单。

结果:他们的代码由用户的浏览器注入到您的网站,并且他们的JS在您的网站上执行(访问用户的Cookie和会话)。

+0

啊,现在这是完全合理的!非常感谢。因此,我可以将原始用户输入提交到我的数据库中(前提是我在输出中特别指定它),但是当回显用户输入到表单中以进行更正时 - 我应该在给定的情况下也特别注意它? – user2228716

0

将任何变量插入到另一个上下文中时,还应该通过htmlspecialchars()(或上面的noHTML())运行它们,以确保它们不会分离并向父元素添加额外的属性。

这是安全的:

<input type="text" name="username" value="<?php echo noHTML($htmlp->purify($_GET['username'])); ?>" /> 

这同样是对XSS攻击的安全,但仍然是一个坏主意:

<?php echo $htmlp->purify("<input type=\"text\" name=\"username\" value=\"".$_GET['username']."\" />"); ?> 

事实证明,背景是相当重要的,以防止交叉现场脚本攻击。在其他上下文中(例如,我们处于HTML属性的中间),在一个上下文中安全的内容(例如,允许HTML)可能是灾难性的。

全部来源:https://paragonie.com/blog/2015/06/preventing-xss-vulnerabilities-in-php-everything-you-need-know

+0

这是一个很好的来源,非常感谢。我同意使用ENT_QUOTES来确保安全性,但是,如果我想在我的某个字段中允许使用单引号('),该怎么办?否则不会“我不喜欢XSS攻击”被输出为像“我不喜欢XSS”的东西'? – user2228716

+0

你可以用反斜杠'“我不喜欢XSS攻击”来避免引用。如果你发现我的答案有用的话给它upvote :) –

-1

我会在你所描述的,没有,没有太多的风险确切的情况说了,因为值不保留即使他们提交的代码注入和XSS攻击,这只会影响他们自己的看法。
但是,将非编码值输出回给用户是不好的做法。如果页面稍后被更改,或者该值被持久保存,并且稍后在没有编码的某种管理页面中查看,该怎么办?那么他们已经设法在您的网站上注入XSS攻击。 在显示它们之前始终对任何用户输入的值进行编码是一种很好的做法。

+0

有道理,谢谢你的帮助! – user2228716

相关问题