2008-11-03 5 views
2

같은 기능을 필요에 맞게. 오탐 (false positive)이 없습니다. 위조 방지.자바 스크립트 기능은 구글 URL을

는 다행히 참고로 this있다 :

.google.com에 .google.ad .google.ae .google.com.af .google.com.ag .google.com.ai .google. am.google.it.ao.google.com.ar .google.as.google.at .google.com.au .google.az.google.ba .google.com.bd .google.be .google.bg. google.com.bh .google.bi .google.com.bn .google.com.bo .google.com.br .google.bs .google.co.bw .google.com.by .google.com.bz. google.ca .google.cd .google.cg .google.ch .google.ci .google.co.kr .google.cl .google.cn .google.com.co .google.co.cr .google.com. cu .google.cz .google.de .google.dj .google.dk .google.dm .google.com.do .google.dz .google.com.ec .google.ee .google.com.eg .google. es .google.com.et .google.fi .goog le.com.fj .google.fm .google.fr .google.ge .google.gg .google.com.gh .google.com.gi .google.gl .google.gm .google.gp .google.gr. google.com.gt .google.gy.google.com.hk .google.hn .google.hr .google.ht .google.hu .google.co.id .google.ie .google.co.il .google. im.google.co.in .google.is.google.it.google.je .google.com.jm .google.jo .google.co.jp .google.co.kr .google.com.kh .google. ki .google.kg .google.co.kr .google.kz .google.la .google.li.google.lk .google.co.kr .google.lt .google.lu.google.lv .google.com. ly .google.co.ma .google.md .google.mn .google.ms .google.com.mt .google.mu .google.mv .google.mw .google.com.mx .google.com.my. google.co.mz .google.com.na .google.com.nf .google.com.ng .google.com.ni.google.nl .google.no.google.com.np .google.nr .google. nu .google.co.nz .google.com.om .google.com.pa .google.com.pe .google.com.ph .google.com.pk .google.pl .google.pn .google.com. pr.google.pt .google.com.py .google.com.qa .google.ro.google.ru.google.rw .google.com.sa .googl e.com.sb .google.sc .google.se .google.com.sg .google.sh .google.si .google.sk .google.sn .google.sm .google.st .google.com.sv. google.co.th .google.com.tj .google.tk .google.tl .google.tm .google.to .google.com.tr .google.tt .google.com.tw .google.co.tz. google.com.ua .google.co.ug.google.co.uk .google.com.uy .google.co.uz .google.com.vc .google.co.ve .google.vg .google.co. vi .google.com.vn .google.vu .google.ws .google.rs .google.co.zw .google.cat

이것을 우아하게하기 위해서?

어떤 해명 :

  • 나는 현재는 google.com 작동 (뿐만 아니라 다른 모든 TLD를 위해 일해야)한다는 쓴 그리스 몽키 스크립트이 필요합니다. Here은 스크립트입니다 (Google 리더를 와이드 스크린에서 더 잘 작동하도록 수정 함).
  • 위 도메인에 속하는 URL에서 작동해야합니다 (예 : blogger.com 등).
+0

위양성과 위음성이없는 것은 중요하지 않습니다. http://google.rs.mydomain.com/hi에서 페이지를 만들면 어떻게됩니까? –

+1

위의 도메인 허용 목록에 google.rs.mydomain.com이 표시되지 않습니다. – theraccoonbear

답변

6

여기에 언급 된 두 가지 문제를 해결하는 Prestaul의 대답이 업데이트되었습니다.

var GOOGLE_DOMAINS = ([ 
    '.google.com', 
    '.google.ad', 
    '.google.ae', 
    '.google.com.af', 
    '.google.com.ag', 
    '.google.com.ai', 
    '.google.am', 
    '.google.it.ao', 
    '.google.com.ar', 
    '.google.as', 
    '.google.at', 
    '.google.com.au', 
    '.google.az', 
    '.google.ba', 
    '.google.com.bd' 
]).join('\n'); 

