防止注入的 C# 字符串参数?
C# String Parameters to protect against injection?
以这段代码为例:
IAmazonSimpleDB client = new AmazonSimpleDBClient(Amazon.RegionEndpoint.USEast1);
SelectResponse response = client.Select(new SelectRequest() {
SelectExpression = "SELECT * FROM `foo` where FooID = '" + id + "'" });
我可以这样改写:
IAmazonSimpleDB client = new AmazonSimpleDBClient(Amazon.RegionEndpoint.USEast1);
SelectResponse response = client.Select(new SelectRequest() {
SelectExpression = "SELECT * FROM `foo` where FooID = '{0}'", id });
但据我了解,这仍然使其容易受到注入攻击,对吗?
这里还有什么我可以做的吗?我们没有使用 SQL 所以我不能做 SQL 参数。
我通常会检查 id 是否为整数。这样你会得到一个异常或一个布尔值,如果它不是一个整数。除非您使用 GUID 值,否则它将正常工作。
var isNumeric = int.TryParse("123", out int n); //Will give a bool
Int32.Parse(yourString); //This will give an exception if it is not an possible integer
如果不止于此,那么您可以使用 Regex 表达式来查找奇怪的值并删除不应该出现的字符,例如空格。如果没有空格,大多数 SQL 注入攻击都不会起作用……我想。删除所有空格非常容易,我假设您的 ID(即使它很复杂)不会包含空格。
string s = " "
string t = s.Replace(" ", ""). //It will be hard to do a sql attack if the spaces are removed.
有点题外话,但使用 C# 6.0,您可以以不同的方式格式化字符串;这是一项名为 "string interpolation" 的新功能(感谢 Etienne de Martel)。
$"SELECT * FROM `foo` where FooID = '{id}'"
以这段代码为例:
IAmazonSimpleDB client = new AmazonSimpleDBClient(Amazon.RegionEndpoint.USEast1);
SelectResponse response = client.Select(new SelectRequest() {
SelectExpression = "SELECT * FROM `foo` where FooID = '" + id + "'" });
我可以这样改写:
IAmazonSimpleDB client = new AmazonSimpleDBClient(Amazon.RegionEndpoint.USEast1);
SelectResponse response = client.Select(new SelectRequest() {
SelectExpression = "SELECT * FROM `foo` where FooID = '{0}'", id });
但据我了解,这仍然使其容易受到注入攻击,对吗?
这里还有什么我可以做的吗?我们没有使用 SQL 所以我不能做 SQL 参数。
我通常会检查 id 是否为整数。这样你会得到一个异常或一个布尔值,如果它不是一个整数。除非您使用 GUID 值,否则它将正常工作。
var isNumeric = int.TryParse("123", out int n); //Will give a bool
Int32.Parse(yourString); //This will give an exception if it is not an possible integer
如果不止于此,那么您可以使用 Regex 表达式来查找奇怪的值并删除不应该出现的字符,例如空格。如果没有空格,大多数 SQL 注入攻击都不会起作用……我想。删除所有空格非常容易,我假设您的 ID(即使它很复杂)不会包含空格。
string s = " "
string t = s.Replace(" ", ""). //It will be hard to do a sql attack if the spaces are removed.
有点题外话,但使用 C# 6.0,您可以以不同的方式格式化字符串;这是一项名为 "string interpolation" 的新功能(感谢 Etienne de Martel)。
$"SELECT * FROM `foo` where FooID = '{id}'"