没有参数的 SQL 注入攻击的任何风险,但强制用户输入仅限于正则表达式 [a-zA-Z][a-zA-Z0-9]*?
Any risk of a SQL injection attack without parameters but it is enforced that the user input is restricted to the regex [a-zA-Z][a-zA-Z0-9]*?
我正在使用 Entity Framework 和 PostgreSQL。我需要编写一个遵循这种格式的查询:
await Context.Database.ExecuteSqlCommandAsync("ALTER TABLE " + tableName + " ADD " + columnName + " " + sqlType);
如您所见,不幸的是,我需要使用用户输入来输入 table 名称、列名和该列的类型。不幸的是,PostgreSQL 不支持这些类型输入的参数(例如 SQL Server 支持)。所以除了像这样进行字符串连接之外,我真的没有其他选择。但是,我可以保证 tableName
和 columnName
都将使用正则表达式构造:
[a-zA-Z][a-zA-Z0-9]*
换句话说,我强制要求它们只由小写字母、大写字母和数字组成。没有标点符号或其他特殊字符。至于 sqlType
,我可以保证这将是一个 PostgreSQL 类型的字符串,对应于该列的类型(例如 "int4"
、"numeric"
、"uuid"
,等等)。它肯定不会是其他任何东西,因为我使用字典在 .NET 类型和这些类型之间以字符串格式进行映射。
所以有人知道这是否仍然存在 SQL 注入攻击的风险吗?还有什么我可以做的吗?
您可以放心使用该正则表达式(因为它不包含任何 Unicode 字符和标点符号)。
我正在使用 Entity Framework 和 PostgreSQL。我需要编写一个遵循这种格式的查询:
await Context.Database.ExecuteSqlCommandAsync("ALTER TABLE " + tableName + " ADD " + columnName + " " + sqlType);
如您所见,不幸的是,我需要使用用户输入来输入 table 名称、列名和该列的类型。不幸的是,PostgreSQL 不支持这些类型输入的参数(例如 SQL Server 支持)。所以除了像这样进行字符串连接之外,我真的没有其他选择。但是,我可以保证 tableName
和 columnName
都将使用正则表达式构造:
[a-zA-Z][a-zA-Z0-9]*
换句话说,我强制要求它们只由小写字母、大写字母和数字组成。没有标点符号或其他特殊字符。至于 sqlType
,我可以保证这将是一个 PostgreSQL 类型的字符串,对应于该列的类型(例如 "int4"
、"numeric"
、"uuid"
,等等)。它肯定不会是其他任何东西,因为我使用字典在 .NET 类型和这些类型之间以字符串格式进行映射。
所以有人知道这是否仍然存在 SQL 注入攻击的风险吗?还有什么我可以做的吗?
您可以放心使用该正则表达式(因为它不包含任何 Unicode 字符和标点符号)。