php Mac地址检查格式

php Mac地址检查格式,php,Php,我正在从url获取用户的mac。我想做的是匹配看看地址是否真实。因为我将在数据库上运行它,如果格式不正确,我不想运行它 这就是我到目前为止所做的: if (isset($_GET['mac'])) { if (strlen($_GET['mac']) == 18) { $get_mac_filtered = preg_replace('/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/', '',$_GET['mac']);

我正在从url获取用户的mac。我想做的是匹配看看地址是否真实。因为我将在数据库上运行它,如果格式不正确,我不想运行它

这就是我到目前为止所做的:

if (isset($_GET['mac'])) { 
    if (strlen($_GET['mac']) == 18) { 
        $get_mac_filtered = preg_replace('/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/', '',$_GET['mac']);
            if (preg_match('/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/', $_GET['mac']) == $get_mac_filtered) {
                echo 'Got a mac match! '.$get_mac_filtered;
            }else {
                echo 'Sorry !=';
            }
}else {die();} }

我猜问题在这里的某个地方(preg_match('/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/',$GET['mac'])==$GET_mac u filtered),因为它返回
else
删除这一行。它没有任何用处:

$get_mac_filtered = preg_replace('/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/', '',$_GET['mac']);
如前所述,这会将任何类似于有效MAC地址的内容替换为…无。这几乎肯定不是你想在这里做的


相反,在下一行,将
preg_match()
的结果与1进行比较。(如果正则表达式匹配,则返回1;如果不匹配,则返回0。)

删除此行。它没有任何用处:

$get_mac_filtered = preg_replace('/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/', '',$_GET['mac']);
如前所述,这会将任何类似于有效MAC地址的内容替换为…无。这几乎肯定不是你想在这里做的


相反,在下一行,将
preg_match()
的结果与1进行比较。(如果正则表达式匹配,则返回1,如果不匹配,则返回0。)

自PHP5.5以来,验证MAC地址的最佳方法是使用带有常量的
filter\u validate\u MAC

var_dump(filter_var('FA-F9-DD-B2-5E-0D',filter_VALIDATE_MAC));
//串(17)“FA-F9-DD-B2-5E-0D”
变量转储(过滤器变量('DC:BB:17:9A:CE:81',过滤器验证\U MAC));
//字符串(17)“DC:BB:17:9A:CE:81”
变量转储(过滤器变量('96-D5-9E-67-40-AB',过滤器验证MAC));
//管柱(17)“96-D5-9E-67-40-AB”
变量转储(过滤器变量('96-D5-9E-67-40',过滤器验证MAC));
//布尔(假)
变量转储(过滤器变量(“”,过滤器验证MAC));
//布尔(假)
所以你可以做:

if(false==filter\u var($\u GET['mac'],filter\u VALIDATE\u mac)){
抛出新\异常(“无效mac地址”);
}

自PHP5.5以来,验证MAC地址的最佳方法是使用
filter\u var
和常量
filter\u validate\u MAC

var_dump(filter_var('FA-F9-DD-B2-5E-0D',filter_VALIDATE_MAC));
//串(17)“FA-F9-DD-B2-5E-0D”
变量转储(过滤器变量('DC:BB:17:9A:CE:81',过滤器验证\U MAC));
//字符串(17)“DC:BB:17:9A:CE:81”
变量转储(过滤器变量('96-D5-9E-67-40-AB',过滤器验证MAC));
//管柱(17)“96-D5-9E-67-40-AB”
变量转储(过滤器变量('96-D5-9E-67-40',过滤器验证MAC));
//布尔(假)
变量转储(过滤器变量(“”,过滤器验证MAC));
//布尔(假)
所以你可以做:

if(false==filter\u var($\u GET['mac'],filter\u VALIDATE\u mac)){
抛出新\异常(“无效mac地址”);
}

如果您正在检查与DB的匹配,如果格式不正确,是否会返回
false
?上面的代码有什么问题?会的。但是在我得到正确的格式之前,我不想打扰数据库@OliverCharlesworth@andrewsi我猜它就在这里的某个地方(preg_match('/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/',$\u GET['mac'])==$GET_mac filter)因为它返回的是其他的。如果你仍然要检查与数据库的匹配,如果格式不正确,不会返回
false
吗?上面的代码有什么问题吗?会的。但是在我得到正确的格式之前,我不想打扰数据库@OliverCharlesworth@andrewsi我猜它在这里的某个地方
(preg_match('/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/',$\u GET['mac'])==$GET_mac filtered)
因为它会返回其他内容。直接在数据库中使用
&GET
不是很危险吗?如果我使用这样的
$GET\u mac\u filtered=preg\u replace('/[^a-fA-F0-9]/','',$GET['mac'])
它从地址中删除
。@Borsn?如果您遵循最佳实践并使用参数化查询,则不会。在任何情况下,正则表达式都会拒绝任何不需要的内容。直接在数据库中使用
&u GET
不是很危险吗?如果我使用类似这样的
$GET\u mac\u filtered=preg\u replace('/[^a-fA-F0-9]/','',$u GET['mac'])
它从地址中删除
。@Borsn?如果您遵循最佳实践并使用参数化查询,则不会。在任何情况下,正则表达式都会拒绝任何不需要的内容。