我可以使用客户端 Javascript 执行 DNS 查找(主机名到 IP 地址)吗?

发布于 2024-07-05 11:48:12 字数 66 浏览 4 评论 0 原文

我想使用客户端 Javascript 来执行从客户端计算机看到的 DNS 查找(主机名到 IP 地址)。 那可能吗?

I would like to use client-side Javascript to perform a DNS lookup (hostname to IP address) as seen from the client's computer. Is that possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(16

神经暖 2024-07-12 11:48:12

确保您可以通过使用 dns browser.dns.resolve("example.com"); 的这种方法来做到这一点,而无需使用任何添加,只需纯 JavaScript
但它仅与 FIREFOX 60 兼容,您可以在 MDN https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve

sure you can do that without using any addition, just pure javascript, by using this method of dns browser.dns.resolve("example.com");
but it is compatible just with FIREFOX 60 you can see more information on MDN https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve

夏见 2024-07-12 11:48:12

我认为出于安全原因,大多数浏览器都不允许这样做,正如问题所要求的那样,在纯 JavaScript 上下文中。

I don't think this is allowed by most browsers for security reasons, in a pure JavaScript context as the question asks.

疏忽 2024-07-12 11:48:12

我的版本是这样的:

我的服务器上的php:

<?php
    header('content-type: application/json; charset=utf-8');

    $data = json_encode($_SERVER['REMOTE_ADDR']);


    $callback = filter_input(INPUT_GET, 
                 'callback',
                 FILTER_SANITIZE_STRING, 
                 FILTER_FLAG_ENCODE_HIGH|FILTER_FLAG_ENCODE_LOW);
    echo $callback . '(' . $data . ');';
?>

页面上的jQuery:

var self = this;
$.ajax({
    url: this.url + "getip.php",
    data: null,
    type: 'GET',
    crossDomain: true,
    dataType: 'jsonp'

}).done( function( json ) {

    self.ip = json;

});

它可以跨域工作。
它可以使用状态检查。 正在努力。

My version is like this:

php on my server:

<?php
    header('content-type: application/json; charset=utf-8');

    $data = json_encode($_SERVER['REMOTE_ADDR']);


    $callback = filter_input(INPUT_GET, 
                 'callback',
                 FILTER_SANITIZE_STRING, 
                 FILTER_FLAG_ENCODE_HIGH|FILTER_FLAG_ENCODE_LOW);
    echo $callback . '(' . $data . ');';
?>

jQuery on the page:

var self = this;
$.ajax({
    url: this.url + "getip.php",
    data: null,
    type: 'GET',
    crossDomain: true,
    dataType: 'jsonp'

}).done( function( json ) {

    self.ip = json;

});

It works cross domain.
It could use a status check. Working on that.

吾家有女初长成 2024-07-12 11:48:12

编辑:这个问题让我很痒,所以我在 Google App Engine 上建立了一个 JSONP Web 服务来返回客户端的 IP 地址。 用法:

<script type="application/javascript">
function getip(json){
  alert(json.ip); // alerts the ip address
}
</script>

<script type="application/javascript" src="http://jsonip.appspot.com/?callback=getip"> </script>

是的,不需要服务器代理。


纯JS不行。 如果您在同一域下有一个打印它的服务器脚本,您可以发送一个 XMLHttpRequest 来读取它。

Edit: This question gave me an itch, so I put up a JSONP webservice on Google App Engine that returns the clients ip address. Usage:

<script type="application/javascript">
function getip(json){
  alert(json.ip); // alerts the ip address
}
</script>

<script type="application/javascript" src="http://jsonip.appspot.com/?callback=getip"> </script>

Yay, no server proxies needed.


Pure JS can't. If you have a server script under the same domain that prints it out you could send a XMLHttpRequest to read it.

夜灵血窟げ 2024-07-12 11:48:12

我知道这个问题很久以前就被问过,但我想我应该提供一个更新的答案。

DNS over HTTPS (DoH)

您可以通过 HTTPS 将 DNS 查询发送到支持它的 DNS 解析器。 RFC 8484 中描述了 DOH 的标准。

