1

我需要检查一个字符串是否是有效的域名或主机地址。这是因为我需要阻止给定字符串中的所有不友好命令。

一种通用的解决方案可能是 ping 给定地址并查看它是否响应,但不幸的是,在我的情况下,这不是一个选项。

我认为可能的字符是 AZ、az、所有数字和点“。” 所以 preg_match 函数可能是一种方法。我对正则表达式的了解几乎为零,但我设法找出以下行来检查除点之外的所有内容。

preg_match("/([a-zA-Z0-9])/", $mystring);

那么你们能帮我找到正确的正则表达式语法来允许上面提到的字符吗?或者,如果您想出一个更好的解决方案来阻止可能的安全问题(字符串最终会出现在 shell_exec 函数中,因此非常关键),请将其吐出。谢谢!:)

编辑:因此可能的输入例如是典型的 IP 地址:123.123.123.123 或域名 mydomain.com 或 corp.mydomain.xx.com。点的数量不是恒定的。

4

3 回答 3

1

我使用 PHP 过滤器来检查域名或主机是否有效。不确定它是否能满足您的所有需求:

filter_var($urlToFilter, FILTER_VALIDATE_URL) !== false)
于 2013-06-07T11:25:15.287 回答
1

对于域:

[a-zA-Z0-9][a-zA-Z0-9\-]*\.([a-zA-Z]{2,})
于 2013-06-07T11:29:24.437 回答
0

dKen 使用过滤器的建议与以下 preg_matches 一起使用:

$chars = preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $domain_name); //valid chars check
$length = preg_match("/^.{1,253}$/", $domain_name); //overall length check
$labels = preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $domain_name); //length of each label
于 2013-06-07T13:42:15.553 回答