목차
SQL 注入演示
防止方法
🎜SQL 주입 데모🎜
🎜예방 방법🎜
웹 프론트엔드 JS 튜토리얼 Node+mysql의 SQL 인젝션을 설명하는 글

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

Nov 14, 2022 pm 08:10 PM
node.js 후방

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'; 사용자에서 삭제; 🎜🎜<code>users 테이블을 직접 삭제하세요. 🎜

🎜예방 방법🎜

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

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

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

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

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

Node V8 엔진의 메모리와 GC에 대한 자세한 그래픽 설명 Node V8 엔진의 메모리와 GC에 대한 자세한 그래픽 설명 Mar 29, 2023 pm 06:02 PM

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

Node의 메모리 제어에 관한 기사 Node의 메모리 제어에 관한 기사 Apr 26, 2023 pm 05:37 PM

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

Node의 파일 모듈에 대해 자세히 이야기해 보겠습니다. Node의 파일 모듈에 대해 자세히 이야기해 보겠습니다. Apr 24, 2023 pm 05:49 PM

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

인터페이스 디자인 문서를 공유할 때 주의할 점 12가지 인터페이스 디자인 문서를 공유할 때 주의할 점 12가지 Apr 24, 2023 am 10:58 AM

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

golang의 제네릭에 대한 심층적인 이해(Generic) golang의 제네릭에 대한 심층적인 이해(Generic) Apr 11, 2023 pm 07:20 PM

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

Node의 이벤트 루프에 대해 이야기해 봅시다. Node의 이벤트 루프에 대해 이야기해 봅시다. Apr 11, 2023 pm 07:08 PM

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

노드의 버퍼에 대해 자세히 알아보기 노드의 버퍼에 대해 자세히 알아보기 Apr 25, 2023 pm 07:49 PM

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

Golang의 안전하지 않은 패키지에 대해 알아보기 Golang의 안전하지 않은 패키지에 대해 알아보기 Apr 02, 2023 am 08:30 AM

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

See all articles