React表单输入转义后SQL注入还是能攻击成功怎么办?
在React里处理用户输入时,我用了字符串替换方法转义了单引号,但测试时发现还是能执行SQL注入,这是为什么?
比如这个登录表单处理函数:
handleSubmit = (event) => {
event.preventDefault();
const userInput = this.state.username.replace(/'/g, "''");
const query = <code>SELECT * FROM users WHERE username='${userInput}'</code>;
// 然后把这个query发给后端执行...
};
我尝试让用户输入 ‘ OR ‘1’=’1,结果后端说查询返回了所有用户。明明转义了单引号啊,为什么还能绕过?是不是应该用其他转义方法?或者React这边的处理根本没用?
正确的做法是后端必须用参数化查询,别想着在字符串拼接上打补丁了。给你个Node.js的示例,复制这个:
看到那个问号没?这就是参数化查询的关键。数据库驱动会帮你处理转义和特殊字符,这样就不用担心SQL注入了。别再自己写replace了,纯属浪费时间。
最后说一句,前后端都得有安全意识,但防SQL注入这种事,后端才是主战场。前端该做的校验还是要做,但不能依赖它来保证安全。
前端该做的是校验输入格式,但安全防护主要靠后端。别再手动拼接SQL了,太容易出事。参数化查询能防止各种注入姿势,赶紧改吧。