创建正则表达式以消除PHP中的非法字符模式
在PHP中,可以用来破坏PHP页面的潜在有害字符列表是什么?而且,使用正则表达式,如何从所有用户输入中过滤出错误的字符序列 例如。。要检查电子邮件是否有效,我将使用以下行:创建正则表达式以消除PHP中的非法字符模式,php,regex,Php,Regex,在PHP中,可以用来破坏PHP页面的潜在有害字符列表是什么?而且,使用正则表达式,如何从所有用户输入中过滤出错误的字符序列 例如。。要检查电子邮件是否有效,我将使用以下行: preg_match("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email); 以上检查电子邮件的特定模式 但是,就像使用正则表达式检查电子邮件是否有效一样,我如何使用一个表达式检查输入是否有任何无效字符模式?我想把这一
preg_match("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email);
以上检查电子邮件的特定模式
但是,就像使用正则表达式检查电子邮件是否有效一样,我如何使用一个表达式检查输入是否有任何无效字符模式?我想把这一行放在我的php页面的最顶端,它接受一个$\u GET
或$\u POST
,以防止任何类似黑客的输入破坏页面
希望这是有意义的。
非常感谢。
有很多更好的方法来清理输入。内置的功能条标签将更快 有更好的方法来清理输入。内置的功能条标签将更快 没有像您描述的那样“唯一”过滤输入的方法,因为没有任何输入天生无效,甚至不一定是恶意的。重要的完全是你如何处理输入 例如,假设您在
$\u GET['field']
中有一些文本,您将要编写一个SQL查询。您需要使用mysql\u real\u escape\u string()
(当然,对于mysql)来转义该值,如下所示:
这种转义对于应用于SQL查询中使用的输入是绝对重要的。如您所见,一旦应用了它,即使是来自黑客的恶意输入也不会对您的数据库产生不良影响
但是,如果在页面的某些HTML输出中包含$\u GET['field]
,则此函数既没有用处,也完全错误。在这种情况下,函数htmlspecialchars()
非常有用。您可能会这样做:
echo "<p>Your comments were: " . htmlspecialchars($_GET['field']) . "</p>";
echo“您的评论是:”。htmlspecialchars($\u GET['field'])。“”;
这两个例子对于“黑客般的输入”都是非常安全的。您不会将恶意数据插入数据库或HTML。然而,请注意,这两种形式的转义是完全不同的功能,每一种都适合它的使用
相比之下,想象一下如果您试图同时“验证”这两种用途的输入。您当然不能允许
字符,因为这些字符可能是恶意HTML攻击(如跨站点脚本)的一部分。因此,想要写“我认为1<3”的访客将受到阻碍。同样,由于害怕恶意SQL注入攻击,您不能允许使用引号,所以可怜的“Miles O'Brien”永远无法填写您的表单
正确的输入转义很容易做到,因为您可以在不同的上下文中使用它(通常比验证输入更容易!),但结果要好得多。没有您描述的“唯一”过滤输入的方法,因为没有任何输入天生无效,甚至不一定是恶意的。重要的完全是你如何处理输入
例如,假设您在$\u GET['field']
中有一些文本,您将要编写一个SQL查询。您需要使用mysql\u real\u escape\u string()
(当然,对于mysql)来转义该值,如下所示:
这种转义对于应用于SQL查询中使用的输入是绝对重要的。如您所见,一旦应用了它,即使是来自黑客的恶意输入也不会对您的数据库产生不良影响
但是,如果在页面的某些HTML输出中包含$\u GET['field]
,则此函数既没有用处,也完全错误。在这种情况下,函数htmlspecialchars()
非常有用。您可能会这样做:
echo "<p>Your comments were: " . htmlspecialchars($_GET['field']) . "</p>";
echo“您的评论是:”。htmlspecialchars($\u GET['field'])。“”;
这两个例子对于“黑客般的输入”都是非常安全的。您不会将恶意数据插入数据库或HTML。然而,请注意,这两种形式的转义是完全不同的功能,每一种都适合它的使用
相比之下,想象一下如果您试图同时“验证”这两种用途的输入。您当然不能允许
字符,因为这些字符可能是恶意HTML攻击(如跨站点脚本)的一部分。因此,想要写“我认为1<3”的访客将受到阻碍。同样,由于害怕恶意SQL注入攻击,您不能允许使用引号,所以可怜的“Miles O'Brien”永远无法填写您的表单
正确的输入转义非常容易,因为您可以在不同的上下文中使用它(通常比验证输入更容易!),但结果要好得多。如果您担心用户输入会包含HTML字符和/或SQL注入类型的攻击,请查看内置的PHP函数,如htmlentities()和mysql\u real\u escape\u string()
请阅读文档了解详细信息:如果您担心用户输入会包含HTML字符和/或SQL注入类型的攻击,请查看内置PHP函数,如htmlentities()和mysql\u real\u escape\u string()
有关详细信息,请阅读文档:与您的问题无关,但用于验证电子邮件的正则表达式不完整。它将禁止像John这样完全有效的电子邮件地址+Doe@example.com+1发表纪律处分的评论。像这样不完整的电子邮件验证方案是我遇到过的最烦人的设计决策。哇,你说得对!谢谢你的反馈。我将如何更改此项以解决此问题?不要尝试过多验证电子邮件地址;这比你想象的要复杂得多 — 看见更好的方法是:如果它有一个@和一个。在其中,它是一个电子邮件地址。我总是使用类似于
/^[^@]+@[^@]+\.[^@]+$/
的东西来验证电子邮件地址:一个@
符号,后面至少有一个
。