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



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

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

  • 可能检测到的敏感目录/文件,例如URL https://www.example.com/api/results/?country=&city=admin/access_log&value=

  • 内容注入https://www.example.com/api/results/%20Site%20is%20moved%20to%20wastest.indusface.com%20请% 20访问% 20 wastest.indusface.com. % 20 ?国家= undefined&城市= undefined&价值=

  • Iframe注入,例如用于URLhttps://www.example.com/api/results/?country=%3Ciframe%20src%3D%22https%3A%2F%2Fwas.indusface.com % 2 f2085 % 20类22% % 3 d 'haikumsg ' % 3 e % 3 c % 2 fiframe % 3 e&城市=,=价值

所以基本上,我认为这一切归结为相同的问题:我的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}")>

example.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

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

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)

在上面的例子中,我故意从第二个验证中删除了param2,以说明如果您使用ParamArray,那么您可以传递任意多的参数,0或更多。

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

  • 为每个验证类型实现一个验证函数,该验证类型接受单个值并返回Boolean
  • 为每个验证类型实现一个验证函数,它接受一个参数数组,循环它,为每个参数调用相应的单个验证函数,如果其中任何一个无效,则调用Return False,在循环结束时调用Return True
  • 调用循环参数数组的函数,从你要验证的地方,所以,你实现你的验证类型一次,并在你所有的API函数中重用它们,只要你喜欢调用函数

最新更新