草庐IT

php - 云端签名 url ip 地址

coder 2024-01-04 原文

我在 Cloudfront 上的签名 URL 在 PHP 中运行良好。存储桶策略适用于 S3 上的 HTTP 引荐来源网址,但由于 Cloudfront 不支持 HTTP 引荐来源网址检查,我只需要将文件提供给一个 IP 地址(理想情况下,请求文件并生成签名 URL 或我的 Web 服务器的客户端)。

有人可以帮我将 IP 地址元素添加到 JSON 代码中使其工作吗?

"IpAddress":{"AWS:SourceIp":"192.0.2.0/24"},

我迷失了 PHP 和政策声明,但我认为对于了解以下内容的人来说可能很容易:http://tinyurl.com/9czr5lp

它对自定义策略的编码/签名有点不同:http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html#private-content-custom-policy-statement

下面是一个 AWS 示例,除了 IP 地址锁定外都有效。

如果有人可以帮我两分钟,我可以很快测试这个!

非常感谢您的帮助:)

乔恩

    function getSignedURL($resource, $timeout)
    {
        $keyPairId = "XXXXXXXXXXXX";
        $expires = time() + $timeout;
        $json = '{"Statement":[{"Resource":"'.$resource.'","Condition":{"DateLessThan":     {"AWS:EpochTime":'.$expires.'}}}]}';
        $fp=fopen("pk-XXXXXXXX.pem","r");

        $priv_key=fread($fp,8192);
        fclose($fp);

        $key = openssl_get_privatekey($priv_key);
        if(!$key)
        {
                echo "<p>Failed to load private key!</p>";
                return;
        }

        //Sign the policy with the private key

        if(!openssl_sign($json, $signed_policy, $key, OPENSSL_ALGO_SHA1))
        {
                echo '<p>Failed to sign policy: '.openssl_error_string().'</p>';
                return;
        }
        //Create url safe signed policy
        $base64_signed_policy = base64_encode($signed_policy);
        $signature = str_replace(array('+','=','/'), array('-','_','~'), $base64_signed_policy);
        //Construct the URL
        $url = $resource.'?Expires='.$expires.'&Signature='.$signature.'&Key-Pair-Id='.$keyPairId;
        return $url;
}
$url = getSignedURL("http://s675765.cloudfront.net/filename.mp4", 600);
print $url;

最佳答案

{"Statement":[{"Resource":"testRes","Condition":{"DateLessThan":{"AWS:EpochTime":1357034400},"IpAddress":{"AWS:SourceIp":"192.0.2.0\/24"}}}]}

这是一个有效的 JSON 字符串,包含填充值和转义值。 如果您将 IP 地址作为变量传递,请确保转义 /

例如

$escapedIp = str_replace( '/', '\/', $ipAddress );

看看 php json 扩展 这会让事情变得更容易:

示例语句作为 php 数组

$statement = array( 
    'Statement' => array( 
        array(
            'Resource' => $resource, 
            'Condition' => array( 
                'DateLessThan' => array( 
                    'AWS:EpochTime' => $expires 
                ),
                'IpAddress' => array( 
                    'AWS:SourceIp' => $ipAddress 
                ) 
            ) 
        )
    ) 
);

$json = json_encode( $statement );

关于php - 云端签名 url ip 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13122105/

