<legend id='inlmb'><style id='inlmb'><dir id='inlmb'><q id='inlmb'></q></dir></style></legend>

      <bdo id='inlmb'></bdo><ul id='inlmb'></ul>
    <tfoot id='inlmb'></tfoot>

  1. <small id='inlmb'></small><noframes id='inlmb'>

      <i id='inlmb'><tr id='inlmb'><dt id='inlmb'><q id='inlmb'><span id='inlmb'><b id='inlmb'><form id='inlmb'><ins id='inlmb'></ins><ul id='inlmb'></ul><sub id='inlmb'></sub></form><legend id='inlmb'></legend><bdo id='inlmb'><pre id='inlmb'><center id='inlmb'></center></pre></bdo></b><th id='inlmb'></th></span></q></dt></tr></i><div id='inlmb'><tfoot id='inlmb'></tfoot><dl id='inlmb'><fieldset id='inlmb'></fieldset></dl></div>
    1. PHP驱动的API如何跨域认证真正的客户端(引用者)(知道标头可以被欺骗)?

      How can PHP driven API authenticate genuine client (referer) cross-domain (knowing that headers can be spoofed)?(PHP驱动的API如何跨域认证真正的客户端(引用者)(知道标头可以被欺骗)?)

        • <bdo id='NwrJj'></bdo><ul id='NwrJj'></ul>

            <tbody id='NwrJj'></tbody>

            <small id='NwrJj'></small><noframes id='NwrJj'>

            <legend id='NwrJj'><style id='NwrJj'><dir id='NwrJj'><q id='NwrJj'></q></dir></style></legend>
          • <tfoot id='NwrJj'></tfoot>

            1. <i id='NwrJj'><tr id='NwrJj'><dt id='NwrJj'><q id='NwrJj'><span id='NwrJj'><b id='NwrJj'><form id='NwrJj'><ins id='NwrJj'></ins><ul id='NwrJj'></ul><sub id='NwrJj'></sub></form><legend id='NwrJj'></legend><bdo id='NwrJj'><pre id='NwrJj'><center id='NwrJj'></center></pre></bdo></b><th id='NwrJj'></th></span></q></dt></tr></i><div id='NwrJj'><tfoot id='NwrJj'></tfoot><dl id='NwrJj'><fieldset id='NwrJj'></fieldset></dl></div>
                本文介绍了PHP驱动的API如何跨域认证真正的客户端(引用者)(知道标头可以被欺骗)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                使用 PHP,您如何安全地验证 API 调用跨域,符合以下条件:

                Using PHP, how do you securely authenticate an API call, cross-domain, with the following criteria:

                1. 必须从给定的 domain.com/page 调用(没有其他域)
                2. 必须有给定的密钥

                一些背景知识:回答前请仔细阅读...

                我的 Web 应用程序将通过如下调用在客户的网站上显示一个 javascript 小部件.因此,我们谈论的是跨域身份验证的脚本,但仅针对真正的客户端和给定的 URL!

                My web application will display a javascript widget on a client's website via a call like the one below. So we're talking about cross-domain authentication for a script to be served but only to genuine client and for a given URL only!

                目前,客户的网站可以通过单行 javascript 包含小部件.

                At the moment the widget can be included by the CLIENT's website, by a single-line of javascript.

                client-website.com/page/with/my-widget 示例

                <head>
                ...
                <script src="//ws.my-webappserver.com/little-widget/?key=api_key"></script>
                ...
                </head>
                

                现在,实际上这并不直接调用 javascript,而是我的远程服务器上的一个 PHP 脚本,它位于实际 javascript 的前面,用于进行一些身份验证.

                Now, in reality this does not call javascript directly but a PHP script on my remote server which sits in front of the actual javascript for the purpose of doing some authentication.

                上述调用背后的 PHP 脚本首先执行此操作:

                The PHP script behind the above call does this first:

                1. 检查 API 密钥 ($_REQUEST["key"]) 是否与数据库中的用户记录匹配.
                2. 根据数据库中的记录检查引荐来源网址 ($_SERVER['HTTP_REFERER']).

                这是简化的,但本质上服务器看起来像:

                This is simplified, but in essence the server looks like:

                if ($_SERVER['HTTP_REFERER'] !== "http://client-website.com/page/with/my-widget")
                  && $_REQUEST["Key"] == "the_long_api_key") {
                    header("Content-type: application/x-javascript");
                    echo file_get_contents($thewidgetJS_in_secret_location_on_server);
                } else {
                  //pretend to be a 404 page not found or some funky thing like that
                }
                

                ***小部件只允许在某些网站/页面上运行

                ***The widget is only allowed to run on CERTAIN websites/pages

                现在,问题来了:

                1. 密钥在客户端,因此任何人都可以查看源代码并获取密钥
                2. 例如可以欺骗引荐来源网址(通过 cURL)

                还有一点问题:我不能告诉客户将密钥粘贴在他们服务器上的 php 脚本中,因为他们可以运行任何服务器端语言!

                And a little snag: I can't tell the clients to stick the key inside a php script on their server because they could be running any server side language!

                那么我怎样才能使我的网络服务安全且只能由给定的域/页面访问?

                So how can I make my web service secure and only accessible by a given domain/page?

                任何帮助将不胜感激!

                ps:小部件会将一些内容上传到一种投递箱 - 所以这里的安全性是关键!

                ps: The widget does some uploading to a kind of drop box - so security is key here!

                推荐答案

                id 建议使用白名单方法来解决这个问题,我不完全确定这会解决问题,但是我对支付处理器使用了类似的技术,它需要您将服务器 IP 列入白名单.

                id recommend using a whitelist approach to this issue, i am not entirely sure this will solve the problem however i have used a similar technique for a payment processor which requires you to whitelist server-ips.

                这篇关于PHP驱动的API如何跨域认证真正的客户端(引用者)(知道标头可以被欺骗)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                Pause youtube video, youtube api(暂停 youtube 视频,youtube api)
                Youtube iframe api not triggering onYouTubeIframeAPIReady(Youtube iframe api 未触发 onYouTubeIframeAPIReady)
                How can I stop a video with Javascript in Youtube?(如何在 Youtube 中停止使用 Javascript 的视频?)
                How to call Greasemonkey#39;s GM_ functions from code that must run in the target page scope?(如何从必须在目标页面范围内运行的代码中调用 Greasemonkey 的 GM_ 函数?)
                How do you mute an embedded Youtube player?(如何使嵌入式 Youtube 播放器静音?)
                How to get number of video views with YouTube API?(如何使用 YouTube API 获取视频观看次数?)
              • <i id='M5YZg'><tr id='M5YZg'><dt id='M5YZg'><q id='M5YZg'><span id='M5YZg'><b id='M5YZg'><form id='M5YZg'><ins id='M5YZg'></ins><ul id='M5YZg'></ul><sub id='M5YZg'></sub></form><legend id='M5YZg'></legend><bdo id='M5YZg'><pre id='M5YZg'><center id='M5YZg'></center></pre></bdo></b><th id='M5YZg'></th></span></q></dt></tr></i><div id='M5YZg'><tfoot id='M5YZg'></tfoot><dl id='M5YZg'><fieldset id='M5YZg'></fieldset></dl></div>
                    <bdo id='M5YZg'></bdo><ul id='M5YZg'></ul>

                        <tbody id='M5YZg'></tbody>
                      1. <tfoot id='M5YZg'></tfoot>

                          <legend id='M5YZg'><style id='M5YZg'><dir id='M5YZg'><q id='M5YZg'></q></dir></style></legend>

                          <small id='M5YZg'></small><noframes id='M5YZg'>