Почему результат отличается, когда я использую » вместо» в SQL-инъекционной атаке?

#python #sql

#питон #sql #python

Вопрос:

Я провожу курс, в котором они использовали '); delete from posts; -- , чтобы показать знаменитую атаку sql-инъекций, но когда я использовал " вместо ' , "); delete from posts; -- это не сработало.

Код python, который я использовал для общения с базой данных:

 import psycopg2

DBNAME = "forum"

def get_posts():
    conn = psycopg2.connect(database=DBNAME)
    c = conn.cursor()
    c.execute("select content,time from posts order by time desc")
    return c.fetchall()
    conn.close()
    
    
def add_post(content):
    conn = psycopg2.connect(database=DBNAME);
    c = conn.cursor();
    c.execute("insert into posts values('%s')"%content);
    conn.commit();
    conn.close();
  

Также, когда я пропустил ; , т.е. ') delete from posts; -- Я получил сообщение об ошибке.
Может, кто-нибудь, пожалуйста, объяснит мне обе эти проблемы?

Комментарии:

1. ' закрывается ' , " закрывается "

2. Какую БД вы используете? Если вы опускаете ; результирующую строку, это недопустимый SQL. Рассмотрите возможность распечатки выполняемого SQL и проверки его. Пожалуйста, проверьте, что вы опубликовали, выполняется ли фактический код: в execute("insert into posts values('%s')"%content); %content не выглядит правильно.

Ответ №1:

По крайней мере, в известных мне вариантах SQL одинарные и двойные кавычки имеют два совершенно разных синтаксических значения:

  • Одинарные кавычки ( ' ) используются для определения строкового литерала
  • Двойные кавычки ( " ) используются для записи идентификатора

Поэтому неудивительно, что попытка ввести одно вместо другого будет иметь другой эффект.

Пример

 SELECT "col"  -- Identifier
FROM "tab"    -- Identifier
WHERE "col2"  /* Identifier */ = 'str' /* String literal */
  

Я думаю, что в MySQL апостроф (‘) можно использовать для идентификаторов, но это не меняет того факта, что каждая цитата имеет свое значение и использование.