- Общение окон с разных доменов: postMessage
- Отправитель: метод postMessage
- Получатель: событие onmessage
- Итого
- Window.postMessage()
- Syntax
- The dispatched event
- Security concerns
- Secure shared memory messaging
- Example
- Notes
- Using window.postMessage in extensions This API has not been standardized.
- Использование JavaScript и window.postMessage()
- Два обязательных компонента и их синтаксис
- Пример
- Detect whether postMessage can send objects?
- 4 Answers 4
- Форум
- Справочник
- Обмен данными между доменами. Часть 2.
- HTML5: postMessage
- Пример
- Отправляющее окно
- Принимающее окно
- XMLHTTPRequest 2 / XDomainRequest
- Пример
- Реализация
- Дополнительные материалы
Общение окон с разных доменов: postMessage
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/cross-window-communication.
Интерфейс postMessage позволяет общаться друг с другом окнам и ифреймам с разных доменов.
Он очень удобен, например, для взаимодействия внешних виджетов и сервисов, подключённых через ифрейм с основной страницей.
Отправитель: метод postMessage
Первая часть интерфейса состоит из метода postMessage. Его вызывает окно, которое хочет отправить сообщение, в контексте окна-получателя.
Проще говоря, если мы хотим отправить сообщение в окно win , то нужно вызвать win.postMessage(data, targetOrigin) .
Данные. По спецификации, это может быть любой объект, который будет клонирован с сохранением структуры при передаче.
Но IE поддерживает только строки, поэтому обычно данные JSON-сериализуют.
Разрешить получение сообщения только окнам с данного источника.
Мы ведь не можем из JavaScript узнать, на каком именно URL находится другое окно. Но иногда хочется быть уверенным, что данные передаются в доверенный документ. Для этого и нужен этот параметр. Проверку осуществляет браузер. При указании ‘*’ ограничений нет.
В браузере IE, интерфейс postMessage работает только с ифреймами. Он не работает между табами и окнами.
Это ошибка в данном конкретном браузере, в других – всё в порядке. Детали по этой и связанным с ней ошибкам: HTML5 Implementation Issues in IE8 and later.
Получатель: событие onmessage
Чтобы получить сообщение, окно должно поставить обработчик на событие onmessage .
Свойства объекта события:
data Присланные данные origin Источник, из которого пришло сообщение, например http://javascript.ru . source Ссылка на окно, с которого пришло сообщение. Можно тут же ответить.
Назначать обработчик нужно обязательно через методы addEventListener/attachEvent , например:
Задержки между отправкой и получением нет, совсем.
Если для setTimeout стандарт предусматривает минимальную задержку 4 мс, то для postMessage она равна 0 мс. Поэтому postMessage можно, в том числе, использовать как мгновенную альтернативу setTimeout .
Итого
Интерфейс postMessage позволяет общаться окнам и ифреймам с разных доменов (в IE8 – только ифреймы), при этом обеспечивая проверки безопасности.
Window.postMessage()
The window.postMessage() method safely enables cross-origin communication between Window objects; e.g., between a page and a pop-up that it spawned, or between a page and an iframe embedded within it.
Normally, scripts on different pages are allowed to access each other if and only if the pages they originate from share the same protocol, port number, and host (also known as the «same-origin policy»). window.postMessage() provides a controlled mechanism to securely circumvent this restriction (if used properly).
Broadly, one window may obtain a reference to another (e.g., via targetWindow = window.opener ), and then dispatch a MessageEvent on it with targetWindow.postMessage() . The receiving window is then free to handle this event as needed. The arguments passed to window.postMessage() (i.e., the “message”) are exposed to the receiving window through the event object.
Syntax
The dispatched event
A window can listen for dispatched messages by executing the following JavaScript:
The properties of the dispatched message are:
data The object passed from the other window. origin The origin of the window that sent the message at the time postMessage was called. This string is the concatenation of the protocol and «://», the host name if one exists, and «:» followed by a port number if a port is present and differs from the default port for the given protocol. Examples of typical origins are https://example.org (implying port 443 ), http://example.net (implying port 80 ), and http://example.com:8080 . Note that this origin is not guaranteed to be the current or future origin of that window, which might have been navigated to a different location since postMessage was called. source A reference to the window object that sent the message; you can use this to establish two-way communication between two windows with different origins.
Security concerns
If you do not expect to receive messages from other sites, do not add any event listeners for message events. This is a completely foolproof way to avoid security problems.
If you do expect to receive messages from other sites, always verify the sender’s identity using the origin and possibly source properties. Any window (including, for example, http://evil.example.com ) can send a message to any other window, and you have no guarantees that an unknown sender will not send malicious messages. Having verified identity, however, you still should always verify the syntax of the received message. Otherwise, a security hole in the site you trusted to send only trusted messages could then open a cross-site scripting hole in your site.
Always specify an exact target origin, not * , when you use postMessage to send data to other windows. A malicious site can change the location of the window without your knowledge, and therefore it can intercept the data sent using postMessage .
Secure shared memory messaging
If postMessage() throws when used with SharedArrayBuffer objects, you might need to make sure you cross-site isolated your site properly. Shared memory is gated behind two HTTP headers:
- Cross-Origin-Opener-Policy with same-origin as value (protects your origin from attackers)
- Cross-Origin-Embedder-Policy with require-corp as value (protects victims from your origin)
To check if cross origin isolation has been successful, you can test against the crossOriginIsolated property available to window and worker contexts:
See also Planned changes to shared memory which is starting to roll out to browsers (Firefox 79, for example).
Example
Notes
Any window may access this method on any other window, at any time, regardless of the location of the document in the window, to send it a message. Consequently, any event listener used to receive messages must first check the identity of the sender of the message, using the origin and possibly source properties. This cannot be overstated: Failure to check the origin and possibly source properties enables cross-site scripting attacks.
As with any asynchronously-dispatched script (timeouts, user-generated events), it is not possible for the caller of postMessage to detect when an event handler listening for events sent by postMessage throws an exception.
After postMessage() is called, the MessageEvent will be dispatched only after all pending execution contexts have finished. For example, if postMessage() is invoked in an event handler, that event handler will run to completion, as will any remaining handlers for that same event, before the MessageEvent is dispatched.
The value of the origin property of the dispatched event is not affected by the current value of document.domain in the calling window.
For IDN host names only, the value of the origin property is not consistently Unicode or punycode; for greatest compatibility check for both the IDN and punycode values when using this property if you expect messages from IDN sites. This value will eventually be consistently IDN, but for now you should handle both IDN and punycode forms.
The value of the origin property when the sending window contains a javascript: or data: URL is the origin of the script that loaded the URL.
Using window.postMessage in extensions This API has not been standardized.
window.postMessage is available to JavaScript running in chrome code (e.g., in extensions and privileged code), but the source property of the dispatched event is always null as a security restriction. (The other properties have their expected values.)
It is not possible for content or web context scripts to specify a targetOrigin to communicate directly with an extension (either the background script or a content script). Web or content scripts can use window.postMessage with a targetOrigin of «*» to broadcast to every listener, but this is discouraged, since an extension cannot be certain the origin of such messages, and other listeners (including those you do not control) can listen in.
Content scripts should use runtime.sendMessage to communicate with the background script. Web context scripts can use custom events to communicate with content scripts (with randomly generated event names, if needed, to prevent snooping from the guest page).
Lastly, posting a message to a page at a file: URL currently requires that the targetOrigin argument be «*» . file:// cannot be used as a security restriction; this restriction may be modified in the future.
Использование JavaScript и window.postMessage()
Дата публикации: 2020-02-10
От автора: кросс-доменная связь (также называемая Cross-origin) может представлять угрозу безопасности. Однако в HTML5 есть полезная и часто упускаемая возможность window.postMessage(), которая при правильном использовании безопасна.
Как указано в MDN, — Метод window.postMessage() безопасно обеспечивает перекрестную связь между объектами Window; например, между страницей и всплывающим окном или между страницей и встроенным в нее фреймом.
В этой статье мы рассмотрим связи между окнами, а не окна с фреймом. Кстати, в определении MDN указано всплывающее окно, которое мы будем использовать, но оно не обязательно должно быть всплывающим.
Два обязательных компонента и их синтаксис
Два обязательных компонента:
window.postMessage() — отправляет сообщение
JavaScript. Быстрый старт
Изучите основы JavaScript на практическом примере по созданию веб-приложения
window.addEventListener(« message », callback ) — для получения и обработки сообщения
Синтаксис для метода postMessage():
Существует необязательный третий параметр [transfer], который мы не будем использовать. Вы можете прочитать больше о нем на MDN.
targetWindow — это обработчик для окна, в которое вы хотите отправить сообщение.
message может представлять собой довольно много сложных объектов. Однако функции не могут быть отправлены как часть сообщения, поскольку данные сообщения сериализуются с использованием алгоритма структурированного клонирования. Алгоритм структурированного клонирования не учитывает функции. Однако это означает, что вы можете безопасно передавать широкий спектр объектов данных.
targetOrigin — очень важная часть. Это URI страницы получателя. В момент отправки (postMessage), если targetOrigin действительно совпадает с именем хоста страницы targetWindow, он не сможет отправить сообщение.
Можно использовать «*» в качестве целевого идентификатора, но делайте это только для простого тестирования (как мы будем делать здесь).
Хочу особо подчеркнуть, в процессе производства на принимающей стороне вам нужно проверить домен получателей по отношению к targetOrigin. Если они не совпадают, не принимайте сообщение.
Предостережение: если в качестве targetOrigin используется «*», сообщение может быть откуда угодно. Имейте в виду, что мы обычно отправляем сообщение из одного домена в другой, поэтому targetOrigin должен соответствовать домену получателя targetWindow.
Другими словами, мы можем захотеть отправить сообщение с //abcd.com на //defg.com.Таким образом, targetOrigin будет //defg.com, а домен получателя будет //defg.com.
Пример
Мы создадим две веб-страницы с именами Page1.html и Page2.html. Page2.html будет всплывающим окном, что не обязательно, это просто мой выбор. Page1.html отправит сообщение на страницу Page2.html.
Создайте следующие файлы. Page1.html (обратите внимание на функцию sendMessage)
Detect whether postMessage can send objects?
I’m looking for a neat way to detect whether postMessage in the browser supports the sending and receiving of objects or just strings. I figure that someone out there must have wrote something that does this but I have not managed to find a solution.
I’m using postMessage to send data to/from a WebWorker. Whilst detecting whether the browser supports workers is straight-forward, detecting whether objects can be send via postMessage has proved more difficult.
I’d like to write a simple detection function. So, if the browser supports the sending of objects to use that. If only strings are allowed I can fallback to using JSON.stringify(). I’ll probably assign the function to a dojo/has test (although this is not relevant to the question/answer).
What have other people done to solve this problem? Any advice would be great, I’m new to both WebWorkers and postMessage. Thanks in advance.
4 Answers 4
I found an even easier way to detect if postMessage only supports strings or if it supports other types. Simply add a custom toString-method on the object. When trying to send an object with postMessage in IE8 and IE9 they will be converted to a string with the toString-method on the object. Since browsers that support sending objects doesn’t call toString we can use this to our advantage. This test is not async, so you’ll get the result instantly. Haven’t tested this with web-workers, but I suppose you can use the same technique.
Tested in IE8, IE9, IE10 and latest version of Chrome, Firefox, Safari and Opera: http://jsbin.com/igowoFaj/1/edit?js,console
Update: Did a BrowserScope test with many more tests and browsers. Conclusion is that it’s safe to send clonable objects, arrays, numbers, pixel data and array buffers if onlyStrings is false . In theory all browsers that allow sending objects should use the structured clone algorithm, but the Android browser and Opera Mobile has quirks. The BrowserScope test result is a bit hard to read, because a 0 for send_xxx is only problematic if the browser actually has support for that type, so check supports_xxx too. If they are equal it’s ok, but it’s a bug if the browser has support but can’t send (when onlyStrings is false).
Форум
Справочник
Обмен данными между доменами. Часть 2.
Эта статья является продолжением статьи Обмен данными для документов с разных доменов и рассматривает новые способы обмена данными между доменами, которые, однако, уже поддерживаются основными современными браузерами.
HTML5: postMessage
В стандарте HTML5 предусмотрена отсылка javascript-сообщения из одного окна в другое при помощи специального вызова window.postMessage .
При этом окна могут быть с любых доменов, не важно. Например, один iframe с yandex.ru , а другой — с vaysapupkin.info. Чтобы получать кросс-доменные сообщения, принимающее окно регистрирует специальный обработчик onmessage , в котором, кроме всего прочего, может проверить, с какого домена пришло сообщение.
Пример
В примере ниже используется iframe с домена javascript.ru, исходник которого приведен ниже, и iframe с домена ilyakantor.ru.
Как вы можете видеть, сообщение прекрасно пересылается. Пример работает в браузерах Firefox 3.5, Opera 10, Safari 4.0/Chrome 3.0+, Internet Explorer 8.0.
Отправляющее окно
Исходник окна, отправляющего сообщение:
Как видите, для передачи сообщения достаточно вызвать метод postMessage(message, targetOrigin) принимающего окна.
message Сообщение — javascript-объект targetOrigin Целевой домен, с которого должно быть окно, получающее сообщение. Если вы не хотите ограничить целевой домен — поставьте вместо него звездочку «*».
Принимающее окно
Исходный код принимающего окна (в ифрейме):
Обработчик события onmessage проверяет исходный домен, который находится в свойстве event.origin , и, если все нормально, выводит на экран сообщение event.data .
Все прозрачно и удобно.
Реализация postMessage браузерами использует внутренний механизм передачи сообщений, поэтому можно передавать любые объекты, а сам факт передачи никак не отслеживается снифферами пакетов.
Интерфейс поддерживается основными современными браузерами.
XMLHTTPRequest 2 / XDomainRequest
Уже давно в W3C вызревает второй стандарт XMLHTTPRequest 2. А пока суть да дело — Firefox 3.5, Safari 4/Chrome 3 и IE8 уже реализовали ряд фич.
Например, кросс-доменные запросы.
Пример
Следующий пример отправляет запрос с текущего домена (javascript.ru) на домен ilyakantor.ru.
Он не работает в старых браузерах и. в Opera.
Кросс-доменный запрос отсылается точно так же, как и обычный XMLHttpRequest, но браузер посылает на сервер дополнительный заголовок Origin .
Сервер в ответе указывает заголовком Access-Control-Allow-Origin , для каких доменов доступны данные. Ответ сервера:
Если вдруг домен, на который приходит ответ, не совпадает с Access-Control-Allow-Origin (можно указать звездочку «*» для любого домена), то браузер блокирует операцию из соображений безопасности.
Реализация
В то время как Firefox/Safari расширили обычный объект XMLHTTPRequest, специалисты Microsoft завели для кросс-доменных запросов новый объект XDomainRequest.
Оба объекта имеют весьма схожие интерфейсы, но решение Firefox/Safari более полно реализует XMLHTTPRequest 2. В частности, поддерживаются другие методы, кроме GET/POST, работа с Cookie/HTTP Auth и расширены средства контроля доступа.
Исходный код отсылающего запрос ифрейма:
Как видно из примера, в обоих реализациях можно отказаться от onreadystatechange и использовать события onload/onerror/onabort .
Кроме того, начиная с Firefox 3.5/Safari 4/IE8 поддерживается событие onprogress , предназначенное для реализации progress bar.
Конечно, можно написать кросс-браузерную обертку, которая будет прозрачно отправлять запросы, используя эти новые методы в дополнение к уже существующим.
Дополнительные материалы
Мы разобрали основы новых способов кросс-доменной коммуникации. При практической реализации вам могут понадобиться детали.
Могу порекомендовать следующие статьи.
то есть получается, что с помощью этой фичи можно xss атаки проводить еще проще. например, передать куки с одного домена ну другой ?
Если скрипт будет отдавать что попало кому попало, то да.
Именно этим разработчики оперы мотивируют категорическое нежелание делать возможность обычных кросс-браузерных запросов.
Ты хотел сказать кроссайтовые т.е. крос доменные a.com b.com
Гость что отпостил выше и viglim:
вы как бы не заметили строчку про то, что сервер к которому делается кросс запрос (уточнение идет даже относительно скрипта на серваке) должен разрешать делать к себе запросы, причем кого то может игнорировать.
поэтому уже безопасность будет зависить от прямоты рук тех, кто использует данный заголовок.
Прикольно полдня просидел в поисках решения передачи запроса с одного своего сайта на другой и вуаля.
Автору спасибо. От себя замечу: простой скриптик всего в несколько строчек работает на Мозиле (3.6) у меня без всяких выкрутасов (в других браузерах пока не проверял), всё, что здесь написано — не заработало у меня, хотя примеры на этой странице работают, как и написано. Эх, лень копаться в глюках.
Для передачи параметров на другой сайт всего лишь прописал строку, указанную в статье и всё:
Для передачи параметров на другой сайт всего лишь прописал строку, указанную в статье и всё:
А куда прописал? У меня похожая ситуация, получаю от сервера Origin «null» и пустой ответ. Подскажите.
ИЕ 7 и ИЕ 6 еще долго будут портить кровь программистам, не давая возможности использовать эти фишки, а это чуть больше 10% по статистики li
То есть таким способом, можно читать xml файлы с других доменов ?
XMLHTTPRequest 2 если не ошибаюсь, если делает запрос на другой домен, перед этим сначало запрашивает ту же страницу с методом OPTION. а уже потом идет запрос либо GET либо POST либо что то еще.
Здесь, при нажатии Отправить, сообщение посылается во фрейм. Если добавить второй фрейм с каким-либо сайтом, как послать в первый фрейм вместо сообщения адрес из второго фрейма?
С локального файла не работает — надо обязательно загрузить на реальный сервер
То есть убогий костыль!
Интересно что через яховский прокси работает отвосюду в том числе и с локального файла.
XMLHTTPRequest 2 / XDomainRequest
В недавно вышедшей опере 12.00 сделали
подскажите пожалуйста очень нужно. А как правильно формировать обращение к окну, если нам надо наоборот отправить обращение из ифрейма к перент окну? или как правильно обратиться к не вложенному, а соседнему ифрейму? (вопрос по способу postMessage)
Для отправления сообщения родительскому окну используйте конструкцию вида top.postMessage. А вот к соседнему фрейму, насколько я представляю себе модель безопасности при кросдоменных запросах, можно только через родительское окно.
Но лучше не изобретать велосипеды, а использовать библиотеку типа easyXDM (так же есть плагин для jQuery для работы с postMessage). Там все это реализовано довольно удобно, в том числе механизм удаленного вызова процедур, который является надстройкой над вот таким транспортом (или другим, если браузер не поддерживает его).
Ребят. Curl вам в помощь. Отправляете запрос на php на своем домене, Curl отправляет запрос на другой и возвращает ответ Вам. Если бы опера еще работала с этим, то было бы норм. А так через фреймы или отправлять Ajaxом. Ну нафиг. На php это 5 строчек и полная кроссбраузерность))
Это далеко не всегда и не всем подходит. Иногда нужно использовать именно клиентский вариант.
Curl, wget и любые другие серверные качалки для разовых задач, при этом нагрузка на сервер, что облегчается и ускоряется Ajax-ом.
Помогите, пожалуйста, разобраться с такой вот проблемой.
Делается кроссдоменный POST-запрос по отправке файла, в ответе идет строка с идентификатором добавленного объекта (Content-type: text/plain).
Все браузеры адекватно эту строку вынимают при помощи xhr.responseText, а вот у IE10 в xhr.responseText всегда пусто.
Что там может быть такое?
IE11, FR29.0.1
В этом браузере данная фича не поддерживается.
A very nice blog, I like the way you share very honestly and interestingly, through my blog I learned a lot of things. enable flash in chrome
If you set out to make me think today; mission accomplished! I really like your writing style and how you express your ideas. Thank you. alternatives to cable tv
I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
It was a great suggestion for me, thank you for sharing run 3
hi was just seeing if you minded a comment. I like your website and the them you picked are super. I will be back.
This article was written by a real thinking writer. I agree many of the with the solid points made by the writer. I’ll be back.
go here
Эта информация, которую вы даете, очень ценна для меня, я не всегда могу найти эти кодировки, спасибо. basketball legends 2020
I have read a few of the articles on your website now, and I really like your style of blogging. I added it to my favorites blog site list and will be checking back soon. Please check out my site as well and let me know what you think.
click this site
Very good points you wrote here..Great stuff. I think you’ve made some truly interesting points.Keep up the good work.
Click here
I do not know what to say really what you share very well and useful to the community, I feel that it makes our community much more developed, thanks basketball legends
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
binary options
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
covid cozumel
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
pousada no rio araguaia
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
online marketing
Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic.
bridgend house clearance
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
taco bar
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
okos ügyvéd Debrecen
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web.
nemzetközi szállítmányozás nagyobb biztonság
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web.
Buy Website Traffic
Interesting post. I Have Been wondering about this issue, so thanks for posting. Pretty cool post.It ‘s really very nice and Useful post.Thanks
Curcumin vs Turmeric
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
p405
Really a great addition. I have read this marvelous post. Thanks for sharing information about it. I really like that. Thanks so lot for your convene.
Gmail PVA Accounts
Thanks for taking the time to discuss this, I feel strongly that love and read more on this topic. If possible, such as gain knowledge, would you mind updating your blog with additional information? It is very useful for me.
https://joo-petri.com/
Your content is nothing short of brilliant in many ways. I think this is engaging and eye-opening material. Thank you so much for caring about your content and your readers.
tulum cenotes
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web.
schluesseldienst köln
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web.
آموزش سیستم هوشمند
Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place..
water features coventry
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web.
serralheria df
Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic. If possible, as you gain expertise, would you mind updating your blog with more information? It is extremely helpful for me.
reforma de sofa brasilia
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
cancun
I really loved reading your blog. It was very well authored and easy to understand. Unlike other blogs I have read which are really not that good.Thanks alot!
építési pályázatírás Debrecen
this is really nice to read..informative post is very good to read..thanks a lot!
youtube shares
This is my first time visit here. From the tons of comments on your articles,I guess I am not only one having all the enjoyment right here!
cenote azul Tulum
Thanks for sharing this information. I really like your blog post very much. You have really shared a informative and interesting blog post with people..
rumah pintar
Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic. If possible, as you gain expertise, would you mind updating your blog with more information? It is extremely helpful for me.
nemzetközi szállítmányozás ajánlat
I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post.
beach in cozumel
Very nice article, I enjoyed reading your post, very nice share, I want to twit this to my followers. Thanks!.
attractions in tulum
I really loved reading your blog. It was very well authored and easy to undertand. Unlike additional blogs I have read which are really not tht good. I also found your posts very interesting. In fact after reading, I had to go show it to my friend and he ejoyed it as well!
beach restaurant cancun
An fascinating discussion is value comment. I think that it is best to write extra on this matter, it won’t be a taboo topic however generally people are not enough to talk on such topics. To the next. Cheers
treatnheal
I can see that you are an expert at your field! I am launching a website soon, and your information will be very useful for me.. Thanks for all your help and wishing you all the success in your business.
jr mudanças
You have a good point here!I totally agree with what you have said!!Thanks for sharing your views. hope more people will read this article.
mudanças em brasília
oma sex sa – amazing web place for free hot chat with sexy young local ladies
Your blog provided us with valuable information to work with. Each & every tips of your post are awesome. Thanks a lot for sharing. Keep blogging,
Automatyka hoteli
Great write-up, I am a big believer in commenting on blogs to inform the blog writers know that they’ve added something worthwhile to the world wide web.
luxury bathroom vanity
You have a real ability for writing unique content. I like how you think and the way you represent your views in this article. I agree with your way of thinking. Thank you for sharing.
best place to stay in tulum
This is just the information I am finding everywhere. Thanks for your blog, I just subscribe your blog. This is a nice blog..
coronavirus yucatan
I like this post,And I guess that they having fun to read this post,they shall take a good site to make a information,thanks for sharing it to me.
Best food in Hualien
Great job for publishing such a beneficial web site. Your web log isn’t only useful but it is additionally really creative too. There tend to be not many people who can certainly write not so simple posts that artistically. Continue the nice writing
Hualien attractions