本文,希望能帮助到你来解决被sql注入攻击的问题,或者增进对sql注入的了解。
我拿到的客户端对象一般是const obj ={name:value}
假设我的语句是 ... where name = "${obj.name}"
如果此时,有个坏蛋鸡贼的发现你这样写。
那他完全可以传
const obj ={name:'666" or 1=1 or name="666'}
这时候,你的sql语句就会变成
... where name="666" or 1=1 or name="666"
因为 1=1 恒成立,所以他可以忽略name筛选条件,从而拿到数据。
因为鸡贼的坏人可以通过这样的方式拿到本不应该拿到数据,所以我们要防止sql注入
。
sql注入主要方式是听过特殊符号来搞事情,那么我们不让他使用特殊符号就好了。在此基础上,再加上一个保底函数,来过滤意外进入的字符串,就很完美了。
要处理的特殊符号主要是 单引号'
和 双引号"
,如果可以的话,空格也最好过滤掉。
我一般在使用客户端传入对象
之前会校验一下格式和长度,之后会调用一个方法来处理客户端传入对象
,来避免sql注入。(如下)
const obj = delPlainObjStringSign(object);
这里delPlainObjStringSign代码如下
function delPlainObjStringSign(obj) {
if (!obj) {
return obj;
}
if (typeof obj === 'object') {
for (const key of Object.keys(obj)) {
const value = obj[key];
if (typeof value === 'string') {
obj[key] = addslashes(value);
} else if (typeof value === 'object') {
obj[key] = delPlainObjStringSign(value);
}
console.log(obj[key]);
}
} else if (typeof obj === 'string') {
return addslashes(obj);
}
return obj;
}
function addslashes(str) {
let newS;
try {
if (JSON.parse(str)) {
newS = str;
} else {
newS = (str + '').replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0');
}
} catch (error) {
newS = (str + '').replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0');
}
return newS;
}
```
如果帮助到你了,一定不要忘记点赞~