防止注入(inject)的 C# 字符串参数?

标签 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 });

但据我了解,这仍然使它容易受到注入(inject)的影响,对吗?

还有什么我可以在这里做的吗?我们没有使用 SQL,所以我不能执行 SQL 参数。

最佳答案

我通常会检查 id 是否为整数。这样你会得到一个异常或一个 bool 值,如果它不是一个整数。除非您使用 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 注入(inject)攻击都不会起作用……我认为。删除所有空格非常容易,我假设您的 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}'"

关于防止注入(inject)的 C# 字符串参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53840231/

相关文章:

c# - IIS ASP.NET 4.0 异常并在私有(private)字段上使用反射

c# - 为什么 ExecuteReader 只返回 1 行数据?

C# LINQ 忽略数据表中的空值

php - 在表中插入一行并增加后面的自动增量值

SQL 用新值替换旧值

c# - 如何实现 git id 或构建到 c# 应用程序

mysql - 将 mySQL 与字符串中的任何单词匹配

amazon-web-services - 使用AWS弹性转码器,可以选择缩略图框架吗?

java - 我相信 Eureka 为作为 aws 服务的注册实例生成私有(private)/内部 IP 地址

amazon-web-services - 如何在cloudformation中获取Elastic Beanstalk EC2实例的instanceId?