有关php - 云端签名 url ip 地址的更多相关文章

  1. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  2. ruby-on-rails - 验证电子邮件地址是 Paypal 用户 - 2

    我想验证一个电子邮件地址是否是PayPal用户。是否有API调用来执行此操作?是否有执行此操作的ruby​​库?谢谢 最佳答案 GetVerifiedStatus来自PayPal'sAdaptiveAccounts平台会为您做这件事。PayPal没有任何codesamples或SDKs用于Ruby中的自适应帐户,但我确实找到了编写codeforGetVerifiedStatusinRuby的人.您需要更改该代码以检查他们拥有的帐户类型的唯一更改是更改if@xml['accountStatus']!=nilaccount_status

  3. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  4. ruby-on-rails - 从 Geocode 经纬度获取地址 - 2

    对于我的大部分应用程序,我从Geocoder获取城镇/城市的纬度、经度、邮政编码等。我只是投入城市和州,作为返回,我得到了我处于一个有field的场景中。该场所需要一个地址,我正在从另一个来源获取该场所的纬度和经度。使用Geocodergem,我可以通过给地址提供经纬度来获取地址吗? 最佳答案 在Rails控制台中运行。latitude=40.0397longitude=-76.30144geo_localization="#{latitude},#{longitude}"query=Geocoder.search(geo_loca

  5. ruby - 使用 S/MIME 在 Ruby 中对电子邮件进行数字签名 - 2

    Ruby中是否有一种方法可以使用S/MIME对电子邮件消息进行数字签名?我们的团队使用PKI,我们的用户习惯于期待重要消息的数字签名。我知道我可以调用openssl命令行工具:opensslsmime-sign-signer$CERT_FILE-passinpass:$CERT_PASS-in$UNSIGNED_MAIL-out$SIGNED_MAIL-certfile$CERT_CA_FILE-from'your'-to'recipients'-subject'TheSubject'但我希望利用Ruby解决方案。 最佳答案 我最终

  6. ruby-on-rails - 如何将电子邮件地址放入 Rails 的 url 中 - 2

    我想邀请在这样的url中传递电子邮件的人:localhost:3000/invite_me/email@gmail.com我尝试了这个匹配,但它不起作用。match"/invite_me/:email"=>"application#invite_me",:constraints=>{:email=>'/.+@.+\..*/'}我收到以下错误:Noroutematches[GET]"/invite_me/waldyr.ar@gmail.com"rake路由输出:root/application#index/invite_me/:email(.:format)application#inv

  7. ruby-on-rails - 查看上传到 AWS S3 的私有(private)图像 - 从 secret 访问 key 创建签名 - 2

    我通过Paperclipgem在Rails应用程序上上传了一些图像,我希望只有后端的管理员能够查看这些图像。因此,我将它们设置为私有(private)。然后我四处搜索解决方案,以了解只有具有特定链接的管理员才能查看文件。这就是我found.我继续尝试这个,但我正在努力创建所需的签名。公式在上面的链接中给出,是:Signature=URL-Encode(Base64(HMAC-SHA1(YourSecretAccessKeyID,UTF-8-Encoding-Of(StringToSign))));StringToSign=HTTP-VERB+"\n"+Content-MD5+"\n"+

  8. ruby - 使用 Fog 和 Ruby 生成预签名 URL 以将文件放入 Amazon S3 - 2

    我正在使用Foggem生成预签名url。我可以成功执行此操作以获得对该文件的读取权限。这是我的做法:fog_s3=Fog::Storage.new({:provider=>'AWS',:aws_access_key_id=>key,:aws_secret_access_key=>secret})object_path='foo.wav'expiry=Date.new(2014,2,1).to_time.to_iurl=fog_s3.directories.new(:key=>bucket).files.new(:key=>object_path).url(expiry,path_sty

  9. ruby - 使用 Ruby 为 CloudFront 创建签名 url - 2

    历史:我在Amazon上创建了一个key和pem文件。我创建了一个私有(private)存储桶我创建了一个公共(public)分配并使用原始ID连接到私有(private)存储桶:有效我创建了一个私有(private)分配并像#3一样连接它-现在我得到拒绝访问:预期我很难生成一个有效的url。我一直在尝试按照此处描述的说明进行操作:http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?PrivateContent.html这就是我到目前为止所得到的......虽然不起作用-

  10. ruby - 如何在 ruby​​ 中获取 ip 地址、referer 和用户代理? - 2

    我想记录用户的ip地址、referer和用户代理。在PHP中,我可以从以下变量中获取它们:$_SERVER['REMOTE_ADDR']$_SERVER['HTTP_REFERER']$_SERVER['HTTP_USER_AGENT']如何在ruby​​中获取它们? 最佳答案 PHP嵌入在网络服务器中。Ruby是一种通用语言:如果您需要Web服务器上下文,则必须自己安装。幸运的是,这很容易。最简单的入门方法之一是使用Sinatra。安装gem:geminstallsinatra然后创建myapp.rb:require'sinatr

随机推荐