C# System.Data.SQLite:“;视图中不允许使用参数";,如何防止SQL注入?

C# System.Data.SQLite:“;视图中不允许使用参数";,如何防止SQL注入?,c#,sql,sqlite,sql-injection,sql-view,C#,Sql,Sqlite,Sql Injection,Sql View,我正在编写一个带有SQLite数据库后端的C#应用程序,使用System.Data.SQLite与数据库进行接口 尝试使用参数创建视图时,我收到以下错误: SQL逻辑错误 视图中不允许使用参数 如果不允许参数,如何保护代码不受SQL注入的影响?您不能将参数放入视图定义中: CREATE TEMP VIEW mylog AS SELECT * FROM log WHERE user_id = ?; -- WRONG 在分析SQL之前,该参数必须是SQL中的固定常量: CREATE TEMP VI

我正在编写一个带有SQLite数据库后端的C#应用程序,使用
System.Data.SQLite
与数据库进行接口

尝试使用参数创建视图时,我收到以下错误:

SQL逻辑错误

视图中不允许使用参数


如果不允许参数,如何保护代码不受SQL注入的影响?

您不能将参数放入视图定义中:

CREATE TEMP VIEW mylog AS SELECT * FROM log WHERE user_id = ?; -- WRONG
在分析SQL之前,该参数必须是SQL中的固定常量:

CREATE TEMP VIEW mylog AS SELECT * FROM log WHERE user_id = 1234; -- OK
如果您这样做,则由您来确保固定值是安全的。对于整数,这非常简单,只需将变量转换为整数,然后再将其格式化为SQL语句。纯整数不能引入任何导致SQL注入的内容

int userid = 1234;

string s = String.Format(@"CREATE TEMP VIEW mylog AS 
    SELECT * FROM log WHERE user_id = {0}", userid);
如果在解析之前将整数值格式化为数字文本到SQL中,那么它不是参数,应该可以解决您遇到的错误

或者,您可以从视图定义中省略条件,并让客户端在查询视图时指定条件:

CREATE TEMP VIEW mylog AS SELECT * FROM log; -- OK

SELECT * FROM mylog WHERE user_id = ?; -- OK

好吧,用户不应该创建视图,那么您到底想阻止谁注入坏代码呢?提前设置视图并使用参数查询它们。这是一个临时视图。我只是使用参数来阻止SQLite注入——查询本身是固定的。请看:“如果'TEMP'或'TEMPORARY'关键字出现在'CREATE'和'VIEW'之间,则创建的视图仅对创建它的数据库连接可见,并在数据库连接关闭时自动删除。”感谢您提供有关“临时工”/“临时工”的信息。你在文章中没有真正概述你的过程/流程,但听起来你可能在使用一个视图,而不是它的预期用途。是的,我不明白为什么在视图定义中需要任何用户提供的值。在查询视图的语句中,请确保。。。