bestsource

mysql_real_escape_string()은 어떻게 작동합니까?

bestsource 2023. 9. 21. 20:40
반응형

mysql_real_escape_string()은 어떻게 작동합니까?

MySQL에 쿼리로 문자열(C에 있는)을 보내야 해서 다음과 같은 문자를 피하기 위해 mysql_real_escape_string()을 사용했습니다.\0아니면\n:

#include <mysql/mysql.h>
int loginQuery(char *Nickname, char *Password)
{

    char bufferutility[READBUFSIZE]="SELECT * FROM user WHERE Nickname='";
    char bufferutility2[READBUFSIZE*2+1];
 
    strcat(bufferutility,Nickname);
    strcat(bufferutility,"' AND Password='");
    strcat(bufferutility,Password);
    strcat(bufferutility,"';");
  
    if(mysql_real_escape_string(conn,bufferutility2,bufferutility,strlen(bufferutility))==(unsigned long)-1){
        printf("\nEscaping error\n");
    }
 
    //code for mysql_real_query() here  
}

하지만 이런 오류가 발생했습니다.You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '\'Hello\n\' AND Password=\'World\n\'' at line 1

제가 무엇을 잘못했지요?

mysql_real_escape_string()현재 연결에 사용되는 문자 집합에 따라 특정 문자를 열 값으로 탈출하는 API 기능을 사용합니다.

따라서 전체 SQL 문을 탈출하는 대신 Nicket과 Password 값을 탈출한 후 SQL 문 문자열에 추가해야 합니다.

예(테스트되지 않았으며 오류 검사 없이):

char *escNickname, *escPassword;

escNickname= alloca(strlen(Nickname) * 2 + 1);
escPassword= alloca(strlen(Password) * 2 + 1);

mysql_real_escape_string(conn, escNickname, Nickname, strlen(Nickname));
mysql_real_escape_string(conn, escPassword, Password, strlen(Password));

sprintf(bufferUtility, "SELECT * FROM user WHERE Nickname='%s' AND Password='%s'. escNickname, escPassword);

언급URL : https://stackoverflow.com/questions/74852541/how-does-mysql-real-escape-string-work

반응형