function isGoogleUrl(url) { 
    // get the 2nd level domain from the url 
    var domain = /^https?:\/\/[^\///]*(google\.[^\/\\]+)\//i.exec(url); 
    if(!domain) return false; 

    domain = '.'+domain[1]; 
    // create a regex to check to see if the domain is supported 
    var re = new RegExp('^' + domain.replace(/\./g, '\\.') + '$', 'mi'); 
    return re.test(GOOGLE_DOMAINS); 
} 

alert(isGoogleUrl('http://www.google.ba/the/page.html')); // true 
alert(isGoogleUrl('http://some_mal_site.com/http://www.google.ba/')); // false 
alert(isGoogleUrl('https://google.com.au/')); // true 
alert(isGoogleUrl('http://www.google.com.some_mal_site.com/')); // false 
alert(isGoogleUrl('http://yahoo.com/')); // false 
1

다른 Google 제품을 "Google에 속한 제품"으로 간주합니까? FeedBurner, Blogger 등?

이 문서의 목적이 무엇인지 물어볼 수 있습니까? 당신이 원하는 것을하는 더 좋은 방법이있을 수 있습니다 ... 그리고 합리적인 경우에는 당신을 위해 내부적으로 요청할 수 있습니다.

+0

그렇다면 도메인을 핑 (ping)하여 Google의 ips를 반환하는지 확인할 수 있습니까? – Karan

+0

일치시킬 IP 주소 (또는 범위)가 많을 것으로 추측되며 시간이 지남에 따라 크게 달라질 수 있습니다. –

0

나는이 클라이언트 쪽을 수행하지 않을 것이다.

Google 도메인 목록은 자주 변경되지 않으므로 서버 측 목록을 저장 한 다음 .js를 동적으로 생성하여 확인할 수 있습니다.

+1

자주 변경되지 않는다는 사실은 서버 측에서 동적으로 .js를 생성하는 인수가 될 수 있습니다. –

-1

각 TLD마다 개별적으로 일치하는 정규식이 없으면 실제로 '우아한 방법'이 아닙니다.

0

정규식이 필요할 수 있습니다. 그렇지 않으면 "false"를

<script> 
var elem = document.getElementById("a"); 
var regex = new RegExp("(http://)?(www\\.)?google\\.com"); 

elem.innerHTML = regex.test(elem.innerHTML); 
</script> 

이 스팬 요소 "A"의 콘텐츠를 것이며, google.com 경우 "true"로 변경 것이며, : 예입니다. 정규 표현식은 쉽게 수정할 수 있지만 (예 : "pages.google.com") 일치하지 않을 수도 있지만 다른 모든 URL은 고려하지 않습니다.

또한 URL에 모두 "."이 있습니다. 그 전에 ("google.com"대신 ". google.com"). 이것은 어떤 이유가 있거나 그냥 실수입니까?

1

100 % 정확하다고 테스트를 필요로하지 않는 경우,이 간단한 정규식 당신이 위에 게시 된 모든 도메인을 위해 할 것입니다 ". .google"그냥의 존재를 테스트

"(http://)?([\w]+)?\.google\.([\w]{2,3})" 

URL에 "google"도메인을 추가하여 쉽게 속일 수 있지만 대부분의 경우 충분합니다 (쉽지는 않지만 신속하게 완료되지 않습니다).

또는 Google에서 자체 Google TLD 구매를 기다리십시오.

+0

저는이 정규식이 www.google.some_mal_site.com과 같은 사이트를 허용 할 것이라고 확신합니다. 나는 그것을 원하지 않습니다. –

0
당신은 같은 정규 표현식을 사용할 수

....

^https?://[-A-Za-z0-9\.]+(\.google\.com|\.google\.ad|\.google\.ae|\.google\.com\.af|\.google\.com\.ag|\.google\.com\.ai|\.google\.am|\.google\.it\.ao|\.google\.com\.ar|\.google\.as|\.google\.at|\.google\.com\.au|\.google\.az|\.google\.ba|\.google\.com\.bd|\.google\.be|\.google\.bg|\.google\.com\.bh|\.google\.bi|\.google\.com\.bn|\.google\.com\.bo|\.google\.com\.br|\.google\.bs|\.google\.co\.bw|\.google\.com\.by|\.google\.com\.bz|\.google\.ca|\.google\.cd|\.google\.cg|\.google\.ch|\.google\.ci|\.google\.co\.ck|\.google\.cl|\.google\.cn|\.google\.com\.co|\.google\.co\.cr|\.google\.com\.cu|\.google\.cz|\.google\.de|\.google\.dj|\.google\.dk|\.google\.dm|\.google\.com\.do|\.google\.dz|\.google\.com\.ec|\.google\.ee|\.google\.com\.eg|\.google\.es|\.google\.com\.et|\.google\.fi|\.google\.com\.fj|\.google\.fm|\.google\.fr|\.google\.ge|\.google\.gg|\.google\.com\.gh|\.google\.com\.gi|\.google\.gl|\.google\.gm|\.google\.gp|\.google\.gr|\.google\.com\.gt|\.google\.gy|\.google\.com\.hk|\.google\.hn|\.google\.hr|\.google\.ht|\.google\.hu|\.google\.co\.id|\.google\.ie|\.google\.co\.il|\.google\.im|\.google\.co\.in|\.google\.is|\.google\.it|\.google\.je|\.google\.com\.jm|\.google\.jo|\.google\.co\.jp|\.google\.co\.ke|\.google\.com\.kh|\.google\.ki|\.google\.kg|\.google\.co\.kr|\.google\.kz|\.google\.la|\.google\.li|\.google\.lk|\.google\.co\.ls|\.google\.lt|\.google\.lu|\.google\.lv|\.google\.com\.ly|\.google\.co\.ma|\.google\.md|\.google\.mn|\.google\.ms|\.google\.com\.mt|\.google\.mu|\.google\.mv|\.google\.mw|\.google\.com\.mx|\.google\.com\.my|\.google\.co\.mz|\.google\.com\.na|\.google\.com\.nf|\.google\.com\.ng|\.google\.com\.ni|\.google\.nl|\.google\.no|\.google\.com\.np|\.google\.nr|\.google\.nu|\.google\.co\.nz|\.google\.com\.om|\.google\.com\.pa|\.google\.com\.pe|\.google\.com\.ph|\.google\.com\.pk|\.google\.pl|\.google\.pn|\.google\.com\.pr|\.google\.pt|\.google\.com\.py|\.google\.com\.qa|\.google\.ro|\.google\.ru|\.google\.rw|\.google\.com\.sa|\.google\.com\.sb|\.google\.sc|\.google\.se|\.google\.com\.sg|\.google\.sh|\.google\.si|\.google\.sk|\.google\.sn|\.google\.sm|\.google\.st|\.google\.com\.sv|\.google\.co\.th|\.google\.com\.tj|\.google\.tk|\.google\.tl|\.google\.tm|\.google\.to|\.google\.com\.tr|\.google\.tt|\.google\.com\.tw|\.google\.co\.tz|\.google\.com\.ua|\.google\.co\.ug|\.google\.co\.uk|\.google\.com\.uy|\.google\.co\.uz|\.google\.com\.vc|\.google\.co\.ve|\.google\.vg|\.google\.co\.vi|\.google\.com\.vn|\.google\.vu|\.google\.ws|\.google\.rs|\.google\.co\.za|\.google\.co\.zm|\.google\.co\.zw|\.google\.cat) 

나는 배열이나 다른 데이터 세트가 상대적으로 쉬울 것이다에서 자바 스크립트 (또는 어떤 언어 선택) 것을 생성 상상 것 .

+0

'www.google.com.other.site.com'과 일치합니까? –

1

나는이 작업을해서는 안되는 것에 동의합니다. 그러나 이전에 제안 된 솔루션에 만족하지 않아서 Google과 같은 패턴을 확인한 경우) 내가 접근 할 방법은 다음과 같습니다

