Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建正则表达式以消除PHP中的非法字符模式_Php_Regex - Fatal编程技术网

创建正则表达式以消除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); 以上检查电子邮件的特定模式 但是,就像使用正则表达式检查电子邮件是否有效一样,我如何使用一个表达式检查输入是否有任何无效字符模式?我想把这一

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

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

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发表纪律处分的评论。像这样不完整的电子邮件验证方案是我遇到过的最烦人的设计决策。哇,你说得对!谢谢你的反馈。我将如何更改此项以解决此问题?不要尝试过多验证电子邮件地址;这比你想象的要复杂得多 — 看见更好的方法是:如果它有一个@和一个。在其中,它是一个电子邮件地址。我总是使用类似于
/^[^@]+@[^@]+\.[^@]+$/
的东西来验证电子邮件地址:一个
@
符号,后面至少有一个