防止我的 GET API 调用不需要的参数值,以提高安全性

Prevent unwanted parameter values for my GET API calls for improved security

提问人:Adam 提问时间:4/9/2023 最后编辑:Lajos ArpadAdam 更新时间:4/29/2023 访问量:51

问:

我使用 ASP.NET 运行一个网站。我的 API(GET 请求)URI 的格式如下:https://www.example.com/api/results/?country=&city=&value=

但是,当我在我的网站上运行漏洞测试时,它出现了错误,基本上是添加参数值:

所以基本上,我认为这一切都归结为同一个问题:我的 API 不需要的参数值出现问题,但我不确定如何防止这种情况。我有很多参数,我可以手动检查每个输入值,但这似乎是一场艰苦的战斗,也会影响应用程序性能。

我能做些什么来解决这种“参数填充”?

这是我的 API 定义:

Iexample.vb

       <OperationContract()>
        <Web.WebInvoke(Method:="GET", ResponseFormat:=Web.WebMessageFormat.Json, BodyStyle:=Web.WebMessageBodyStyle.Bare,
    UriTemplate:="results/?country={country}&province={province}&city={city}&value={value}")>

例子.svc.vb

    Public Function results(ByVal country As String, ByVal province As String,
        ByVal city As String, ByVal value As String) As Stream Implements Iexample.results
asp.net vb.net REST SECURITY OWASP

评论


答:

1赞 Lajos Arpad 4/29/2023 #1

您可以应用的一种模式是实现验证函数,例如

Protected Function IsValidFoobarParams(ByVal ParamArray args() As String) As Boolean
    For Each param As String In args
        If Not IsValidFoobarParam(param) Then
            Return False
        End If
    Next
    Return True
End Function

您需要自己实现对参数进行验证,并返回布尔值。您可以像这样调用上面的函数IsValidFoobarParam

    Dim IsValid As Boolean = IsValidFoobarParam(param1, param2, param3)

如果你还需要一些其他的验证,我们称之为 ,那么你可以做这样的事情IsValidLoremIpsumParam

    Dim IsValid As Boolean = IsValidFoobarParam(param1, param2, param3) AndAlso IsValidLoremIpsum(param1, param3)

在上面的示例中,我故意省略了第二次验证,以说明如果您使用 ParamArray,则可以传递任意数量的参数,即 0 或更多。param2

最后一个问题仍然存在。您可能有多个类型,在这种情况下,您可能希望对单独的类型进行单独的验证或类型转换。但是,基本模式是:

  • 为每个验证类型实现一个验证函数,该函数采用单个值并返回Boolean
  • 为每种验证类型实现一个验证函数,该函数接受一个参数数组,循环它,为每个参数调用相应的单一验证函数,如果其中任何一个无效,则在循环结束时Return FalseReturn True
  • 调用从要验证的位置循环参数数组的函数,因此,只需调用函数即可实现一次验证类型,并在所有 API 函数中根据需要重用它们

评论

0赞 Adam 4/30/2023
谢谢!检查每个参数真的是防止无效 API 值的最佳实践方法吗?它不会减慢 API 请求的速度吗?再次感谢
0赞 Lajos Arpad 5/1/2023
可以这样考虑:您的参数需要以某种方式检查。因此,您将需要一些东西来检查所有参数。无论该内容是什么,无论是显式的还是在引擎盖下,它都需要检查您的 URL(例如正则表达式)或单个参数。由于参数之间可能非常不同,并且可能需要多次验证,因此可以根据需要逐个参数检查来处理验证的差异。现在,如果您正在考虑验证是否会减慢您的请求处理速度......
0赞 Lajos Arpad 5/1/2023
@Adam这样想:你正在使用一台计算机,一台服务器,它的工作是计算事物。对 10 个参数进行 7 或 8 次验证意味着可能有 80 个字符串操作。这不应该是一个问题或困难。但是,您可以通过实现在性能方面害怕的 String 操作来尝试自己尝试,并尝试在测量时间的同时在循环中执行它。你可能会体验到它比你人类感知的要快得多。但是一定要尝试一下,让我知道结果。