var GOOGLE_DOMAINS = ([ 
    '.google.com', 
    '.google.ad', 
    '.google.ae', 
    '.google.com.af', 
    '.google.com.ag', 
    '.google.com.ai', 
    '.google.am', 
    '.google.it.ao', 
    '.google.com.ar', 
    '.google.as', 
    '.google.at', 
    '.google.com.au', 
    '.google.az', 
    '.google.ba', 
    '.google.com.bd' 
]).join('\n'); 

function isGoogleUrl(url) { 
    var url = 'http://www.google.ba/the/page.html'; 

    // get the domain from the url 
    var domain = /\.google\.[^\/\\]+/i.exec(url) + ''; 
    if(!domain) return false; 

    // create a regex to check to see if the domain is supported 
    var re = new RegExp('^' + domain.replace(/\./g, '\\.') + '$', 'mi'); 
    return re.test(GOOGLE_DOMAINS); 
} 

이 도메인에 URL을 기반으로 정규식을 만들고 도메인 목록을 테스트하는 데 사용합니다.

참고 : GOOGLE_DOMAINS 변수는 게시 한 URL에서 반환 된 내용을 보유하는 문자열입니다. AJAX 또는 iframe을 통해 해당 문자열을 검색 할 수있는 방법은 없습니다. 도메인에서 이러한 요청을 할 수 없기 때문입니다. 하드 코드를 작성하거나 목록을 검색하기 위해 서버 쪽에서 요청해야합니다.

