关闭。这个问题需要更多focused .它目前不接受答案。
想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .
8 个月前关闭。
Improve this question
为了让大家知道,我确实按照一些人的建议稍微编辑了帖子,问题已发布在 Azure CDN 论坛 here .我也在 StackOverflow 上发布它的原因是尝试接触更多的受众,希望处理过相同/类似问题的人们可以提供有值(value)的解决方案/反馈。据我所知,目前没有解决此问题的方法,但它会影响任何使用 CDN 交付内容的企业。我愿意进一步编辑这个问题,但我想问的是,人们不要简单地拒绝这个问题,因为它听起来像是“咆哮”,事实并非如此,我可以向你保证它会影响成千上万的企业无论人们是否意识到这一点,每年都要花费数千美元。
所以这里的情况。假设我正在构建一个图片库网站,并且我想使用 Azure CDN 为我提供我的内容。在后端,Azure CDN 将从 Azure 存储帐户中提取内容。 CDN 快速且功能强大,但它似乎在防止某人能够大量提取内容从而给用户留下巨额带宽账单方面可能有点不安全。让我证明我的意思。
所以昨晚我决定编写一个简单的控制台应用程序,它将从我 future 的图片库网站下载一个简单的图像,在一个 for{} 循环中,代码如下:
namespace RefererSpoofer
{
class Program
{
static void Main(string[] args)
{
HttpWebRequest myHttpWebRequest = null;
HttpWebResponse myHttpWebResponse = null;
for (int x = 0; x < 1000; x++)
{
string myUri = "http://myazurecdnendpoint.azureedge.net/mystoragecontainer/DSC00580_1536x1152.jpg";
myHttpWebRequest = (HttpWebRequest) WebRequest.Create(myUri);
myHttpWebRequest.Referer = "www.mywebsite.com";
myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();
Stream response = myHttpWebResponse.GetResponseStream();
StreamReader streamReader = new StreamReader(response);
Image image = Image.FromStream(streamReader.BaseStream);
image.Save(string.Format("D:\\Downloads\\image{0}.Jpeg", x), ImageFormat.Jpeg);
myHttpWebResponse.Close();
}
Console.ReadKey();
}
}
}
此控制台应用程序对托管在我的 Azure CDN 端点上的图像文件发出 1000 次超快速连续请求,并将它们保存到我 PC 上的“D:\Downloads”文件夹中,每个文件名对应于 for{} 循环迭代,即 image1.jpeg、image2.jpeg 等。
那么刚刚发生了什么?在大约 1 分钟的时间内,我花费了自己 140MB 的带宽。这是一个高级 CDN,价格为 0.17 美元/GB,让我们一起算一下:0.14GB * 60 分钟 * 24 小时 * 30 天 * 0.17 美分/GB = 1028.16 美元的带宽成本,如果有人(例如竞争对手)想要制作一个一个月内对单个图像的单一请求会危及我的网站。我想你们可以看到我要做什么...我的网站将有数千张图片,高分辨率,顺便说一句,我在这个例子中使用的图片只有 140KB 大小。这些类型的请求可以来自匿名代理等。
所以我的问题是:如何防止有人滥用公开暴露的 CDN 端点?显然,人们不能因为恶意请求而为带宽支付 5,000 美元、20,000 美元。
现在 Azure Premium CDN 具有高级规则引擎,可以根据 Referer 过滤请求,并在 Referer 与您的网站不匹配时以 403 错误响应。但是,Referer 可以伪造,就像我在上面的代码示例中所做的那样,并且 CDN 仍然允许提供请求(我使用 Referer 欺骗进行了测试)。这很糟糕,很多人使用 Referer 来防止“盗链”,但在这种带宽滥用的情况下,如果只用一行代码就可以伪造 Referer 又有什么关系呢?
关于防止这种滥用和巨大的带宽成本,我有几个想法:
*这两种解决方案都需要 CDN 的操作:
哪些解决方案不起作用:
可行但不可行的解决方案:
综上所述,Azure 提供的带有自定义规则引擎的高级 CDN 产品可能会在某处提供解决方案,但是由于文档非常差且缺乏示例,人们只能猜测如何正确保护自己,所以这就是我为什么要写这篇文章。有没有人解决过这样的问题?以及如何解决它?
任何建议表示赞赏,我对这个问题非常开放。
感谢您的阅读。
最佳答案
这是理论上的,因为我们不提供我们的“应用程序”,但可能很快就会面临这个问题:
难道您不能在您的网站上发布一个很快过期(10 秒!?)的 cookie 并使用 Azure standard rules engine 来检查它是否存在。 .
然后,在您的“主站点”上,您可以进行自定义检查,如果 IP 超过“合理”的请求量,则该检查会阻止 IP(或分别不发出 cookie)。
一些先决条件:
... 我错过了什么?
关于azure - 如何防止恶意带宽吸血鬼请求滥用 Azure CDN 带宽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35488753/