Node+mysql의 SQL 인젝션을 설명하는 글

青灯夜游
풀어 주다: 2022-11-14 20:10:37
앞으로
1818명이 탐색했습니다.

Node+mysql의 SQL 인젝션을 설명하는 글

백엔드 개발에native NodeJS를 직접 사용하지는 않겠지만SQL 인젝션에 대한 이해는 필요합니다.SQL注入还是很有必要的。

本文使用NodeJS+MySQLSQL注入进行讲解。

SQL注入攻击是很古老的攻击方式了,自从web2.0诞生后就有SQL注入攻击。它通常出现在输入框文本域等前端组件中。在输入的内容里加入SQL语句,并一同传给后台。【相关教程推荐:nodejs视频教程

后台一不小心就会将前端传过来的SQL语句拼接到自己的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测试

Node+mysql의 SQL 인젝션을 설명하는 글

根据上面的登录方法可以得知,前端输入以下内容就可以登录成功

  • 用户名:leihou
  • 密码:123

但如果此时,用户名输入的是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 문으로 접합되고, 마지막으로 공격 코드로 접합됩니다. 따라서 예방 조치를 취해야 합니다. 그렇지 않으면 데이터가 유출되거나 데이터베이스가 삭제될 수도 있습니다.

SQL 주입 데모

로그인을 예로 들어,MySQLusers테이블을 추가하여 사용자 이름과 비밀번호를 저장합니다.users테이블에서 데이터 조각을 만들었습니다.사용자(사용자 이름,password, 실제 이름) 값에 삽입 ('leihou', ' 123', 'Thunder Monkey');데이터 의미:
  • 사용자 이름: 'leihou'
  • 비밀번호: ' 123 '
  • realname: 'Thunder Monkey'
이때NodeJS백그라운드에서 , 제가 만든 로그인 방법이 있어요rrreee위가 로그인 방법입니다. 마지막으로
"NodeJS http에서 언급한 방법을 통해 프런트엔드용 인터페이스를 생성할 수 있습니다. 요청하세요 . 인터페이스 부분은 이 글의 초점이 아니므로 여기서는 생략하겠습니다. 이때 또 다른HTML페이지를 생성하고 대략적인 컨텐츠를 생성한 후Ajax를 사용하여 백엔드와 연결합니다. 게으른 경우postman을 사용하여 직접 테스트할 수 있습니다Node+mysql의 SQL 인젝션을 설명하는 글위의 로그인 방법에 따르면 프론트 엔드에 다음 내용을 입력하면 성공적으로 로그인할 수 있음을 알 수 있습니다
  • 사용자 이름: leihou
  • 비밀번호: 123
단, 이때 사용자 이름이leihou' --로 입력되어 있다면, 공백이 있기 전과 뒤에--가 사용된다는 점에 유의하세요. 그러면 아무렇게나 비밀번호를 입력할 수 있습니다. 마지막으로 연결된SQL문은select username, realname from users where username='leihou' -- ' and Password='aslkfjsaf';참고하세요 내가 무심코 입력한 비밀번호.MySQL에서--는 주석의 의미를 나타냅니다. 따라서 위의 문은사용자 이름이 leihou인 데이터를 쿼리합니다가 됩니다. 당연히 비밀번호는 우회됩니다. 위에 입력한사용자 이름의 내용은 로그인을 우회하여 정보가 유출됩니다. 그러나 다른 사람이 귀하의 테이블을 삭제하려고 한다면 그 결과는 매우 심각할 것입니다. 예를 들어 사용자 이름 입력 상자에leihou'; 사용자에서 삭제; users테이블을 직접 삭제하세요.

예방 방법

SQL 주입 공격은 정말 너무 오래되어 10년이 넘었습니다. 그래서 기본적인 대처 방법은 성숙해졌습니다. 예를 들어 프런트 엔드에서 전달된 문자열을 트랜스코딩합니다.NodeJS를 사용하여 다운로드한MySQL종속성 패키지는escape메서드를 제공합니다. rrreeeescape메소드를 사용하여 필터링된 문자열은 이스케이프됩니다. 이 때, 사용자 이름이leihou' --를 입력하면 백엔드 콘솔에 다음 내용이 인쇄됩니다. rrreeeleihou'가 이스케이프되었습니다. 위는 MySQLSQL 주입 공격을 방지하는 방법입니다. 노드 관련 지식을 더 보려면 nodejs 튜토리얼을 방문하세요!

위 내용은 Node+mysql의 SQL 인젝션을 설명하는 글의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!