这与所有其他答案所暗示的类似,只是 DoH 实际上是基于 HTTPS 的 DNS 协议。 它也是一个“提议的”互联网标准,并且变得非常流行。 例如,一些主要浏览器要么支持它,要么计划支持它(Chrome、Edge、Firefox),而微软正在将其构建到他们的操作系统中。

卫生部的目的之一是:

允许 Web 应用程序通过现有浏览器 API 以符合跨源资源共享 (CORS) 的安全方式访问 DNS 信息

有一个专门用于从 Web 应用程序进行 DNS 查找的开源工具,名为 dohjs。 它执行 DNS over HTTPS (DoH) 线格式查询,如 RFC 8484< 中所述/a>. 它支持 GET 和 POST 方法。

全面披露:我是 dohjs 的贡献者。

另一个具有类似功能的 JavaScript 库可以在这里找到 - https://github.com/sc0Vu/doh-js -客户端。 我个人没有使用过这个,但我认为它也可以在客户端工作。

DNS over HTTPS JSON API

如果您不想使用 DNS 线格式,Google 和 Cloudflare 都提供用于 DNS over HTTPS 的 JSON API。

使用 Google 的 JSON DOH API 查找 example.com 的示例 Javascript 代码:

var response = await fetch('https://dns.google/resolve?name=example.com');
var json = await response.json();
console.log(json);

来自 RFC 的 DOH GET 和 POST 线格式示例