+0

이 정규식은 도메인 이름 만 캡처하고 '.google'을 캡처하지 않습니다. URL을 따라 더 많이 나타 납니까? –

+0

URL에서 첫 번째 점 - 점 - 점 - 점을 캡처합니다. 존재하지 않으면 함수는 false를 반환하고 도메인 목록이 존재하면 "google-ish"도메인이 목록에 있는지 확인합니다. – Prestaul

+0

은 isGoogleUrl ('http://www.malware.cn/www.google.ba/page.html')을 허용하고 isGoogleUrl ('http://google.com/')을 허용하지 않으므로 조정해야합니다. – wimh

2

모든 도메인은 "google.it.ao"와 "구글에서 제외 하나"google.xx ","google.co.xx "또는"google.com.xx '에서 끝난다.co.kr "이므로 도메인을 보면이 정규 표현식이 대부분의 경우에 작동합니다 (완벽하지는 않지만 열거 된 모든 도메인을 허용하고"google "을 포함하는 다른 유효한 도메인을 거부합니다) :

당신이 뭔가를 할 수있는 기능으로
/^(\w+\.)*google\.((com\.|co\.|it\.)?([a-z]{2})|com)$/i 

:

function isGoogleUrl(url) { 
    url = url.replace(/^https?:\/\//i, ''); // Strip "http://" from the beginning 
    url = url.replace(/\/.*/, ''); // Strip off the path 
    return /^(\w+\.)*google\.((com\.|co\.|it\.)?([a-z]{2})|com)$/i.test(url); 
} 

당신이 window.location.hostname 사용하는 경우 당신은 그것을 단순화 수 :

function isGoogleUrl() { 
    return /^(\w+\.)*google\.((com\.|co\.|it\.)?([a-z]{2})|com)$/i.test(window.location.hostname); 
} 

유일한 방법이 "google. (다른 TLD)"이 있으면 거짓 긍정을 허용해야합니다. 예를 들어 'google.tv'는 목록에 없지만 google.com으로 리디렉션되지만 통과합니다.

편집 : Wimmel이 지적한 것처럼 "google.com.fr"과 같은 잘못된 도메인은 허용되지 않습니다. 기본적으로 "google.whatever"도메인 이름을 허용합니다.

+0

내게는 google.com.fr이 허용되는데 google.fr이 유효한 곳입니다. – wimh

+0

있습니다. 확실히 완벽하지는 않습니다. 그것은 각각의 유효한 도메인을 나열하지 않고 생각할 수있는 가장 가까운 것입니다. 어쩌면 나는 그 대답을 더 분명히해야 할 것입니다. –

관련 문제