提问人:Adam 提问时间:4/9/2023 最后编辑:Lajos ArpadAdam 更新时间:4/29/2023 访问量:51
防止我的 GET API 调用不需要的参数值,以提高安全性
Prevent unwanted parameter values for my GET API calls for improved security
问:
我使用 ASP.NET 运行一个网站。我的 API(GET 请求)URI 的格式如下:https://www.example.com/api/results/?country=&city=&value=
但是,当我在我的网站上运行漏洞测试时,它出现了错误,基本上是添加参数值:
检测到可能的敏感目录/文件,例如 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% 20kindly%20visit%20wastest.indusface.com.%20?country=undefined&city=undefined&value=
iframe 注入,例如用于 URL https://www.example.com/api/results/?country=%3Ciframe%20src%3D%22https%3A%2F%2Fwas.indusfac e.com%2F2085%22%20class%3D'haikumsg'%3E%3C%2Fiframe%3E&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
答:
您可以应用的一种模式是实现验证函数,例如
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 False
Return True
- 调用从要验证的位置循环参数数组的函数,因此,只需调用函数即可实现一次验证类型,并在所有 API 函数中根据需要重用它们
评论