以下是RFC 为 GET 和 POST 提供的示例(请参阅 https://www.rfc-editor.org/rfc/rfc8484#section-4.1.1" rfc-editor.org/rfc/rfc8484#section-4.1.1):

GET 示例:

第一个示例请求使用 GET 来请求“www.example.com”。

:方法 = GET
:方案= https
:authority = dnsserver.example.net
:path = /dns-query?dns=AAAAAAAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
接受=应用程序/dns消息

POST 示例:

使用 POST 方法对“www.example.com”进行相同的 DNS 查询
是:

:方法= POST
:方案= https
:authority = dnsserver.example.net
:path = /dns-query
接受 = 应用程序/dns 消息
内容类型 = 应用程序/dns 消息
内容长度= 33

<由以下十六进制编码表示的33个字节>
00 00 01 00 00 01 00 00 00 00 00 00 03 77 77 77
07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
01

发送 DOH 查询的其他地方

您可以在几个地方找到一些支持 HTTPS 上的 DNS 的公共 DNS 解析器的列表:

在上述资源中,我想说 Curl wiki 上的列表和 DNSCrypt 列表可能是最完整且更新最频繁的。 Curl 的页面还包括 DoH 的开源工具列表(服务器、代理、客户端库等)。

I know this question was asked a very long time ago, but I figured I'd offer a more recent answer.

DNS over HTTPS (DoH)

You can send DNS queries over HTTPS to DNS resolvers that support it. The standard for DOH is described in RFC 8484.

This is a similar thing to what all the other answers suggest, only that DoH is actually the DNS protocol over HTTPS. It's also a "proposed" Internet standard and it's becoming quite popular. For example, some major browsers either support it or have plans to support it (Chrome, Edge, Firefox), and Microsoft is in the process of building it into their operating system.

One of the purposes of DoH is:

allowing web applications to access DNS information via existing browser APIs in a safe way consistent with Cross Origin Resource Sharing (CORS)

There's an open source tool made especially for doing DNS lookups from web applications called dohjs. It does DNS over HTTPS (DoH) wireformat queries as described in RFC 8484. It supports both GET and POST methods.

Full disclosure: I am a contributor to dohjs.

Another JavaScript library with similar features is found here - https://github.com/sc0Vu/doh-js-client. I haven't used this one personally, but I think it would work client side as well.

DNS over HTTPS JSON APIs

If you don't want to bother with DNS wireformat, both Google and Cloudflare offer JSON APIs for DNS over HTTPS.

Example Javascript code to lookup example.com with Google's JSON DOH API:

var response = await fetch('https://dns.google/resolve?name=example.com');
var json = await response.json();
console.log(json);

Examples from the RFC for DOH GET and POST with wireformat

Here are the examples the RFC gives for both GET and POST (see https://www.rfc-editor.org/rfc/rfc8484#section-4.1.1):

GET example:

The first example request uses GET to request "www.example.com".

:method = GET
:scheme = https
:authority = dnsserver.example.net
:path = /dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
accept = application/dns-message

POST example:

The same DNS query for "www.example.com", using the POST method would
be:

:method = POST
:scheme = https
:authority = dnsserver.example.net
:path = /dns-query
accept = application/dns-message
content-type = application/dns-message
content-length = 33

<33 bytes represented by the following hex encoding>
00 00 01 00 00 01 00 00 00 00 00 00 03 77 77 77
07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
01

Other places to send DOH queries

You can find a list of some public DNS resolvers that support DNS over HTTPS in a couple places:

Of the above resources, I'd say that the list on Curl's wiki and the DNSCrypt list are are probably the most complete and the most frequently updated. Curl's page also includes a list of open source tools for DoH (servers, proxies, client libs, etc).

瑕疵 2024-07-12 11:48:12

有一个第三方服务提供了 CORS 友好的 REST API,可以从浏览器执行 DNS 查找 - https:// /exana.io/tools/dns/

There's a third-party service which provides a CORS-friendly REST API to perform DNS lookups from the browser - https://exana.io/tools/dns/

不如归去 2024-07-12 11:48:12

我知道这是一个老问题,但我的解决方案可能会帮助其他人。

我发现让这一切变得简单的 JSON(P) 服务不会永远持续下去,但在撰写本文时,以下 JavaScript 对我来说效果很好。

<script type="text/javascript">function z (x){ document.getElementById('y').innerHTML=x.query }</script>
<script type='text/javascript' src='http://ip-api.com/json/zero.eu.org?callback=z'></script>

上面将我的服务器的 IP 写在它所在的页面上,但可以修改脚本以通过将“zero.eu.org”更改为另一个域名来查找任何 IP。
这可以在我的页面上看到:http://meon.zero.eu.org/

I am aware this is an old question but my solution may assist others.

I find that the JSON(P) services which make this easy do not last forever but the following JavaScript works well for me at the time of writing.

<script type="text/javascript">function z (x){ document.getElementById('y').innerHTML=x.query }</script>
<script type='text/javascript' src='http://ip-api.com/json/zero.eu.org?callback=z'></script>

The above writes my server's IP on the page it is located but the script can be modified to find any IP by changing 'zero.eu.org' to another domain name.
This can be seen in action on my page at: http://meon.zero.eu.org/

淡看悲欢离合 2024-07-12 11:48:12

托管的 JSONP 版本工作起来就像一个魅力,但似乎它在大多数日子的夜间(东部时间)都会耗尽其资源,所以我必须创建自己的版本。

这就是我用 PHP 完成它的方法:

<?php
header('content-type: application/json; charset=utf-8');

$data = json_encode($_SERVER['REMOTE_ADDR']);
echo $_GET['callback'] . '(' . $data . ');';
?>

然后 Javascript 与以前完全相同,只是不是一个数组:

<script type="application/javascript">
function getip(ip){
    alert('IP Address: ' + ip);
}
</script>

<script type="application/javascript" src="http://www.anotherdomain.com/file.php?callback=getip"> </script>

就这么简单!

旁注:如果您在任何面向公众的环境中使用它,请务必清理您的 $_GET!

The hosted JSONP version works like a charm, but it seems it goes over its resources during night time most days (Eastern Time), so I had to create my own version.

This is how I accomplished it with PHP:

<?php
header('content-type: application/json; charset=utf-8');

$data = json_encode($_SERVER['REMOTE_ADDR']);
echo $_GET['callback'] . '(' . $data . ');';
?>

Then the Javascript is exactly the same as before, just not an array:

<script type="application/javascript">
function getip(ip){
    alert('IP Address: ' + ip);
}
</script>

<script type="application/javascript" src="http://www.anotherdomain.com/file.php?callback=getip"> </script>

Simple as that!

Side note: Be sure to clean your $_GET if you're using this in any public-facing environment!

两相知 2024-07-12 11:48:12

很晚了,但我想很多人还是会通过“谷歌航空”降落在这里。 现代方法是使用不需要服务器支持的 WebRTC。

https://hacking.ventures/local-ip-discovery-with -html5-webrtc-security-and-privacy-risk/

下一个代码是从 http://net.ipcalf 复制粘贴的。 com/

// NOTE: window.RTCPeerConnection is "not a constructor" in FF22/23
var RTCPeerConnection = /*window.RTCPeerConnection ||*/ window.webkitRTCPeerConnection || window.mozRTCPeerConnection;

if (RTCPeerConnection) (function () {
    var rtc = new RTCPeerConnection({iceServers:[]});
    if (window.mozRTCPeerConnection) {      // FF needs a channel/stream to proceed
        rtc.createDataChannel('', {reliable:false});
    };  

    rtc.onicecandidate = function (evt) {
        if (evt.candidate) grepSDP(evt.candidate.candidate);
    };  
    rtc.createOffer(function (offerDesc) {
        grepSDP(offerDesc.sdp);
        rtc.setLocalDescription(offerDesc);
    }, function (e) { console.warn("offer failed", e); }); 


    var addrs = Object.create(null);
    addrs["0.0.0.0"] = false;
    function updateDisplay(newAddr) {
        if (newAddr in addrs) return;
        else addrs[newAddr] = true;
        var displayAddrs = Object.keys(addrs).filter(function (k) { return addrs[k]; }); 
        document.getElementById('list').textContent = displayAddrs.join(" or perhaps ") || "n/a";
    }   

    function grepSDP(sdp) {
        var hosts = []; 
        sdp.split('\r\n').forEach(function (line) { // c.f. http://tools.ietf.org/html/rfc4566#page-39
            if (~line.indexOf("a=candidate")) {     // http://tools.ietf.org/html/rfc4566#section-5.13
                var parts = line.split(' '),        // http://tools.ietf.org/html/rfc5245#section-15.1
                    addr = parts[4],
                    type = parts[7];
                if (type === 'host') updateDisplay(addr);
            } else if (~line.indexOf("c=")) {       // http://tools.ietf.org/html/rfc4566#section-5.7
                var parts = line.split(' '), 
                    addr = parts[2];
                updateDisplay(addr);
            }   
        }); 
    }   
})(); else {
    document.getElementById('list').innerHTML = "<code>ifconfig | grep inet | grep -v inet6 | cut -d\" \" -f2 | tail -n1</code>";
    document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull.";
}   

Very late, but I guess many people will still land here through "Google Airlines". A moderm approach is to use WebRTC that doesn't require server support.

https://hacking.ventures/local-ip-discovery-with-html5-webrtc-security-and-privacy-risk/

Next code is a copy&paste from http://net.ipcalf.com/

// NOTE: window.RTCPeerConnection is "not a constructor" in FF22/23
var RTCPeerConnection = /*window.RTCPeerConnection ||*/ window.webkitRTCPeerConnection || window.mozRTCPeerConnection;

if (RTCPeerConnection) (function () {
    var rtc = new RTCPeerConnection({iceServers:[]});
    if (window.mozRTCPeerConnection) {      // FF needs a channel/stream to proceed
        rtc.createDataChannel('', {reliable:false});
    };  

    rtc.onicecandidate = function (evt) {
        if (evt.candidate) grepSDP(evt.candidate.candidate);
    };  
    rtc.createOffer(function (offerDesc) {
        grepSDP(offerDesc.sdp);
        rtc.setLocalDescription(offerDesc);
    }, function (e) { console.warn("offer failed", e); }); 


    var addrs = Object.create(null);
    addrs["0.0.0.0"] = false;
    function updateDisplay(newAddr) {
        if (newAddr in addrs) return;
        else addrs[newAddr] = true;
        var displayAddrs = Object.keys(addrs).filter(function (k) { return addrs[k]; }); 
        document.getElementById('list').textContent = displayAddrs.join(" or perhaps ") || "n/a";
    }   

    function grepSDP(sdp) {
        var hosts = []; 
        sdp.split('\r\n').forEach(function (line) { // c.f. http://tools.ietf.org/html/rfc4566#page-39
            if (~line.indexOf("a=candidate")) {     // http://tools.ietf.org/html/rfc4566#section-5.13
                var parts = line.split(' '),        // http://tools.ietf.org/html/rfc5245#section-15.1
                    addr = parts[4],
                    type = parts[7];
                if (type === 'host') updateDisplay(addr);
            } else if (~line.indexOf("c=")) {       // http://tools.ietf.org/html/rfc4566#section-5.7
                var parts = line.split(' '), 
                    addr = parts[2];
                updateDisplay(addr);
            }   
        }); 
    }   
})(); else {
    document.getElementById('list').innerHTML = "<code>ifconfig | grep inet | grep -v inet6 | cut -d\" \" -f2 | tail -n1</code>";
    document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull.";
}   
怕倦 2024-07-12 11:48:12

javascript 标准库中没有主机或 IP 地址的概念。 因此,您必须访问一些外部服务来为您查找主机名。

我建议托管一个 cgi-bin,它查找主机名的 IP 地址并通过 javascript 访问它。

There's no notion of hosts or ip-addresses in the javascript standard library. So you'll have to access some external service to look up hostnames for you.

I recommend hosting a cgi-bin which looks up the ip-address of a hostname and access that via javascript.

寒冷纷飞旳雪 2024-07-12 11:48:12

有一个 javascript 库 DNS-JS.com 就是这样做的。

DNS.Query("dns-js.com",
    DNS.QueryType.A,
    function(data) {
        console.log(data);
});

There is a javascript library DNS-JS.com that does just this.

DNS.Query("dns-js.com",
    DNS.QueryType.A,
    function(data) {
        console.log(data);
});
好听的两个字的网名 2024-07-12 11:48:12

正如许多人所说,您需要使用外部服务并调用它。 这只会从服务器的角度为您提供 DNS 解析。

如果这足够好并且您只需要 DNS 解析,您可以使用以下 Docker 容器:

https://github .com/kuralabs/docker-webaiodns

端点:

[GET] /ipv6/[domain]
对给定域执行 DNS 解析并返回关联的 IPv6
地址。

 {
     "addresses": [
         "2a01:91ff::f03c:7e01:51bd:fe1f"
     ]
 }

[GET] /ipv4/[域]
对给定域执行 DNS 解析并返回关联的 IPv4
地址。

 {
     "addresses": [
         "139.180.232.162"
     ]
 }

我的建议是,您将 Web 服务器设置为反向代理到服务 Javascript 的服务器中特定端点上的容器,并使用标准 Javascript Ajax 函数调用它。

As many people said you need to use an external service and call it. And that will only get you the DNS resolution from the server perspective.

If that's good enough and if you just need DNS resolution you can use the following Docker container:

https://github.com/kuralabs/docker-webaiodns

Endpoints:

[GET] /ipv6/[domain]:
Perform a DNS resolution for given domain and return the associated IPv6
addresses.

 {
     "addresses": [
         "2a01:91ff::f03c:7e01:51bd:fe1f"
     ]
 }

[GET] /ipv4/[domain]:
Perform a DNS resolution for given domain and return the associated IPv4
addresses.

 {
     "addresses": [
         "139.180.232.162"
     ]
 }

My recommendation is that you setup your web server to reverse proxy to the container on a particular endpoint in your server serving your Javascript and call it using your standard Javascript Ajax functions.

吹泡泡o 2024-07-12 11:48:12

这样做需要破坏浏览器沙箱。 尝试让您的服务器进行查找并通过 XmlHttp 从客户端请求。

Doing this would require to break the browser sandbox. Try to let your server do the lookup and request that from the client side via XmlHttp.

帅气尐潴 2024-07-12 11:48:12

Firefox 从 v60 开始就为 WebExtensions 提供了内置 API:

https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve

Firefox has a built-in API for this since v60, for WebExtensions:

https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/dns/resolve

烂柯人 2024-07-12 11:48:12

也许我没有抓住重点,但在回复 NAVY 家伙时,浏览器如何告诉你“请求者”的 IP 地址(尽管可能只是他们的服务提供商)。

在页面中放置一个脚本标记,由客户端调用(有 src 指向)另一台负载不平衡的服务器(我意识到这意味着您需要访问第二台服务器,但现在托管很便宜,您可以设置起来既简单又便宜)。

这是需要添加到客户端页面的代码:

在另一台服务器“someServerIown”上,您需要有 ASP、ASPX 或 PHP 页面;

----- 包含这样的服务器代码:

“<%
Response.Write("var clientipaddress = '" & Request.ServerVariables("REMOTE_ADDR") & "';")
%>"
(没有外部 dbl 引号 :-))

---- 并将此代码写回脚本标记:

   var clientipaddress = '178.32.21.45';

这有效地创建了一个 Javascript 变量,您可以在页面上使用 Javascript 访问该变量。

希望您可以访问此变量并将值写入准备发送回的表单控件。

当用户发布或获取下一个请求时,您的 Javascript 和/或表单会将“otherServerIown”为您填写的变量值发送回您想要的服务器。

这就是我绕过我们拥有的愚蠢负载均衡器的方法,该负载均衡器屏蔽了客户端 IP 地址并使其显示为负载均衡器的 IP 地址......愚蠢......愚蠢愚蠢愚蠢!

我没有给出确切的解决方案,因为每个人的情况都有点不同。 然而,这个概念是合理的。 另请注意,如果您在 HTTPS 页面上执行此操作,您的“otherServerIOwn”也必须以该安全形式提供,否则客户端会收到混合内容的警报。 如果您确实有 https,请确保您的所有证书均有效,否则客户端也会收到警告。

希望它能帮助别人! 抱歉,花了一年时间才回答/贡献。 :-)

