Node+mysql의 SQL 인젝션을 설명하는 글
백엔드 개발에 native NodeJS를 직접 사용하지는 않겠지만 SQL 인젝션
에 대한 이해는 필요합니다. SQL注入
还是很有必要的。
本文使用 NodeJS
+ MySQL
对 SQL注入
进行讲解。
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
测试
根据上面的 登录方法 可以得知,前端输入以下内容就可以登录成功
- 用户名: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 주입 데모🎜
🎜 로그인을 예로 들어,MySQL
에 users
테이블을 추가하여 사용자 이름과 비밀번호를 저장합니다. 🎜🎜users
테이블에서 데이터 조각을 만들었습니다. 사용자(사용자 이름,
password, 실제 이름) 값에 삽입 ('leihou', ' 123', 'Thunder Monkey');
🎜🎜데이터 의미: 🎜사용자 이름: 'leihou'
비밀번호: ' 123 '
realname: 'Thunder Monkey'
NodeJS
백그라운드에서 , 제가 만든 로그인 방법이 있어요🎜rrreee🎜위가 로그인 방법입니다. 🎜🎜마지막으로 "NodeJS http에서 언급한 방법을 통해 프런트엔드용 인터페이스를 생성할 수 있습니다. 요청하세요🎜 . 인터페이스 부분은 이 글의 초점이 아니므로 여기서는 생략하겠습니다. 🎜🎜이때 또 다른 HTML
페이지를 생성하고 대략적인 컨텐츠를 생성한 후 Ajax
를 사용하여 백엔드와 연결합니다. 🎜🎜게으른 경우 postman
을 사용하여 직접 테스트할 수 있습니다🎜🎜
- 사용자 이름: leihou
- 비밀번호: 123
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이 기사는 NodeJS V8 엔진의 메모리 및 가비지 수집기(GC)에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다.

Non-Blocking, Event-Driven 기반으로 구축된 Node 서비스는 메모리 소모가 적다는 장점이 있으며, 대규모 네트워크 요청을 처리하는데 매우 적합합니다. 대규모 요청을 전제로 '메모리 제어'와 관련된 문제를 고려해야 합니다. 1. V8의 가비지 수집 메커니즘과 메모리 제한 Js는 가비지 수집 기계에 의해 제어됩니다.

파일 모듈은 파일 읽기/쓰기/열기/닫기/삭제 추가 등과 같은 기본 파일 작업을 캡슐화한 것입니다. 파일 모듈의 가장 큰 특징은 모든 메소드가 **동기** 및 ** 두 가지 버전을 제공한다는 것입니다. 비동기**, sync 접미사가 있는 메서드는 모두 동기화 메서드이고, 없는 메서드는 모두 이기종 메서드입니다.

최근 인터페이스 문서를 검토하던 중 친구가 정의한 매개변수가 열거형 값인데, 인터페이스 문서에서 해당 특정 열거값을 제공하지 않는 것을 발견했습니다. 사실 인터페이스 문서를 어떻게 잘 작성하느냐가 정말 중요합니다. 오늘 Tianluo 형제는 인터페이스 디자인 문서에서 주의해야 할 12가지 사항을 알려드립니다~

이 글이 여러분에게 golang의 제네릭에 대한 심층적인 이해를 가져다 줄 것입니다. 제네릭을 사용하는 방법? 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

이벤트 루프는 Node.js의 기본 부분이며 메인 스레드가 차단되지 않도록 하여 비동기 프로그래밍을 가능하게 합니다. 이벤트 루프를 이해하는 것은 효율적인 애플리케이션을 구축하는 데 중요합니다. 다음 기사는 Node.js의 이벤트 루프에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다!

초기에 JS는 브라우저 측에서만 실행되었습니다. 유니코드로 인코딩된 문자열은 처리하기 쉬웠지만 바이너리 및 유니코드가 아닌 인코딩된 문자열을 처리하는 것은 어려웠습니다. 그리고 바이너리는 컴퓨터의 가장 낮은 데이터 형식인 비디오/오디오/프로그램/네트워크 패키지입니다.

일부 하위 수준 라이브러리에서는 안전하지 않은 패키지가 사용되는 경우를 자주 볼 수 있습니다. 이 기사는 Golang의 안전하지 않은 패키지를 이해하고 안전하지 않은 패키지의 역할과 포인터 사용 방법을 소개하는 데 도움이 되기를 바랍니다.
