2016-05-06 12 views
0

私たちは、学生と教師がチャットコミュニケーションを介してコミュニケーションできるチャットアプリケーションを開発しています。ウェブサイトには課題があり、学生に関連する質問があれば、彼はその課題のURLを私たちは先生と学生の両方のセキュリティ上の理由から、特定のURLをホワイトリストに載せたいと思っています。phlのホワイトリストURL

メッセージがホワイトリストに登録されるようhttps://school.com/assignment/1425

リンクがクリック可能である。この割り当てに関連した質問:それは

メッセージ働くべきか、ここ

この割り当ては、いくつかの問題があるがhttps://schoool.com/assignment/1425

このリンクには、oがあります。我々の場合にはスパムとしてマークする必要があり、我々はそのリンクに

を削除しようとしている私たちはこのことについて行くことができる方法を見つけることができない、私たちは

https://school.comを期待している所望の出力の下に言及していますホワイトリスト

https://www.school.comホワイトリスト

http://school.comホワイトリスト

http://wwwschool.comホワイトリスト

school.comホワイトリスト

www.school.comホワイトリスト

www.schoool.comスパムURL

https://www.schoool.comスパムURL

www.schoool.comスパムURL

http://www.schoool.comスパムURL

schoool.comスパムURL

私たちの現在のコード

0123このコードで
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.com" を持っている

school.stealpassword.com

school.xxx

+0

多分これは、あなたがこのようにホワイトリストしているとき、私はそれだけでチェックするよりも、より具体的には有益であると言うでしょうhttps://regex101.com/r/mP4nB8/1 を助けることができますそれはいくつかの単語が含まれている場合:) – martindilling

答えて

2

許可するドメインのホワイトリストを定義し、組み込みの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 

ホワイトリストが出力されます。この程度以下

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 
+0

実装が簡単で理解しやすい:)ありがとうバディ:) – runningmark

0

のようなURLをホワイトリストされています。だからこの文字列全体を正規表現に追加してください。

1

何にwww.school.comwwwschool.comを追加しますか?

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

http://www.phpliveregex.com/p/fAU

+0

すべての文字を大文字にしてください。 –

+0

@LubosHoracek良いアイデア。次回まで覚えておくべきこと。 – Andreas

関連する問題