Maybe I missed the point but in reply to NAVY guy here is how the browser can tell you the 'requestor's' IP address (albeit maybe only their service provider).

Place a script tag in the page to be rendered by the client that calls (has src pointing to) another server that is not loaded balanced (I realize that this means you need access to a 2nd server but hosting is cheap these days and you can set this up easily and cheaply).

This is the kind of code that needs to be added to client page:

On the other server "someServerIown" you need to have the ASP, ASPX or PHP page that;

----- contains server code like this:

"<%
Response.Write("var clientipaddress = '" & Request.ServerVariables("REMOTE_ADDR") & "';")
%>"
(without the outside dbl quotes :-))

---- and writes this code back to script tag:

   var clientipaddress = '178.32.21.45';

This effectively creates a Javascript variable that you can access with Javascript on the page no less.

Hopefully, you access this var and write the value to a form control ready for sending back.

When the user posts or gets on the next request your Javascript and/or form sends the value of the variable that the "otherServerIown" has filled in for you, back to the server you would like it on.

This is how I get around the dumb load balancer we have that masks the client IP address and makes it appear as that of the Load balancer .... dumb ... dumb dumb dumb!

I haven't given the exact solution because everyone's situation is a little different. The concept is sound, however. Also, note if you are doing this on an HTTPS page your "otherServerIOwn" must also deliver in that secure form otherwise Client is alerted to mixed content. And if you do have https then make sure ALL your certs are valid otherwise client also gets a warning.

Hope it helps someone! Sorry, it took a year to answer/contribute. :-)

薔薇婲 2024-07-12 11:48:12

如果客户端安装了 Java,您可以执行以下操作:

ipAddress = java.net.InetAddress.getLocalHost().getHostAddress();

除此之外,您可能必须使用服务器端脚本。

If the client has Java installed, you could do something like this:

ipAddress = java.net.InetAddress.getLocalHost().getHostAddress();

Other than that, you will probably have to use a server side script.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文