如何使用参数化输入确保要插入数据库的值实际上是NULL值,而不是'NULL'或空字符串?
注意:这已从一个问题修改为更多的教程。
答案 0 :(得分:1)
使用“ mariadb / callback”作为数据库的连接器:
const db = require('mariadb/callback');
mariaDB是MySQL数据库的一种选择。
让我们使用以下作为示例变量:
var customName = ' ';
var someAddress = 'this is an address';
var mainID = 'some unique ID';
var secondID = 'maybe not a unique ID';
查询的参数如下:
var sql = `UPDATE myTable SET myName=?, myAddress=? WHERE _id=? AND otherID=?;`;
通过使用'?'字符而不是变量名不仅可以简化SQL语句,而且(更重要的是)可以防止SQL注入。具体来说,如果其中一个变量存储了该变量:
var id = '42 OR 1=1;'
在这种情况下,不使用参数化输入的结果可能会导致整个表使用相同的名称和地址进行更新。使用参数化的输入只会导致此操作失败,因为数据库中的id都不会为“ 42 OR 1 = 1”。
现在,如果customName是一个空字符串或空格,甚至是一个'NULL'字符串,您都可以这样做:
customName = customName.trim();
if ( (customName === '') || (customName.toUpperCase() === 'NULL') ) {
customName = null;
}
与以下相同:
if ( (customName.trim() === '') || (customName.trim().toUpperCase() === 'NULL') ) {
customName = null;
}
(第一个版本只是在没有任何前导/尾随空格的情况下重新分配了customName-确保选择此方法时无需保留字符串的值)
.trim()
将删除字符串两端的所有空白(不会删除任何非空白字符之间的任何空白)。
.toUpperCase()
会将字符串更改为所有大写字符,这样,如果字符串为'null'或'Null'或任何其他包含小写字符的变体,则在评估字符串时仍将评估为'true' 'NULL'相等。请注意,同样在此使用.trim()
也很重要
' nuLl '
成为
'NULL'
,并且仍然评估为“ true”。
接下来,我们需要创建值数组:
var values = [customName, someAddress, mainID, secondID];
最后,数据库查询:
db.query(sql, values, (err, result) => {
// callback stuff to do here
}
db是指在本文开头创建的连接器。我没有包括实际的连接过程,因为这超出了本文的范围。供参考,documentation for the API is here。
在连接数据库之后,使用db.query执行查询。第一个参数“ sql”是参数化的SQL语句。第二个参数“值”是将在查询中使用的值的数组。此数组必须与使用的顺序相同。
作为不执行操作的示例:
var sql = `UPDATE myTable SET myName=${customName}, myAddress=${someAddress} WHERE _id=${mainID} AND otherID=${secondID};`;
这很糟糕的原因是由于SQL注入,其工作方式如下: 您首先要这样做:
var customName = 'same name';
var mainID = '" OR ""="';
var secondID = '" OR ""="';
生成的sql代码将是:
var sql = `UPDATE myTable SET myName="same name", myAddress="this is an address" WHERE _id="" OR ""="" AND otherID="" OR ""="";`;
结果是,数据库中的每个条目现在都具有相同的名称和地址。
此SQL注入示例是从W3 schools修改而来的。
答案 1 :(得分:0)
如果您尝试INSERT INTO mytable VALUES ('', NULLIF('$customName',''))
还有其他一些资源,它们似乎也有类似的问题,Set value to NULL in MySQL, How to update column with null value, Set value to NULL in MySQL
现在我想到了,您可能只需要更改customName = "NULL"
答案 2 :(得分:0)
您必须创建第二个表并仅在myname!== Null时填充表
和
选择mytable t1,然后在t1.id = t2.id上加入mytablewithvalidnames t2
这样,t2.myname将为Null
答案 3 :(得分:0)
?有同样的问题 解决方法非常简单, 使用null而不是NULL, 所以就你而言
var sql = UPDATE myTable SET myName=?, myAddress=? WHERE _id=? AND otherID=?;
;
其中customName = null;