Встроенный метод определения того, удовлетворяют ли два URL одной и той же политике происхождения в ruby

Я написал некорректную реализацию обнаружения двух URL в одном домене. Я понимаю, что это не ракетостроение, но, похоже, будет стандартная библиотека, в которой есть эта встроенная библиотека. Мой гугл-фу подвел меня. Существуют ли какие-либо библиотеки, к которым я могу требовать или приписывать код, обработанный грузом?

SOP говорит, что схема, порт идентичны и хосты совпадают, а поддомен (ы) является / является подмножеством источника

так

google.com matches google.com
a.google.com matches google.com

Оказывается

a.b.google.com matches [b.google.com, google.com] but not [c.b.google.com, a.google.com]

Это применимо только тогда, когда вы можете манипулировать document.domain, что не так для меня. Требуются прямые совпадения с хостом.

1 ответ

Решение

Из этой статьи в Википедии видно, что схема, хост и порт должны быть одинаковыми, чтобы соответствовать одной и той же политике происхождения.

http://en.wikipedia.org/wiki/Same_origin_policy

require 'uri'

class SameOrigin
  def self.test(str1, str2)
    uri1 = URI.parse(str1)
    uri2 = URI.parse(str2)
    uri1.scheme == uri2.scheme && uri1.host == uri2.host && uri1.port == uri2.port
  end
end

SameOrigin.test "http://google.com", "http://google.com"     # => true
SameOrigin.test "http://google.com:80", "http://google.com"  # => true
SameOrigin.test "http://google.com", "http://www.google.com" # => false
SameOrigin.test "https://google.com", "http://google.com"    # => false

Если вы используете библиотеку Domainatrix, я обнаружил, что вы можете изменить код на что-то вроде этого для своего теста, но он работает немного медленно для меня. Другой вариант - использовать этот RegEx для поиска домена URL. RegEx работает быстрее, но может работать не во всех случаях. Я нашел RegEx здесь, кстати.

Удалить поддомен из строки в ruby

require 'rubygems'
require 'domainatrix'
require 'uri'

class SameOrigin
  def self.relaxed_test(str1, str2)
    d1 = Domainatrix.parse(str1)
    d1 = Domainatrix.parse(str2)

    uri1 = URI.parse(str1)
    uri2 = URI.parse(str2)

    uri1.scheme == uri2.scheme && 
    d1.domain == d1.domain && 
    d1.public_suffix == d1.public_suffix && 
    uri1.port == uri2.port
  end

  def self.relaxed_test2(str1, str2)
    uri1 = URI.parse(str1)
    uri2 = URI.parse(str2)

    re = /^(?:(?>[a-z0-9-]*\.)+?|)([a-z0-9-]+\.(?>[a-z]*(?>\.[a-z]{2})?))$/i
    domain1 = uri1.host.gsub(re, '\1').strip
    domain2 = uri2.host.gsub(re, '\1').strip

    uri1.scheme == uri2.scheme && domain1 == domain2 && uri1.port == uri2.port
  end
end

SameOrigin.relaxed_test "http://google.com", "http://google.com"     # => true
SameOrigin.relaxed_test "http://google.com:80", "http://google.com"  # => true
SameOrigin.relaxed_test "http://google.com", "http://www.google.com" # => false
SameOrigin.relaxed_test "https://google.com", "http://google.com"    # => false

SameOrigin.relaxed_test2 "http://google.com", "http://google.com"     # => true
SameOrigin.relaxed_test2 "http://google.com:80", "http://google.com"  # => true
SameOrigin.relaxed_test2 "http://google.com", "http://www.google.com" # => false
SameOrigin.relaxed_test2 "https://google.com", "http://google.com"    # => false
Другие вопросы по тегам