Mariadb가 내부 주석 코드를 실행합니다.
Arch Linux의 my mariadb 설치(Ver 15.1 Distribute 10.5.8-MariaDB, readline 5.1을 사용하는 Linux(x86_64)의 경우)는 코드 내부 주석을 읽고 있습니다.
데이터베이스의 필드를 업데이트하기 위해 다음 코드를 가진 Python으로 작성된 개인 메모 앱이 있습니다.
import time
from mysql.connector import connect, Error
import click
def update():
coluna = input(click.style(' Column? » ', fg='magenta', bold=True))
ident = input(click.style(' ID? » ', fg='magenta', bold=True))
print(click.style(' Write your update', fg='magenta', bold=True))
time.sleep(0.3)
update = click.edit()
vari = [coluna, update, ident]
try:
conn = connect(
host="localhost",
user="mic",
password="xxxx",
database="notes")
cur = conn.cursor()
query = """ UPDATE notes SET %s = %s WHERE id = %s) """
cur.execute(query, vari)
conn.commit()
except Error as e:
print("Error while connecting to db", e)
finally:
if(conn):
conn.close()
if __name__ == '__main__':
update()
예를 들어, 아래 노트로 노트 내용을 업데이트하려고 하면(업로드하려고 했던 실제 노트입니다):
/* Example: */
/* ------------------------------------------------------------ */
/* CREATE VIRTUAL TABLE BookSearch USING fts5(ID, Title, Desc); */
/* INSERT INTO BookSearch SELECT ID, Title, Desc FROM Book; */
/* ------------------------------------------------------------ */
/* Searches are done like this: */
/* ------------------------------------------------------------ */
/* SELECT Title FROM BookSearch WHERE BookSearch MATCH 'cat' */
/* ------------------------------------------------------------ */
다음 오류 메시지가 표시됩니다.
Error while connecting to db 1064 (42000): 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 'cat' */
/* ------------------------------------------------------------ */...' at line 1
보시다시피 코드는 모두 주석 처리되었습니다.
하지만 제가 이상하게 생각하는 것은, 제가 이 내용을 제 노트 추가 코드에 넣으면 문제없이 통과된다는 사실입니다.사실 나는 댓글 없이 넣을 수 있고 오류 메시지도 없습니다.
다음은 노트를 추가하는 코드입니다.
from mysql.connector import connect, Error
import time
import click
import fire
def add():
titulo = input(click.style(' Title? » ', fg='magenta', bold=True))
kwd1 = input(click.style(' Choose a keyword » ', fg='magenta', bold=True))
kwd2 = input(click.style(' Choose another ... » ', fg='magenta', bold=True))
kwd3 = input(click.style(' And another... » ', fg='magenta', bold=True))
print(click.style(' Write the note.', fg='magenta', bold=True))
time.sleep(0.2)
nota = click.edit().rstrip()
answers = [titulo, kwd1, kwd2, kwd3, nota]
# Na apresentação da db, havia uma linha vazia entre os campos note e time. rstrip elimina essa linha.
try:
conn = connect(
host="localhost",
user="mic",
password="xxxx",
database="notes")
cur = conn.cursor()
query = """ INSERT INTO notes (title, k1, k2, k3, note) VALUES (%s, %s, %s, %s, %s) """
cur.execute(query, answers)
conn.commit()
except Error as e:
print("Error while connecting to db", e)
finally:
if(conn):
conn.close()
if __name__ == '__main__':
fire.Fire(add)
저는 한동안 그 문제를 검색했지만, 이것은 일반적인 문제가 아닌 것 같습니다.그것에 대한 정보가 너무 적기 때문입니다.이 앱은 DB가 SQLite3인 원본 버전이 있었고, 저는 이런 문제가 전혀 없었습니다.데이터베이스에 대한 대부분의 노트가 SQLite의 코드 구문을 참조한다는 점을 고려하면 재미있습니다.
제가 원하는 것은 무엇이 이것을 유발하는지에 대한 통찰력이었습니다. 왜냐하면 저는 전혀 모르기 때문입니다.
모든 도움에 감사드립니다.
편집: @Luuk은 이러한 유형의 이벤트 로그를 요청했습니다. 예를 들어 보겠습니다.
그 전에 제가 논평에 대답하는 것이 잘못되었다는 것을 경고해야 합니다.클립 앱을 사용하면 문제가 발생하지 않습니다.파이썬 연결을 통해서만 나타납니다.
*************************** 24. row ***************************
event_time: 2021-01-24 17:02:28.643027
user_host: [mic] @ localhost [127.0.0.1]
thread_id: 7
server_id: 1
command_type: Connect
argument: mic@localhost on notes using TCP/IP
*************************** 25. row ***************************
event_time: 2021-01-24 17:02:28.643267
user_host: mic[mic] @ localhost [127.0.0.1]
thread_id: 7
server_id: 1
command_type: Query
argument: SET NAMES 'utf8mb4' COLLATE 'utf8mb4_general_ci'
*************************** 26. row ***************************
event_time: 2021-01-24 17:02:28.643436
user_host: mic[mic] @ localhost [127.0.0.1]
thread_id: 7
server_id: 1
command_type: Query
argument: SET @@session.autocommit = OFF
*************************** 27. row ***************************
event_time: 2021-01-24 17:02:28.643883
user_host: mic[mic] @ localhost [127.0.0.1]
thread_id: 7
server_id: 1
command_type: Query
argument: UPDATE notes SET 'note' = '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 \'data in the example is oriented
vertically it could be presented in one line....\' at line 1\nMariaDB [notes]>
update notes\n -> set note = \' The data in the example is oriented vertically
\n \'> it could be presented in one line. I just think that\n \'> this way
is clearer.\n \'> Notice the command after each entry.
They\'re necessary,\n -> Don\'t use the word \'time\' for the timestamp,
it\'s a\n -> reserved word. -> An example of a successful completion:
\n -> -------------------------------------------------------\n ->
CREATE TABLE bkmks( id INT PRIMARY KEY AUTO_INCREMENT,\n ->
title VARCHAR(100),\n
-> comment TEXT,\n
-> link VARCHAR(200),\n
-> k1 VARCHAR(100),\n
-> k2 VARCHAR(100),\n
-> k3 VARCHAR(100),\n
-> tempo DATETIME DEFAULT CURRENT_TIMESTAMP);' WHERE id = '57')
*************************** 28. row ***************************
event_time: 2021-01-24 17:02:28.644037
user_host: mic[mic] @ localhost [127.0.0.1]
thread_id: 7
server_id: 1
command_type: Quit
argument:
*************************** 29. row ***************************
정확하게 동일한 오류를 재현할 수는 없지만 열 이름을 에 전달하는 것이 문제인 것 같습니다.cursor.execute
가치로서그러면 열 이름이 쿼리에서 따옴표로 묶이게 되는데, 이는 사용자가 원하는 것이 아닙니다.
UPDATE notes SET 'note' = 'spam' WHERE id = 42
쿼리를 실행하기 전에 문자열 형식을 사용하여 열 이름을 설정해야 합니다.
vari = [update, ident]
...
query = f""" UPDATE notes SET `{coluna}` = %s WHERE id = %s) """
cur.execute(query, vari)
입력을 신뢰할 수 없는 경우 다음 값을 확인해야 합니다.coluna
테이블의 실제 열 이름과 일치하여 SQL 주입을 방지합니다.
언급URL : https://stackoverflow.com/questions/65862808/mariadb-runs-code-that-is-inside-comments
'programing' 카테고리의 다른 글
다중 사이트 WordPress 설치의 하위 사이트에서 wp-admin에 액세스하면 리디렉션이 너무 많이 발생하는 이유는 무엇입니까? (0) | 2023.08.17 |
---|---|
REST와 웹 서비스의 차이점 (0) | 2023.08.17 |
MemoryStream으로 Open XML 스프레드시트를 만들 때 Excel 및 "읽을 수 없는 내용" (0) | 2023.08.17 |
데이터베이스 테이블에서 오류를 확인할 수 없습니다. (0) | 2023.08.17 |
어떻게 하면 텍스트가 한 줄 이상 차지하는 것을 막을 수 있습니까? (0) | 2023.08.17 |