C#字符串参数可以防止注入?

时间:2018-12-18 20:02:41

标签: c# sql amazon-web-services amazon-simpledb

以以下代码为例:

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参数。

1 个答案:

答案 0 :(得分:0)

我通常会检查id是否为整数。这样,您将获得一个异常或布尔值(如果它不是int的话)。除非您使用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,您可以不同地设置字符串格式;这是一项称为“字符串插值”的新功能(感谢Etienne de Martel)。

$"SELECT * FROM `foo` where FooID = '{id}'"