백엔드 개발에 native NodeJS를 직접 사용하지는 않겠지만 SQL 인젝션
에 대한 이해는 필요합니다. SQL注入
还是很有必要的。
本文使用 NodeJS
+ MySQL
对 SQL注入
进行讲解。
SQL注入攻击
是很古老的攻击方式了,自从 web2.0
诞生后就有 SQL注入攻击
。它通常出现在 输入框 、文本域 等前端组件中。在输入的内容里加入 SQL语句
,并一同传给后台。【相关教程推荐:nodejs视频教程】
后台一不小心就会将前端传过来的 SQL语句
拼接到自己的 SQL语句
中,最终拼接成一段攻击代码。
所以必须加以预防,不然有可能出现数据泄露,甚至被删库等可能。
以登录为例,我在 MySQL
中添加一个 users
表,里面存储用户名和密码。
在 users
表中,我创建了一条数据:insert into users (username,
password, realname) values ('leihou', '123', '雷猴');
数据的意思是:
username: 'leihou'
password: '123'
realname: '雷猴'
此时,在 NodeJS
后台,我创建了一个登录方法
const mysql = require('mysql') // 创建连接对象 const con = mysql.createConnection({ host: 'localhost', // 地址 user: 'root', // 连接数据库的用户 password: '123456', // 连接数据库的密码 port: '3306', // 默认端口 database: 'testdb' // 数据库名 }) // 开始连接 con.connect() // 统一执行 sql 的函数 function exec(sql) { const promise = new Promise((resolve, reject) => { con.query(sql, (err, result) => { if (err) { reject(err) return } resolve(result) }) }) return promise } // 登录方法 const login = (username, password) => { const sql = ` select username, realname from users where username='${username}' and password='${password}'; ` console.log(sql) return exec(sql).then(rows => { return rows[0] || {} }) }
上面是登录方法。
最后可以通过 《NodeJS http请求》 里提到的方法创建一个接口给前端。由于接口部分不是本文重点,所以这里打算略过(让我偷懒吧)。
此时再创建一个 HTML
页面,大概生成一下内容,然后使用 Ajax
与后端对接。
如果你懒的话可以直接使用 postman
测试
根据上面的 登录方法 可以得知,前端输入以下内容就可以登录成功
但如果此时,用户名输入的是 leihou' --
,注意 --
前后都有空格。那密码就可以随便输入了。
最后拼接出来的 SQL
语句是 select username, realname from users where username='leihou' -- ' and password='aslkfjsaf';
注意,密码我是随便输入的。
在 MySQL
里, --
代表注释的意思。所以上面的语句就变成 查询 username 为 leihou 的那条数据
。自然就绕过了密码。
上面输入的 username
的内容绕过登录,泄露了信息。但如果别人要删掉你的表,那后果就非常严重了。
比如在用户名输入框内输入:leihou'; delete from users; --
。
直接就把 users
表给删掉了。
SQL注入攻击
实在太古老了,有十几年历史了。所以基本的应对方法都成熟了。
比如将前端传过来的字符串进行转码。
使用 NodeJS
下载的 MySQL
依赖包里就提供了这个方法:escape
。
// 省略部分代码 const mysql = require('mysql') // 省略创建连接对象 // 省略开始连接 // 统一执行 sql 的函数 exec 方法 const escape = mysql.escape const login = (username, password) => { username = escape(username) password = escape(password) const sql = ` select username, realname from users where username=${username} and password=${password}; ` console.log(sql) return exec(sql).then(rows => { return rows[0] || {} }) }
使用 escape
方法过滤后的字符串会被转义。
此时如果用户名输入 leihou' --
,在后端控制台会打印出如下内容:
select username, realname from users where username='leihou\' -- ' and password='123345';
可以看到 leihou'
后面的单引号被转义了。
以上就是 MySQL
防范 SQL注入攻击
NodeJS
+ MySQL
를 사용하여 SQL 삽입
을 설명합니다. SQL 주입 공격
은 아주 오래된 공격 방법입니다. web2.0
이 탄생한 이후로 SQL 주입 공격
이 있었습니다. 일반적으로 입력 상자
SQL 문
을 추가하고 함께 백그라운드로 전달합니다. [관련 추천 튜토리얼: nodejs 동영상 튜토리얼🎜]🎜🎜배경이 조심스럽지 않으면 전면 -end가 전송됩니다. 들어오는 SQL 문
은 자신의 SQL 문
으로 접합되고, 마지막으로 공격 코드로 접합됩니다. 🎜🎜따라서 예방 조치를 취해야 합니다. 그렇지 않으면 데이터가 유출되거나 데이터베이스가 삭제될 수도 있습니다. 🎜MySQL
에 users
테이블을 추가하여 사용자 이름과 비밀번호를 저장합니다. 🎜🎜users
테이블에서 데이터 조각을 만들었습니다. 사용자(사용자 이름,
password, 실제 이름) 값에 삽입 ('leihou', ' 123', 'Thunder Monkey');
🎜🎜데이터 의미: 🎜사용자 이름: 'leihou'
비밀번호: ' 123 '
realname: 'Thunder Monkey'
NodeJS
백그라운드에서 , 제가 만든 로그인 방법이 있어요🎜rrreee🎜위가 로그인 방법입니다. 🎜🎜마지막으로 "NodeJS http에서 언급한 방법을 통해 프런트엔드용 인터페이스를 생성할 수 있습니다. 요청하세요🎜 . 인터페이스 부분은 이 글의 초점이 아니므로 여기서는 생략하겠습니다. 🎜🎜이때 또 다른 HTML
페이지를 생성하고 대략적인 컨텐츠를 생성한 후 Ajax
를 사용하여 백엔드와 연결합니다. 🎜🎜게으른 경우 postman
을 사용하여 직접 테스트할 수 있습니다🎜🎜🎜🎜위의 🎜로그인 방법🎜에 따르면 프론트 엔드에 다음 내용을 입력하면 성공적으로 로그인할 수 있음을 알 수 있습니다🎜leihou' --
로 입력되어 있다면, 공백이 있기 전과 뒤에 --
가 사용된다는 점에 유의하세요. 그러면 아무렇게나 비밀번호를 입력할 수 있습니다. 🎜🎜마지막으로 연결된 SQL
문은 select username, realname from users where username='leihou' -- ' and Password='aslkfjsaf';
🎜🎜참고하세요 내가 무심코 입력한 비밀번호. 🎜🎜MySQL
에서 --
는 주석의 의미를 나타냅니다. 따라서 위의 문은 사용자 이름이 leihou인 데이터를 쿼리합니다
가 됩니다. 당연히 비밀번호는 우회됩니다. 🎜🎜위에 입력한 사용자 이름
의 내용은 로그인을 우회하여 정보가 유출됩니다. 그러나 다른 사람이 귀하의 테이블을 삭제하려고 한다면 그 결과는 매우 심각할 것입니다. 🎜🎜예를 들어 사용자 이름 입력 상자에 leihou'; 사용자에서 삭제; 🎜🎜<code>users
테이블을 직접 삭제하세요. 🎜SQL 주입 공격
은 정말 너무 오래되어 10년이 넘었습니다. 그래서 기본적인 대처 방법은 성숙해졌습니다. 🎜🎜예를 들어 프런트 엔드에서 전달된 문자열을 트랜스코딩합니다. 🎜🎜NodeJS
를 사용하여 다운로드한 MySQL
종속성 패키지는 escape
메서드를 제공합니다. 🎜rrreee🎜 escape
메소드를 사용하여 필터링된 문자열은 이스케이프됩니다. 🎜🎜이 때, 사용자 이름이 leihou' --
를 입력하면 백엔드 콘솔에 다음 내용이 인쇄됩니다. 🎜rrreee🎜leihou'가 이스케이프되었습니다. 🎜🎜위는 <code>MySQL
이 SQL 주입 공격
을 방지하는 방법입니다. 🎜🎜노드 관련 지식을 더 보려면 🎜nodejs 튜토리얼🎜을 방문하세요! 🎜위 내용은 Node+mysql의 SQL 인젝션을 설명하는 글의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!