如何防止用户进行未经授权的Web方法调用和篡改客户端验证
本文关键字:调用 方法 验证 客户端 Web 用户 何防止 授权 | 更新日期: 2023-09-27 17:57:26
我正在创建一个网页,用户可以在其中注册自己和他们新购买的产品。
因此,该页面最初由两个输入字段组成:序列号和他们的社会保险号。这些值将根据两种不同的API进行验证。用户不应该滥用这些API调用,因为第二个API调用每次都要花钱。另一个也应该以某种方式受到限制,这样用户就无法访问我们所有的序列号。
我们的愿望是用ajax制作这个网页,以创造良好的用户体验。因此,我使用jQueryajax函数来调用我放在页面代码后面的web方法。
反过来,每个Web方法都使用凭据调用匹配的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,我让它工作了,但也可以展示它。这是在根据regex:验证输入之后
$.ajax({
type: "POST",
url: "/Default.aspx/CheckSerialNumber",
data: ...
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
return true;
}
您可以让CheckSerialNumber返回一个nonce(一次性密钥),在调用GetCustomerInfo时必须使用该nonce(然后验证服务器端)。这将强制您的api用户在转到GetCustomerInfo之前通过CheckSerialNumber。
这将解决在不首先进行序列号验证的情况下调用GetCustomerInfo的问题,但不会阻止某人重复调用第一个,然后再调用另一个,直到您用完现金,前提是他们至少有一个已验证的序列号。
您可以限制每个序列号的调用次数,在这种情况下,攻击者必须生成一个有效序列号列表(不确定这有多容易)
你可以检查请求ip并尝试限制这样的呼叫,但老实说,很难阻止有足够决心的人绕过这些限制,因此通常在网络级别处理此类攻击。如果你使用SSL,这会让生活变得更加困难,因为据我所知,在使用SSL时,IP欺骗是不可能的,但同样,它也不是防弹的。
设置cookie等并不相关,因为在使用攻击工具时,删除cookie或忽略cookie非常容易。
至于确认一切顺利,在第一次调用的success方法中,您可以调用第二次验证(如果您实现了nonce密钥,那么无论如何都必须这样做)。然后在GetCustomerInfo的成功方法中,您可以确认它也验证成功。
作为最后的手段,在给定的时间范围内限制您对client.getCustomerInfoapi的调用次数,因此,如果有人绕过了您的限制,您可以通过限制您为该服务支付的费用来限制入侵的影响。例如,你可以说平均每分钟有100个电话,所以每分钟超过200个电话都应该停止服务提供新的请求,直到你明白这是真实请求的激增还是攻击。
无论是否在客户端上验证,都应该始终验证从客户端发送的数据。否则,您将容易受到恶意客户端的攻击。如果你担心恶意客户端,你必须接受没有防篡改的方法。你可以通过使用身份验证和授权系统,向每个请求添加令牌,限制允许的请求数量等等,让他们更难处理。。。但即便如此,也没有绝对的安全。
如果您想检查两个调用是否都成功,只需在调用成功返回时设置一些全局标志即可。或者,您可以在第一次呼叫成功之前发起第二次呼叫。您也可以返回一些令牌,这是以后调用所必需的,但这也可能被滥用。
出于安全考虑,您可能还需要查看OWASP网站。特别是"参考资料"answers"如何操作"部分可能会很有用。
而且总会有客户端关闭javascript,然后你的网站就不会像你预期的那样工作。
还要考虑那些希望编写论文访问脚本的客户。或者,如果您想将这些web方法作为API提供,那么将不会有带有javascript的客户端,并且无论如何都必须在服务器上验证所提供的数据。
您是否为每个web输入执行一个ajax调用?为什么不把它们组合成1呢?
请记住,除了任何客户端验证之外,还应该始终进行服务器端验证。客户端验证不足以确保安全性。在这种情况下,您可以使用会话变量或数据库表来记录用户进行的调用次数,以及标识用户的序列号。然后,在x次尝试失败后,您可以忽略它们。
你也可以使用他们的IP来识别他们,但这并不可靠——许多人都有动态IP地址,可以很容易地更改。IP地址也可以被琐碎地欺骗。
在数据库中捕获用户存储的Ip地址,并且每分钟只允许x次尝试,每天只允许x次数。