Skip to main content
 首页 » 编程设计

c#之如何防止用户进行未经授权的 web 方法调用和篡改客户端验证

2024年01月24日29qq号

我正在创建一个网页,用户可以在其中注册自己和他们新购买的产品。

因此该页面最初由两个输入字段组成:序列号和他们的社会保险号。这些值将针对两个不同的 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 个调用的情况都应该停止服务处理新请求,直到您了解这是真实请求激增还是攻击。