Mysql Защита от SQL-инъекций в PHP и MySQL

флоппик

promotor fidei
Команда форума
Партнер клуба
Когда кажется, крестится надо. В программировании нет места догадкам: не уверен - пойди и узнай точно.
 

D_Pavel

Новичок
Что ли никто не знает ответ на мой вопрос? Или в ветку по MySQL только флудить ходят?
 

D_Pavel

Новичок
Гуглить я умею, только там написана бесполезная хрень про GBK.
Пока я вижу только чужие глупые вопросы и ответы, и ничего по делу. Видимо, пока эта ветка существует, никому она пользы не принесла.
 

Вурдалак

Продвинутый новичок
D_Pavel, всем настолько лениво отвечать на абсолютно некомпетентный вопрос, что проще просто показать средний палец. Объяснять что-то таким как ты — это не уважать себя.
 

hell0w0rd

Продвинутый новичок
А что вы хотите? Обычно говорят, не понимаешь - читай доки. А посмотрите что в доках написано:
Возвращает строку, в которой перед каждым спецсимволом добавлен обратный слэш, например, для последующего использования этой строки в запросе к базе данных и т.п. Экранируются одиночная кавычка ('), двойная кавычка ("), обратный слэш (\) и NUL (байт NULL).

Функция addslashes() часто применяется при записи в базу данных. Предположим, если нужно внести в базу данных имяO'reilly, то эту строку необходимо проэкранировать. Настоятельно рекомендуется использовать функцию экранирования, специфичную для используемой вами базы данных (например, mysqli_real_escape_string() для MySQL или pg_escape_string()для PostgreSQL), но если используемая вами база данных не имеет собственной функции экранирования и для экранирования специальных символов используется символ \, то для этой цели можно воспользоваться данной функцией.
И я не особо уверен что до последнего абзаца кто-то доходит
 

hell0w0rd

Продвинутый новичок
Absinthe, эм, а что я должен объяснять? Загляни в доки и увидишь все
Но если прям хочется указать что я сам ничего не понимаю - данная функция работает в зависимости от кодировки соединения

Просто надо понимать, что подготовка строки - это костыльный метод. Гораздо правильнее подготовить запрос, указав драйверу, что тут вот будет строка, а не sql-выражение и для этого придумали подготовленные выражения
 

Absinthe

жожо
hell0w0rd, насколько я знаю, разница между вышеуказанными функциями есть только на экзотических неиспользуемых кодировках.
 

hell0w0rd

Продвинутый новичок
Absinthe, мой первый пост на эту тему был к тому, что человек в доках видит "используйте для подготовки строк перед вставкой в базу" - и собственно отсюда возможно считает что так делать правильно
 

D_Pavel

Новичок
Из всего вышесказанного я делаю вывод что я был прав, а кто умничал, тот разбирается в вопросе хуже меня.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
"Интересный факт: Человек, который не понимает того, что вы ему говорите, считает тупым не себя, а вас." (c) Интернеты
 

Breeze

goshogun
Команда форума
Партнер клуба
Из всего вышесказанного я делаю вывод что я был прав, а кто умничал, тот разбирается в вопросе хуже меня.
твое заявление говорит ровно об одном -- в вопросе ты разбираешься на уровне детсада.

Absinthe, ты не в состоянии мануал почитать в чем разница или hell0w0rd потроллить охота? :)
 

D_Pavel

Новичок
Хотелось бы услышать мнение понимающего человека, а не пустобрехов.
 

vasinsky

Новичок
повтори вопрос если не сложно - лень в 5 страницах его искать
 

D_Pavel

Новичок
Вопрос такой: На своем форуме я использую addslashes для всех переменных запроса. Есть ли угроза инъекций в этом случае? Если есть, то как это возможно? Я считаю что никак не возможно.

Код:
Код:
if (isset($_POST['login'])){

$sqllogin = trim(addslashes($_POST['login']));

$sqlpassword = trim(addslashes($_POST['password']));

$sqlemail = trim(addslashes($_POST['email']));

$res = mysqli_query($link, "SELECT * FROM users WHERE (email='$sqllogin' OR nik='$sqllogin') and password='$sqlpassword'") or die(mysql_error());
 

fixxxer

К.О.
Партнер клуба
Во-первых, "использую addslashes" ничего не гарантирует (так же как ничего не гарантирует и "использую mysql_real_escape_string").

Очевидный пример:

PHP:
$id = addslashes($id);
mysql_query("SELECT * FROM messages WHERE id = $id");
Потому следует говорить об использовании _в контексте_ форматирования строковых параметров.

Во-вторых, addslashes ничего не знает об используемой базе, кодировке, настройках базы, параметрах соединения и т.п. Он просто подписывает \ перед жестко заданным в коде набором символов. С рядом допущений это сработает, но куда лучше использовать не какую-то левую нашлелку, а родные функции базы, которые точно знают, как надо форматировать строку в контексте данной базы и данных настроек соединения.
 

D_Pavel

Новичок
Кодировка очевидно не китайская. Либо UTF-8, либо windows-1251 так как мы русские, в моем случае первый вариант.
 
Сверху