撇号导致 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 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章