Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中的URL白名单_Php_Url_Preg Match - Fatal编程技术网

php中的URL白名单

php中的URL白名单,php,url,preg-match,Php,Url,Preg Match,我们正在开发一个聊天应用程序,学生和老师可以通过聊天通信进行交流,现在网站上有作业,如果学生有相关问题,他可以在信息中包含作业的url,现在,出于教师和学生的安全考虑,我们希望在某些URL上列出白名单 下面是它应该如何工作 消息:与此作业相关的问题 链接是可点击的,因为它是白名单 消息:此作业存在一些问题 这个链接有一个额外的o,在我们的例子中应该标记为垃圾邮件,我们将删除该链接 我们无法找到如何进行这项工作,我在下面提到我们期望的预期输出 https://school.com白名单 https

我们正在开发一个聊天应用程序,学生和老师可以通过聊天通信进行交流,现在网站上有作业,如果学生有相关问题,他可以在信息中包含作业的url,现在,出于教师和学生的安全考虑,我们希望在某些URL上列出白名单

下面是它应该如何工作

消息:与此作业相关的问题

链接是可点击的,因为它是白名单

消息:此作业存在一些问题

这个链接有一个额外的
o
,在我们的例子中应该标记为垃圾邮件,我们将删除该链接

我们无法找到如何进行这项工作,我在下面提到我们期望的预期输出

https://school.com
白名单

https://www.school.com
白名单

http://school.com
白名单

http://wwwschool.com
白名单

school.com
白名单

www.school.com
白名单

www.school.com
垃圾邮件url

https://www.schoool.com
垃圾邮件url

www.school.com
垃圾邮件url

http://www.schoool.com
垃圾邮件url

school.com
垃圾邮件url

我们当前的代码

function filter_url($string = null)
{
    $url = '/(((https?:\/\/)?www)?\.?[a-z0-9]+\.[a-z0-9]+[a-z0-9\-\/?&#%=]+)/';
    $whitelist = '/\b(school)\b/';
    if(preg_match($url,$string,$output))
    {
        if(preg_match($whitelist,$output[0]))
        {
            // whitelisted string
            return $string;
        }
        else
        {
            return null;
        }
     }
 }
这段代码的问题是,它将URL列为白名单,如

school.stealpassword.com


school.xxx

所有白名单上的URL都有一个共同的“school.com”。因此,将整个字符串添加到您的regexp。

所有白名单URL都有一个共同的“school.com”。因此,将整个字符串添加到您的regexp。

为您想要允许的域定义一个白名单,然后使用内置的
parse_url
php函数从url中提取域并对照白名单进行检查

$testLinks = [
    'https://school.com',
    'https://www.school.com',
    'http://school.com',
    'http://wwwschool.com',
    'school.com',
    'www.school.com',
    'www.schoool.com',
    'https://www.schoool.com',
    'www.schoool.com',
    'http://www.schoool.com',
    'schoool.com'
];

$whitelistDomains = [
    'school.com'
];

foreach($testLinks as $link){
    print $link . ' is ' . (checkUrl($link,$whitelistDomains)===TRUE? 'valid':'spam'). PHP_EOL;
}


function checkUrl($link,$whitelistDomains)
{

    $urlData = parse_url($link);

    $domain = isset($urlData['host'])? $urlData['host'] : $link;

    if (in_array($domain,$whitelistDomains)){
        return true;
    }
    else{
        return false;
    }   

}
将输出

https://school.com is valid
https://www.school.com is spam
http://school.com is valid
http://wwwschool.com is spam
school.com is valid
www.school.com is spam
www.schoool.com is spam
https://www.schoool.com is spam
www.schoool.com is spam
http://www.schoool.com is spam
schoool.com is spam
www.school.com
wwwschool.com
添加到白名单将输出以下内容

https://school.com is valid
https://www.school.com is valid  // this becomes valid
http://school.com is valid
http://wwwschool.com is valid // this becomes valid
school.com is valid
www.school.com is valid
www.schoool.com is spam
https://www.schoool.com is spam
www.schoool.com is spam
http://www.schoool.com is spam
schoool.com is spam

为您想要允许的域定义一个白名单,然后使用内置的
parse_url
php函数从url中提取域并对照白名单进行检查

$testLinks = [
    'https://school.com',
    'https://www.school.com',
    'http://school.com',
    'http://wwwschool.com',
    'school.com',
    'www.school.com',
    'www.schoool.com',
    'https://www.schoool.com',
    'www.schoool.com',
    'http://www.schoool.com',
    'schoool.com'
];

$whitelistDomains = [
    'school.com'
];

foreach($testLinks as $link){
    print $link . ' is ' . (checkUrl($link,$whitelistDomains)===TRUE? 'valid':'spam'). PHP_EOL;
}


function checkUrl($link,$whitelistDomains)
{

    $urlData = parse_url($link);

    $domain = isset($urlData['host'])? $urlData['host'] : $link;

    if (in_array($domain,$whitelistDomains)){
        return true;
    }
    else{
        return false;
    }   

}
将输出

https://school.com is valid
https://www.school.com is spam
http://school.com is valid
http://wwwschool.com is spam
school.com is valid
www.school.com is spam
www.schoool.com is spam
https://www.schoool.com is spam
www.schoool.com is spam
http://www.schoool.com is spam
schoool.com is spam
www.school.com
wwwschool.com
添加到白名单将输出以下内容

https://school.com is valid
https://www.school.com is valid  // this becomes valid
http://school.com is valid
http://wwwschool.com is valid // this becomes valid
school.com is valid
www.school.com is valid
www.schoool.com is spam
https://www.schoool.com is spam
www.schoool.com is spam
http://www.schoool.com is spam
schoool.com is spam
这个怎么样

preg_match("/(([h|H]ttps?:\/\/)?[w|W]ww)?\.?([s|S]chool\.com.*)/", $input, $output);
这个怎么样

preg_match("/(([h|H]ttps?:\/\/)?[w|W]ww)?\.?([s|S]chool\.com.*)/", $input, $output);

当你在这样的白名单中时,这可能会有所帮助,我想说的是,更具体一些,而不仅仅是检查它是否包含一些单词:)当你在这样的白名单中时,这可能会有所帮助,我想说的是,比仅仅检查它是否包含一些单词更具体一些是有益的:)易于实现和易于理解:)感谢好友:)易于实现和易于理解:)感谢好友:)并且在匹配之前让所有字母都是大写-只是小写以使其更简单。@LubosHoracek好主意。要记住的东西,直到下一次。在匹配之前,让所有字母都是大写的-只是小写的。@LubosHoracek好主意。下一次要记住的东西。