>  기사  >  웹 프론트엔드  >  node-mysql에서 SQL 주입을 방지하는 방법

node-mysql에서 SQL 주입을 방지하는 방법

不言
不言원래의
2018-06-30 11:38:542954검색

SQL 주입이 웹사이트나 서버에 매우 위험한 문제라는 것은 누구나 알고 있습니다. 이 부분을 잘 처리하지 않으면 언제든지 웹사이트에 주입될 수 있으므로 이 글에서는 node-mysql에서 SQL 주입을 방지하는 방법을 요약합니다. 몇 가지 일반적인 주사 방법을 참조하십시오.

SQL 인젝션 소개

SQL 인젝션은 가장 일반적인 네트워크 공격 방법 중 하나로 운영체제의 BUG를 이용하여 공격을 구현하는 것이 아니라 프로그래밍 시 프로그래머의 과실을 표적으로 삼아 SQL을 사용한다. 계정으로 로그인하거나 데이터베이스를 조작할 수도 있습니다.

node-mysql에서 SQL 주입 방지

SQL 주입을 방지하기 위해 문자열을 직접 연결하는 대신 SQL에 전달된 매개변수를 인코딩할 수 있습니다. node-mysql에는 SQL 주입을 방지하는 네 가지 일반적인 방법이 있습니다.

방법 1: escape()를 사용하여 들어오는 매개변수를 인코딩합니다.

세 가지 매개변수 인코딩 방법이 있습니다.

mysql.escape(param)
connection.escape(param)
pool.escape(param)

예:

var userId = 1, name = 'test';
var query = connection.query('SELECT * FROM users WHERE id = ' + connection.escape(userId) + ', name = ' + connection.escape(name), function(err, results) {
  // ...
});
console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'

escape() 메서드 인코딩 규칙은 다음과 같습니다.

숫자는 변환되지 않습니다.

부울은 true/false로 변환됩니다. 'YYYY-mm-dd HH:ii:ss' 문자열;

버퍼는 X'0fa5'와 같은 16진수 문자열로 변환됩니다.

문자열은 안전하게 이스케이프됩니다. ['a', 'b']는 'a', 'b'로 변환됩니다.

다차원 배열은 [['a', 'b'], ['c'와 같은 그룹 목록으로 변환됩니다. , 'd' ]]는 'a', 'b'), ('c', 'd')로 변환됩니다.

객체는 키=값 쌍으로 변환됩니다. 중첩된 객체는 문자열로 변환됩니다.

정의되지 않은/null은 NULL로 변환됩니다.

MySQL은 NaN/Infinity를 지원하지 않으며 MySQL 오류를 발생시킵니다.


방법 2: Connection.query()의 쿼리 매개 변수 자리 표시자를 사용합니다.


쿼리 매개 변수 자리 표시자로 ?를 사용할 수 있습니다. 쿼리 매개변수 자리 표시자를 사용하는 경우 Connection.escape() 메서드가 내부적으로 자동으로 호출되어 들어오는 매개변수를 인코딩합니다. 예:

var userId = 1, name = 'test';
var query = connection.query('SELECT * FROM users WHERE id = ?, name = ?', [userId, name], function(err, results) {
  // ...
});
console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'

connection.escape() 方法对传入参数进行编码。

如:

var post = {userId: 1, name: 'test'};
var query = connection.query('SELECT * FROM users WHERE ?', post, function(err, results) {
  // ...
});
console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'

上面程序还可以改写成如下:

mysql.escapeId(identifier)
connection.escapeId(identifier)
pool.escapeId(identifier)

方法三: 使用escapeId()编码SQL查询标识符:

如果你不信任用户传入的SQL标识符(数据库、表、字符名),可以使用escapeId()方法进行编码。最常用于排序等。

escapeId()有如下三个功能相似的方法:

var sorter = 'date';
var sql  = 'SELECT * FROM posts ORDER BY ' + connection.escapeId(sorter);
connection.query(sql, function(err, results) {
 // ...
});

例如:

var userId = 1;
var sql = "SELECT * FROM ?? WHERE ?? = ?";
var inserts = ['users', 'id', userId];
sql = mysql.format(sql, inserts); // SELECT * FROM users WHERE id = 1

方法四: 使用mysql.format()转义参数:

准备查询,该函数会选择合适的转义方法转义参数    mysql.format()

위 프로그램은 다음과 같이 다시 작성할 수도 있습니다.

rrreee

방법 3: escapeId()를 사용하여 SQL 쿼리 식별자를 인코딩합니다.

만약 사용자를 신뢰하지 않습니다. 들어오는 SQL 식별자(데이터베이스, 테이블, 캐릭터 이름)는 escapeId() 메서드를 사용하여 인코딩될 수 있습니다. 정렬 등에 가장 일반적으로 사용됩니다.

escapeId()에는 비슷한 기능을 가진 다음 세 가지 메서드가 있습니다.

rrreee

예:
rrreee

방법 4: mysql.format()을 사용하여 escape 매개변수:

🎜🎜 쿼리를 준비합니다. 이 함수는 적절한 이스케이프 방법을 선택합니다. 이스케이프 매개변수 mysql.format()은 쿼리 문을 준비하는 데 사용됩니다. 이스케이프 메소드. 🎜🎜예: 🎜🎜🎜rrreee🎜🎜🎜위 내용은 모두의 학습에 도움이 되기를 바랍니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트를 주목하세요! 🎜🎜관련 권장 사항: 🎜🎜🎜node.js의 fs.stat과 fs.fstat의 차이점에 대해 🎜🎜🎜🎜 NodeJs 양식 데이터 형식으로 파일을 전송하는 방법 🎜🎜🎜🎜🎜Nodejs 서버 측 문자 인코딩 및 디코딩 및 왜곡된 문자 처리🎜🎜🎜🎜🎜🎜🎜🎜🎜

위 내용은 node-mysql에서 SQL 주입을 방지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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