您应该在HTML表单文本字段中检查什么?

时间:2009-04-01 14:01:45

标签: php html security forms

我正在编写一个PHP脚本来从提交的表单中获取文本框数据。这些是简单的文本框,我不想接受任何HTML标记。我想我至少应该使用strip_tags()和addslashes()。还要别的吗?我不介意将输入限制为字母数字,我应该使用正则表达式来寻找非标准字符吗?

这是一个简单的表格,实际上(呃)通过电子邮件发送给处理它的人。 (遗憾的是没有数据库。)这是简单的数据,名字和姓氏。

编辑: 我也想知道我应该寻找什么。关于合理输入过滤的共识是什么?

3 个答案:

答案 0 :(得分:6)

使用PHP filter functions

您可以使用它们来清理输入和验证输入(例如电子邮件地址)。

有两种验证方法(这也适用于安全性和许多其他方面)。

首先,您可以默认允许除明确禁止的内容之外的任何内容。或者你可以默认禁止除了特别允许的所有内容。

一般来说,后一种方法更安全,应该使用,除非你有令人信服的理由不要(例如,很难知道什么是允许的,你正在为不被视为的用户做一个应用程序成为安全威胁等等。)

然而,你必须小心使用它。对于人们的名字,像'和 - 这样的字符是完全有效的,但天真的实现可能会限制它们。您通常希望避免的是:

  • SQL注入:始终在任何输入上使用mysql_real_escape_string();
  • XSS(跨站点脚本):一般来说,您应该从用户输入中删除HTML标记。当然,您有时必须允许它们(例如,富文本编辑器框),但即使在这些情况下,您将拥有一个允许的标记列表,您应该删除所有其他标记(尤其是标记);和
  • 通常你应该删除低字符(低于ASCII 20?左右);和
  • 根据国际化要求,您可能需要删除高位字符(ASCII 127以上)。

使用的一个好的默认值是:

$var = filter_var($var, FILTER_SANITIZE_STRING);

但为这种情况选择合适的过滤器。

答案 1 :(得分:1)

这是一个非常常见的问题,有很多不太明确的答案。像addslashes()这样的函数在某些设置中实际上可能弊大于利。处理用户输入时要遵循的一些基本规则是不要相信任何东西,如果它不是您期望的格式,请不要尝试修复它只是引发错误。

如果您只需要字母数字,那么一个简单的正则表达式将处理它,但更多的信息将有所帮助。

您打算如何处理这些数据?您目前(或计划如何)处理输入,例如,用户提交表单,处理表单并将数据存储在数据库中以便以后显示(如注释引擎)。

编辑:如果它像通过电子邮件发送文本框一样简单,供人处理。我最担心的是XSS和smtp标头注入(取决于电子邮件的发送方式)。尝试使用最简单的解决方案,如果您现在只需要接收字母数字数据,请使用正则表达式并且只接受它。另一种解决方案是使用具有ENT_QUOTES的htmlentities。

答案 2 :(得分:1)

  

我不想接受任何HTML标记。我想我至少应该使用strip_tags()

可能,但是如果你想让人们输入'<'/'>'字符只是意味着小于和大于,而与标签无关。

在自由文本字段的输入上,你真的不想过滤掉非换行控制字符(你通常不想要的任何地方),并且,如果你使用的是UTF-8,则无效/冗余序列。

然后当您将值输出回页面时,您当然会记得使用htmlspecialchars()以便'<'被转义为'& lt;'并在屏幕上显示为文字'<' , 对?每当您在模板中将文本值输出到HTML时,您都需要使用htmlspecialchars(),无论该字符串是来自表单提交,数据库还是其他地方。

对于您希望所有输入与特定受限格式匹配的非自由文本字段,然后是,正则表达式可以是匹配此内容的好方法。

  

和addslashes()。

addslashes()几乎总是错误的。一个好的经验法则是:不要使用它。

addslashes()不适合SQL转义,因为它与实际的SQL字符串文字转义格式不匹配,因此您可以构造在添加时仍然很危险的字符串。当你使用MySQL时,你应该使用mysql_real_escape_string()代替。其他数据库有自己特定的转义功能。使用它们(或者,更简单,使用参数化查询,这样您就不必手动将文本转义为SQL)。

(addslashes()不适合HTML转义,因为它根本不会尝试使用HTML特殊字符。这不是它的用途。)

在任何情况下,尝试在输入过滤阶段处理输出转义都是倒退的。相反,将应用程序内部的所有字符串保留为纯文本,并在离开应用程序的路上将其转义:mysql_real_escape_string,当他们出去参加SQL查询时,htmlspecialchars()在他们去的时候进入HTML页面,依此类推。