Javascript 无法转义单引号
我正试图找出一种方法,在我发送给泛型函数的“预构建”SQL查询(我的所有查询都使用它)中转义单引号 我尝试了escape npm插件,手动操作,等等 下面是我构建查询的代码,当我输入例如“it's”时,数据字符串会因为特殊字符而出错:Javascript 无法转义单引号,javascript,sql,node.js,sql-server,tedious,Javascript,Sql,Node.js,Sql Server,Tedious,我正试图找出一种方法,在我发送给泛型函数的“预构建”SQL查询(我的所有查询都使用它)中转义单引号 我尝试了escape npm插件,手动操作,等等 下面是我构建查询的代码,当我输入例如“it's”时,数据字符串会因为特殊字符而出错: exports.addEntry=(请求、资源、名称页、名称表、数据)=>{ Object.keys(数据).forEach(函数(k,id){ console.log(数据[k]); 如果(数据[k]!=null){ 如果(id>0){ columnString
exports.addEntry=(请求、资源、名称页、名称表、数据)=>{
Object.keys(数据).forEach(函数(k,id){
console.log(数据[k]);
如果(数据[k]!=null){
如果(id>0){
columnString+=`,`;
数据字符串+=`,`;
}
columnString+=`${[k]}`;
dataString+=`${data[k]}`;
}
});
试一试{
如果(!data)抛出新错误(“输入无效”);
如果(数据){
var sqlQuery=`插入${nomTable}(${columnString})值(${dataString})`;
connect.connectDatabase(sqlQuery,(数据,错误)=>{
[...]
我前面提到的通用函数是:
var sql=要求(“mssql”);
var config=require(“../settings”).config;
exports.connectDatabase=函数(rawQuery,回调){
var conn=newsql.ConnectionPool(配置);
康涅狄格州
.connect()
.然后(函数(){
var req=新的sql.Request(conn);
请求
.query(rawQuery)
.then(函数(记录集){
回调(recordset.recordset);
})
我的计划是让查询只使用一个函数,而不是使用多个做几乎相同事情的函数
非常感谢您的帮助。构建此查询的方式正是您不想做的。它使您完全可以接受SQL注入 为了避免这种情况,您需要参数化您的查询。这里增加的好处是它将处理所有转义 下面是一个直接来自MS文档的示例,演示了如何使用node.js驱动程序为SQL Server执行参数化查询 遵循此范例的代码将如下所示:
exports.addEntry = (req, res, nomPage, nomTable, data) => {
Object.keys(data).forEach(function (k, id) {
console.log(data[k]);
if (data[k] != null) {
if (id > 0) {
columnString += `,`;
dataString += `,`;
}
columnString += `${[k]}`;
dataString += `@${data[k]}`;
}
});
try {
if (!data) throw new Error("Input not valid");
if (data) {
var sqlQuery = `INSERT INTO ${nomTable} (${columnString}) VALUES (${dataString})`;
connect.connectDatabase(sqlQuery, (data, err) => {
[...]
所有的变化都是构建数据字符串的操作
注意,现在需要将参数输入到命令执行中,以替换之前嵌入的数据
有几种方法可以做到这一点:
1-将冒号替换为方括号将创建一个字符串值数组,然后您只需担心通过数组长度进行排序,这将增加您的处理时间,但如果您的应用程序不是太大,则不会产生太大的差异
2-使用\'
对字符串中的单引号进行转义,或使用\'
对双引号进行转义
让我知道这是否有帮助,因为这是一个快速的答案。如果你能使用参数传递你的值,它们将为你做所有的工作。Dale K是100%正确的。但是如果你必须…用两个单引号替换单引号,例如,O'Neal变成O'Nealth没有更好的(没有其他更好的)解决方案不是参数化。注入是一个巨大的安全缺陷,您不应该在应用程序中留下此类漏洞。不要用两个单引号替换单引号。这会导致灾难。请使用参数。如果我错了,请纠正我,使用参数传递值将是:var sql=SELECT*FROM?conn.query(sql[表格名称]我试过这样做,但我不知道如何保持我的预构建查询完整,并将我的值传递到另一个函数中,以便像上面的代码一样使用。是否有一个网站可以开始学习这些内容?作为一个初学者,我有点迷茫。我看到使用了“@”,但我不知道如何实现它。我忘了说我使用了tedious和用户以非固定数量的参数输入数据(取决于页面)。有些页面需要1个参数,有些页面需要10+以上。我在您的示例中看到的所有示例似乎都必须在知道需要多少参数之前声明参数量。到目前为止,我的单个函数可以创建我想要的任何查询(没有任何安全性),我只是不知道如何更改以增加安全性并保持此通用函数的灵活性。您看到的?
只是参数的占位符。您也可以使用命名参数,如示例中所示,其形式为@parameterName
。关于第二个问题,我完全不依赖单个参数函数来执行所有数据库调用。然后,您不仅可以消除关于有多少个参数的不确定性,还可以消除关于要编写哪个查询的不确定性。此模式甚至可以消除您正在进行的查询构建。