programing

Knex.js는 sql injection을 방지합니까?

oldcodes 2023. 9. 21. 21:14
반응형

Knex.js는 sql injection을 방지합니까?

저는 MySql 데이터베이스를 사용하고 있으며 brought.js(SQL 서버 매개 변수화 쿼리 작성기)의 MySql 대안을 찾으려고 했습니다.백엔드에 Node.js를 사용하고 있습니다.

knex.js의 .raw() 명령어는 바인딩과 함께 사용하지 않으면 sql injection에 취약하다고 읽었습니다.하지만 다른 명령어들과 knex.js는 전체적으로 sql 주입을 방지하기 위해 사용해도 안전한가요?아니면 제가 나무를 잘못 짖고 있는 건가요?

knex 설명서에서 knex raw(https://knexjs.org/guide/raw.html#raw) 로 값을 전달하는 방법을 자세히 읽어 보십시오.

값을 raw에 대한 매개 변수 바인딩으로 전달하는 경우 다음과 같습니다.

knex.raw('select * from foo where id = ?', [1])

이 경우 매개 변수와 쿼리 문자열은 SQL 주입으로부터 쿼리를 보호하는 데이터베이스 드라이버에 별도로 전달됩니다.

다른 쿼리 작성기 메서드는 항상 내부적으로 바인딩 형식을 사용하므로 안전합니다.

특정 쿼리가 데이터베이스 드라이버로 전달되는 방법을 확인하려면 다음 작업을 수행할 수 있습니다.

knex('foo').where('id', 1).toSQL().toNative()

쿼리(https://runkit.com/embed/2yhqebv6pte6) 를 실행하기 위해 드라이버에 제공되는 SQL 문자열과 바인딩을 출력합니다.

knex 원시 쿼리로 할 수 있는 가장 큰 실수는 javascript 템플릿 문자열을 사용하고 변수를 SQL 문자열 형식에 직접 보간하는 것입니다.

knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS 

한 가지 주의해야 할 점은 knex 테이블/식별자 이름은 드라이버에 대한 바인딩으로 전달할 수 없으므로 사용자로부터 테이블/열 이름을 읽지 않도록 각별히 주의해야 합니다.

편집:

식별자 이름은 바인딩으로 전달할 수 없다는 것은 다음을 사용할 수 있다는 것을 의미합니다.??데이터베이스 드라이버에 전달될 때 SQL 문자열의 일부로 렌더링되는 식별자 이름에 대한 knex-binding입니다.

언급URL : https://stackoverflow.com/questions/49665023/does-knex-js-prevent-sql-injection

반응형