是否可以在没有准备好的语句(Node.js 和 MSSQL)的情况下防止 SQL 注入

Posted

技术标签:

【中文标题】是否可以在没有准备好的语句(Node.js 和 MSSQL)的情况下防止 SQL 注入【英文标题】:Is it possible to prevent SQL injection without prepared statements (Node.js & MSSQL) 【发布时间】:2018-02-21 16:27:35 【问题描述】:

是否可以简单地从用户输入中转义危险字符,然后直接运行 SQL 查询,而不是使用准备好的语句?

例如,我可以只在输入上使用以下函数,构建查询然后执行它吗?

function mysql_real_escape_string (str) 
    return str.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) 
        switch (char) 
            case "\0":
                return "\\0";
            case "\x08":
                return "\\b";
            case "\x09":
                return "\\t";
            case "\x1a":
                return "\\z";
            case "\n":
                return "\\n";
            case "\r":
                return "\\r";
            case "\"":
            case "'":
            case "\\":
            case "%":
                return "\\"+char; // prepends a backslash to backslash, percent,
                                  // and double/single quotes
        
    );

【问题讨论】:

也许这可以帮助你github.com/mysqljs/mysql#escaping-query-values 这绝对是XY Problem 的情况,绝不应该出现直接运行查询并手动尝试避免注入比准备语句更安全或更好的情况。你需要这个做什么? 基本上,我花了一整天的时间试图弄清楚如何使用准备好的语句(用于 Node.js 和 MSSQL),但我运气不佳。 (我是这个的新手)。我希望有一个简单的替代方案。 mysqljs 是提供preparedstatement和转义方法的库之一 对于图灵完备的 SQL 版本,阻止所有可能输入的 SQL 注入就相当于解决了停机问题。 【参考方案1】:

创建存储过程。构建数据访问层/服务。从应用程序调用服务上的方法,从应用程序传递适当的方法参数。

在我的 Angular 代码中,我从一个数据存储层调用,该数据存储层实现为在我的组件中注入的服务。

【讨论】:

以上是关于是否可以在没有准备好的语句(Node.js 和 MSSQL)的情况下防止 SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章

在使用准备好的语句执行插入查询后获取自动增量 ID

是否可以使用单个准备好的语句插入填充类型为 set<text> 的列的记录?

我可以重新定义相同的准备好的语句吗?

我啥时候应该使用准备好的语句?

Golang使用准备好的SQL语句

PDO 是不是仍在为 MySQL 模拟准备好的语句?