撇号导致 Node SQL 应用程序崩溃

Posted

技术标签:

【中文标题】撇号导致 Node SQL 应用程序崩溃【英文标题】:Apostrophe causes Node SQL application to crash 【发布时间】:2021-07-29 01:25:50 【问题描述】:

我有一个使用 sqlite3 和 Node/Express 的应用程序。应用程序中有一个查询数据库的搜索栏,但是当输入 ' 或 " 时,它会使整个页面崩溃。我知道它是 SQL 中的保留字符,但是我更喜欢输入时呈现 SQL 错误消息页面而不是完全崩溃。

当在后面输入常规输入(例如香蕉)时,它不起作用并继续使页面崩溃。任何想法为什么?

截图如下:

和代码:

app.js

    ...
    var query = "SELECT * FROM tab WHERE name = '" + req.query.name + "'"
    db.all(query, (error, rows) => 
            res.render(__dirname + '/views/search.ejs', data:rows, msg:req.query.name + " is available!")
    )
    ...

index.html(搜索栏)

                <form id="search_form" name="gs" method="get" action="search">
                <div class="searchText">
                  
                  <input type="text" name="name" class="searchText" id="searchText" placeholder="Enter your name here..." autocomplete="on">
                </div>
                    <input type="submit" name="results" class="main-button" value="Search Now">
                 </form>

search.ejs(显示数据库输出的内容)

              <span><%- msg %></span>
              <h2>Check out our x</h2>
              <table class="styled-table">
              <thead>
              <tr>
                <th>x</th>
                <th>y</th>
              </tr>
              </thead>
              <% data.forEach(function(dat)  %>
                <tr>
                  <td><%= dat.name %></td>
                  <td>$<%= dat.var %>/yr</td>
                </tr>
              <% ); %>
              </table>

【问题讨论】:

【参考方案1】:

您不应在 SQL 语句中对变量使用单撇号或双撇号,因为它容易受到 SQL 注入的影响。您应该:(1) 转义您的 SQL 语句或 (2) 使用 ?占位符。

(1) 逃跑

var a = 'AB1234';
var sql = 'SELECT * FROM orders WHERE cust = ' + mysql.escape(a);
con.query(sql, function (err, result) 
  if (err) throw err;
  console.log(result);
);

(2) ?占位符

var a = 'AB1234';
var sql = 'SELECT * FROM orders WHERE a = ?';
con.query(sql, [a], function (err, result) 
  if (err) throw err;
  console.log(result);
);

【讨论】:

是的,我最初是这样做的,但应用程序的目的是演示 SQL 注入,这就是为什么我没有转义或使用?目前。有没有办法在输入 ' 时只显示默认的 SQLite 错误消息? 您是否考虑过使用 try...catch 和 throw 子句?

以上是关于撇号导致 Node SQL 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 警报导致崩溃

为啥撇号会使 Rails 5.1.5 请求解析崩溃?

为啥我不能使用 ifstream 读取撇号而不崩溃?

为啥在 SQL Server CLR 中运行的一个函数可能会导致崩溃,而在独立应用程序中运行良好?

撇号未插入 SQL 数据库 [重复]

替换 bq SQL 中的撇号或引号