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 오류를 발생시킵니다.
쿼리 매개 변수 자리 표시자로 ?를 사용할 수 있습니다. 쿼리 매개변수 자리 표시자를 사용하는 경우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 쿼리 식별자를 인코딩합니다.escapeId()
에는 비슷한 기능을 가진 다음 세 가지 메서드가 있습니다.
방법 4: mysql.format()을 사용하여 escape 매개변수:
쿼리를 준비합니다. 이 함수는 적절한 이스케이프 방법을 선택합니다. 이스케이프 매개변수mysql.format()
은 쿼리 문을 준비하는 데 사용됩니다. 이스케이프 메소드. 예: rrreee위 내용은 모두의 학습에 도움이 되기를 바랍니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트를 주목하세요! 관련 권장 사항: node.js의 fs.stat과 fs.fstat의 차이점에 대해 NodeJs 양식 데이터 형식으로 파일을 전송하는 방법 Nodejs 서버 측 문자 인코딩 및 디코딩 및 왜곡된 문자 처리
위 내용은 node-mysql에서 SQL 주입을 방지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!