programing

노드에서 NULL 값을 삽입하는 방법파라미터화된 입력을 사용하여 JS/Javascript to MySQL을 사용합니까?

bestcode 2022. 9. 4. 15:22
반응형

노드에서 NULL 값을 삽입하는 방법파라미터화된 입력을 사용하여 JS/Javascript to MySQL을 사용합니까?

파라미터화된 입력을 사용하여 데이터베이스에 삽입되는 값이 실제로는 'NULL' 또는 빈 문자열이 아닌 NULL 값임을 확인하려면 어떻게 해야 합니까?

주의: 이 질문은 튜토리얼에 가깝도록 수정되었습니다.

데이터베이스에 대한 커넥터로 'mariadb/callback'을 사용합니다.

const db = require('mariadb/callback');

mariaDB는 MySQL 데이터베이스의 옵션 중 하나입니다.

예제 변수로 다음을 사용합니다.

var customName = '    ';
var someAddress = 'this is an address';
var mainID = 'some unique ID';
var secondID = 'maybe not a unique ID';

쿼리는 다음과 같이 파라미터화 됩니다.

var sql = `UPDATE myTable SET myName=?, myAddress=? WHERE _id=? AND otherID=?;`;

변수 이름 대신 ? 문자를 사용하면 SQL 문을 단순화할 수 있을 뿐만 아니라 SQL 주입을 방지할 수 있습니다.구체적으로는 변수 중 하나가 이 정보를 저장하고 있는 경우:

var id = '42 OR 1=1;'

이 경우 파라미터화된 입력을 사용하지 않으면 테이블 전체가 동일한 이름과 주소로 갱신될 수 있습니다.데이터베이스의 ID가 '42 OR 1=1'이 되지 않기 때문에 매개 변수화된 입력을 사용하면 이 작업이 실패합니다.

customName이 빈 문자열, 공백 또는 'NULL' 문자열인 경우 다음을 수행할 수 있습니다.

customName = customName.trim();
if ( (customName === '') || (customName.toUpperCase() === 'NULL') ) {
  customName = null;
}

즉, 다음과 같습니다.

if ( (customName.trim() === '') || (customName.trim().toUpperCase() === 'NULL') ) {
  customName = null;
}

(첫 번째 버전은 선행/추적 공백 없이 customName을 재할당합니다.이 메서드를 선택할 때 문자열 값을 유지할 필요가 없는지 확인하십시오.)

.trim()는 문자열의 양 끝에서 모든 공백을 삭제합니다(공백이 아닌 문자 사이의 공백은 삭제되지 않습니다).

.toUpperCase()는 문자열을 모두 대문자로 변경합니다.이렇게 하면 문자열이 'null' 또는 'null' 또는 소문자를 포함하는 기타 변형인 경우에도 'null' 동등성을 평가할 때 여전히 'true'로 평가됩니다. 주의해 주세요..trim()

'  nuLl  '

된다

'NULL'

여전히 '참'으로 평가됩니다.

다음으로 가치 배열을 작성해야 합니다.

var values = [customName, someAddress, mainID, secondID];

마지막으로 db 쿼리:

db.query(sql, values, (err, result) => {
  // callback stuff to do here
}

db는 이 투고 처음에 작성된 커넥터입니다.실제 연결 프로세스는 이 게시물의 범위를 벗어났기 때문에 포함하지 않았습니다.참고로 API에 대한 설명서는 여기에 있습니다.

DB가 연결되면 db.query를 사용하여 쿼리를 실행합니다.첫 번째 인수 'sql'은 매개 변수화된 SQL 문입니다.두 번째 인수 'values'는 쿼리에서 사용되는 값의 배열입니다.이 어레이는 사용하는 순서와 같아야 합니다.

실행하지 않는 것의 예로서 다음과 같은 것이 있습니다.

var sql = `UPDATE myTable SET myName=${customName}, myAddress=${someAddress} WHERE _id=${mainID} AND otherID=${secondID};`;

이것이 나쁜 이유는 다음과 같이 동작하는 SQL 주입 때문입니다.먼저 다음 작업을 수행합니다.

var customName = 'same name';
var mainID = '" OR ""="';
var secondID = '" OR ""="';

결과 SQL 코드는 다음과 같습니다.

var sql = `UPDATE myTable SET myName="same name", myAddress="this is an address" WHERE _id="" OR ""="" AND otherID="" OR ""="";`;

그 결과 데이터베이스의 모든 엔트리가 동일한 이름과 주소를 갖게 되었습니다.

이 SQL 주입 예는 W3 학교에서 수정되었습니다.

네가 노력하면 어때?INSERT INTO mytable VALUES ('', NULLIF('$customName',''))

비슷한 문제가 있는 것으로 보이는 다른 리소스도 몇 가지 있습니다. MySQL에서 값을 NULL설정, NULL 값을 사용하여 열을 업데이트하는 방법, MySQL에서 값을 NULL로 설정

그리고 지금 생각해보니 네가 변해야 할 것 같아customName = "NULL"

my name의 경우에만 두 번째 테이블을 만들고 테이블을 채워야 합니다.==외관

그리고.

mytable t1 left join mytable with valid names t2 on t1.id=t2.id 를 선택합니다.

이렇게 하면 t2.my name은 Null이 됩니다.

다른 솔루션:mysql2npm 라이브러리는 다음과 같은 작업을 수행합니다.

const IS_NULL = some_param ? `'${some_param}'` : 'NULL'
const saveRecordsQuery = `INSERT INTO some_table (some_column) VALUES (${some_param});`

문자열 NULL이 아닌 SQL NULL 값이 쿼리에 삽입됩니다. 삽입할 값이 정의되지 않았거나 정의되지 않았거나 NULL이면 다음과 같습니다.

INSERT INTO some_table (some_column) VALUES (NULL);

또한 JSON 데이터에서 SQL 쿼리 문자열을 구축하는 데에도 어려움을 겪었습니다.null가치.가장 좋은 해결책은 아니지만 입력 데이터를 통해 반복하게 되었습니다.그 결과, 이 데이터에는, 다음의 필드가 포함되지 않았습니다.null값:

{ key1 : "value1", key2 : "value2". key3 : null }
=> INSERT INTO tabler (`key1`,`key2`) VALUES ('value1', 'value2')

같은 문제가 있었습니다.솔루션은 매우 심플합니다.NULL 대신 NULL을 사용합니다.이 경우,

var sql =UPDATE myTable SET myName=?, myAddress=? WHERE _id=? AND otherID=?;;

여기서 customName= null;

언급URL : https://stackoverflow.com/questions/54537680/how-to-insert-null-value-from-nodejs-javascript-to-mysql-using-parameterized-inp

반응형