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

时间:2019-02-19 18:08:26

标签: c# sql sqlite sql-injection sql-view

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

尝试使用参数创建视图时,出现以下错误:

  

SQL逻辑错误

     

视图中不允许使用参数

如果不允许使用参数,如何保护我的代码免受SQL注入?

1 个答案:

答案 0 :(得分:1)

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

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