我正在创建一个网页,用户可以在其中注册自己和他们新购买的产品。
因此该页面最初由两个输入字段组成:序列号和他们的社会保险号。这些值将针对两个不同的 API 进行验证。用户不应该滥用这些 API 调用,因为第二个调用每次调用都要花钱。另一个也应该以某种方式受到限制,以便用户无法访问我们所有的序列号。
并且希望用ajax制作这个网页来创造良好的用户体验。所以我使用 jQuery ajax 函数来调用我放在页面代码隐藏中的网络方法。
反过来,每个网络方法使用凭据调用匹配的 API。但这是否意味着任何人都可以在客户端编辑脚本,以便他们可以对 API 进行多少次调用?
我需要能够防止这种情况发生。我该怎么做呢?我可以检查调用不是由用户插入的脚本发起的吗?
另一个问题,我如何在客户端验证两个 ajax 调用都已成功返回?如果只有一个 ajax 调用就很容易了。我会成功地做一些事情:ajax 函数的一部分。我可以检查输入字段旁边的所有复选标记是否可见,但这很容易被用户篡改。那么这样做的好方法是什么?我想在两个调用都成功完成后启用一个按钮,以便用户可以确认 API 的结果。
[WebMethod]
public static string CheckSerialNumber(String _input)
{
string result = null;
var client = new CheckSerialNumberClient(); //A service reference to the API
try
{
//make the API call.
result = client.checkSerialNumber(_input);
}
catch (Exception)
{
result = "An error occured";
}
return result;
}
[WebMethod]
public static string GetCustomerInfo(String _input)
{
string result = null;
var client = new CustomerInfoClient(); //A service reference to the API
try
{
//make the API call.
result = client.getCustomerInfo(_input, myCredentials); //credentials is so that the company that has the API can charge us for each call.
}
catch (Exception)
{
result = "An error occured";
}
return result;
}
jQuery,我让它工作了,但也可以展示它。这是在针对正则表达式验证输入之后:
$.ajax({
type: "POST",
url: "/Default.aspx/CheckSerialNumber",
data: ...
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
return true;
}
请您参考如下方法:
您可以让 CheckSerialNumber 返回一个随机数(一次性 key ),在调用 GetCustomerInfo 时必须使用(然后验证服务器端)。这将强制您的 api 用户在转到 GetCustomerInfo 之前通过 CheckSerialNumber。
这将解决调用 GetCustomerInfo 时未先通过序列号验证的问题,但不会阻止某人重复调用第一个,然后重复调用另一个,直到您用完现金,前提是他们至少有一个经过验证的序列号。
您可以限制每个序列号的调用次数,在这种情况下,攻击者将不得不生成一个有效序列号列表(不确定这有多容易)
您可以检查请求 ip 并尝试限制这样的调用,但老实说,很难阻止有足够决心的人绕过此类限制,因此通常此类攻击是在网络级别处理的。如果您使用 SSL,这会让生活变得更加困难,因为据我所知,使用 SSL 时不可能进行 IP 欺骗,但同样,它不是万无一失的。
设置 cookie 等无关紧要,因为在使用攻击工具时删除 cookie 或忽略它们非常容易。
至于确认一切顺利,在第一次调用的success方法中,你可以调用第二次验证(如果你实现了一个nonce key你无论如何都必须这样做)。然后在GetCustomerInfo的success方法中也可以确认验证成功。
作为最后的手段,限制您在给定时间范围内调用 client.getCustomerInfo api 的次数,这样如果有人确实绕过了您的限制,您可以通过限制您支付的费用来限制入侵的影响该服务。例如,您可以说平均每分钟有 100 个调用,因此任何超过每分钟 200 个调用的情况都应该停止服务处理新请求,直到您了解这是真实请求激增还是攻击。
