mysql_real_escape_string () Разное поведение с одинарной кавычкой - PullRequest
0 голосов
/ 08 декабря 2011

Я пытаюсь предотвратить инъекции sql.
Для этого я использую mysql_real_escape_string ().

На моем локальном сервере (phpversion 5.3.2):

$string="a'b"
$newstring=mysql_real_escape_string($string);  

query("INSERT INTO .. ..field1='$newstring'");

Вставка $ newstring в таблицу помещает «a'b».
На другом сервере (phpversion 5.2.10) он помещает «a \ 'b» в таблицу.

Как мне разрешить вставлять "a'b" и избегать инъекций?
Я не хочу вносить изменения в INI-файл и magic_quotes, так как это может повлиять на другие запросы.
Я не могу использовать add_slashes, так как мне придется искать все способы получения значения для удаления слешей.

Ответы [ 5 ]

0 голосов
/ 08 декабря 2011

Я пытаюсь предотвратить инъекции sql.
Для этой цели я использую mysql_real_escape_string ().

Посмотрите на этот вопрос, он может быть вам интересен: Очевидно, в моем коде PHP есть ошибка SQL-инъекции

Короче говоря, "используйте mysql_real_escape_string"недостаточно, чтобы" предотвратить инъекции sql ".Это полезно только для строк, но для других частей вам нужен другой подход.Обратитесь к моему более раннему ответу по этому вопросу для получения полной информации: https://stackoverflow.com/a/2995163/285587

0 голосов
/ 08 декабря 2011

Если magic_quotes_gpc включено, сначала примените stripslashes() к данным. Использование этой функции для данных, которые уже были экранированы, дважды удалит данные.

if(get_magic_quotes_gpc()) {
    $newstring = stripslashes($newstring);
}
0 голосов
/ 08 декабря 2011

Это, вероятно, не имеет ничего общего с mysql_real_escape_string(), но с настройкой magic_quotes.

Предпочтительным было бы отключить магические кавычки, , как рекомендует даже само руководство по PHP.

Если это действительно невозможно, здесь пример того, как «отключить» магические кавычки из кода PHP.

0 голосов
/ 08 декабря 2011

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

проверьте комментарии здесь

http://php.net/manual/en/security.magicquotes.disabling.php

Если вы не хотите использовать это глобально, используйте условие if и полоса косится только этой переменной

0 голосов
/ 08 декабря 2011

Наиболее вероятная проблема заключается в том, что у вас включено magic_quotes на одном сервере, но не на другом.Отключите magic_quotes или измените код:

$example = stripslashes($_POST['example']);      //undoes the magic_quotes
$escaped_string = mysql_real_escape_string($example); //escapes it properly.

Менее вероятный сценарий может возникнуть, если у вас есть 2 подключения к 2 разным серверам баз данных.у вас открыт.
Если у вас есть несколько серверов и, следовательно, несколько подключений, вам нужно запускать функцию выхода один раз для каждого подключения.

Пример

$example = "a'b";
$connectionA = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$connectionB = mysql_connect('remotehost', 'mysql_user', 'mysql_password');
$escapedstringA = mysql_real_escape_string($example, $connectionA);
$escapedstringB = mysql_real_escape_string($example, $connectionB);

Если вы пропустите параметр соединения в вызове mysql_real_escape_string, обе экранированные строки будут экранированы с использованием кодировки по умолчанию для удаленного хоста, что неверно.

Этот код может работать некорректно:

$example = "a'b";
$connectionA = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$connectionB = mysql_connect('remotehost', 'mysql_user', 'mysql_password');
$escapedstringA = mysql_real_escape_string($example);  //uses remotehost's encoding
$escapedstringB = mysql_real_escape_string($example);   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...