используйте mysql_real_escape_string (), но разрешите имена с апострофами - PullRequest
2 голосов
/ 21 января 2010

Я использую mysql_real_escape_string () для проверки всех пользовательских вводов, прежде чем вставлять их в базу данных sql. Одним из полей является name, и у нас были проблемы с пользователями с такими именами, как O'Reilly. Есть ли способ использовать mysql_real_escape_string () для блокировки инъекций, но разрешить эти имена в БД?

Ответы [ 3 ]

6 голосов
/ 21 января 2010

Скорее всего, проблема заключается в том, что апострофы цитируются дважды: сначала злом и осуждаются в 5,3 магических цитатах , а затем mysql_real_escape_string().

Вы можете либо отключить магические кавычки , либо запустить stripslashes() на своих входных значениях до подачи их в mysql_real_escape_string()

Краткое объяснение проблемы:

  • пользователь вводит O'Reilly
  • магические кавычки автоматически превращают его в O\'Reilly
  • скрипт передает строку через mysql_real_escape_string (), которая экранирует и обратную косую черту и апостроф (снова), приводя к O\\\'Reilly
  • запрос выполнен, кавычка обработана и база данных понимает, что вам нужен обратный слеш и апостроф, так как они куда и сбежали, и записи O\'Reilly
0 голосов
/ 21 января 2010

+ 1 для использования PDO. Я использую PDO в пользу класса MySQL, выступающего в качестве уровня абстракции базы данных в течение нескольких месяцев, и это очень просто.

Традиционно разработчики использовали бы функцию stripslashes() для данных перед применением такой функции, как mysql_real_escape_string(). Хорошая идея - удалить косые черты из входных данных, но затем вы можете использовать метод PDO для экранирования данных (PDO::quote($data)) или связать параметр.

Ваш блок запроса будет выглядеть примерно так:

$pdo = new PDO(DSN, DB_USER, DB_PASS);
$sql = "INSERT INTO table (field1, field2) VALUES (:value1, :value2)";
$smt = $pdo->prepare($sql);
$smt->bindParam(':value1', $value1, PDO::PARAM_STR);
$smt->bindParam(':value2', $value2, PDO::PARAM_STR);
$smt->execute();
$rows = $smt->rowCount(); // returns number of rows affected

Надеюсь, это поможет. Посмотрите http://php.net/manual/en/book.pdo.php для получения дополнительной информации о PDO в PHP.

0 голосов
/ 21 января 2010

Как уже упоминалось: mysql_real_escape_string не предназначен для проверки ввода. Если вы хотите проверить входные данные, используйте свои собственные функции или функции фильтра из php.

Если у вас автоматически добавлено слишком много слешей с помощью php, отключите магические кавычки.

Чтобы предотвратить внедрение SQL, используйте параметризованные запросы с PDO или mysqli .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...