创建正则表达式以摆脱PHP中的非法字符模式

时间:2009-08-21 21:48:45

标签: php regex

在PHP中,什么是可用于打破PHP页面的潜在有害字符列表?并且,使用正则表达式,如何从我的所有用户输入中过滤出错误的字符序列?

例如..要检查电子邮件是否有效,我会使用以下行:

preg_match("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email);

以上内容检查电子邮件的具体模式。

但是,就像使用正则表达式检查电子邮件是否有效时一样,如何使用每个输入的一个表达式检查输入是否包含任何无效的字符模式?我想将此行放在我的php页面的顶部,该页面接受$_GET$_POST以防止任何类似黑客的输入崩溃页面。

希望这是有道理的。 谢谢 PG

3 个答案:

答案 0 :(得分:4)

没有像你描述的那样过滤输入的“唯一”方法,因为没有输入本质上是无效的,甚至不一定是恶意的。这完全是你的重要输入。

例如,假设您在$_GET['field']中有一些文本,并且您即将撰写SQL查询。您需要使用mysql_real_escape_string()(对于MySQL来)转义这样的值,如下所示:

$sql = "INSERT INTO some_table (some_field) VALUES ('" . mysql_real_escape_string($_GET['field']) . "')";

这种转义对于应用于您在SQL查询中使用的输入绝对至关重要。一旦它在你看到这里应用,即使来自黑客的恶意输入也不会对你的数据库产生任何不良影响。

但是,如果您在页面的某些HTML输出中包含$_GET['field],则此功能无用且完全错误。在这种情况下,函数htmlspecialchars()很有用。您可以执行以下操作:

echo "<p>Your comments were: " . htmlspecialchars($_GET['field']) . "</p>";

这两个例子都非常安全,不受“黑客般的输入”的影响。您不会将恶意数据插入数据库或HTML中。然而,请注意两种形式的逃逸是完全不同的功能,每种功能都适合它的使用。

相比之下,想象一下,如果您尝试同时“验证”这两种用途的输入。您当然不能允许<>个字符,因为这些字符可能是恶意HTML攻击的一部分,如跨站点脚本。因此,想要写“我认为1&lt; 3”的访问者将受到阻碍。同样,由于担心恶意SQL注入攻击,你不能允许引号,所以可怜的“Miles O'Brien”永远不会填写你的表格!

正确的输入转义非常容易,因为你在不同的环境中使用它(它通常比验证输入更容易!)但结果却好得多。

答案 1 :(得分:0)

有更好的方法来清理输入。内置函数strip_tags会更快。

答案 2 :(得分:0)

如果您担心将包含HTML字符和/或SQL注入类型的攻击的用户输入,请查看内置的PHP函数,如htmlentities()和mysql_real_escape_string()。

请阅读文档了解详情:http://us2.php.net/manual/en/security.database.sql-injection.php