我正在编写一个带有SQLite数据库后端的C#应用程序,并使用System.Data.SQLite
与数据库进行交互。
尝试使用参数创建视图时,出现以下错误:
SQL逻辑错误
视图中不允许使用参数
如果不允许使用参数,如何保护我的代码免受SQL注入?
答案 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