#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 апостроф (‘) можно использовать для идентификаторов, но это не меняет того факта, что каждая цитата имеет свое значение и использование.