Проблемы с пространством внутри параметров функции php - PullRequest
0 голосов
/ 15 февраля 2010

Извините, что не отформатировал мой код. панель инструментов пропала ...

Я хочу вставить некоторые данные в базу данных mysql. Я написал функцию в php:

function add_ID($ID, $token)  {
 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
 mysql_query($add);
 echo 'added successfully';
}  
if(isset($_GET['addDeviceID'])) {
 add_ID($_GET['ID'], $_GET['token']);
}

В поле URL моего браузера я вызываю такую ​​функцию: http://www.justanexample.com/example.php?ID=123123123&token=qwertzuiop

Это работает.

Если я добавлю пробел в один из параметров, например, так: http://www.justanexample.com/example.php?ID=123123 123 & token = qwertzuiop

Ничего не было добавлено в мою базу данных MySQL.

Было бы здорово получить помощь :) Спасибо!

Ответы [ 5 ]

2 голосов
/ 15 февраля 2010

Вы должны проверить свои данные перед отправкой в ​​базу данных. Или, если проверка невозможна, отфильтруйте и / или экранируйте значение.

проверка

Если вы ожидаете, что ID будет целым числом больше нуля:

if (!ctype_digit($ID)) {
    // invalid ID
}

Если вы ожидаете, что токен будет буквенно-цифровой строкой:

if (!ctype_alnum($token)) {
    // invalid token
}

Фильтрация

Фильтрация удаляет недопустимые части ввода, поэтому он становится действительным:

if (!ctype_digit($ID)) {
    $ID = preg_replace('/\D+/', '', $ID);
    // $ID does now only contain digits
}
if (!ctype_alnum($token)) {
    $token = preg_replace('/\D+/', '', $token);
    // $token does now only contain alphanumeric characters
}

Экранирование

Экранирование заменяет метасимволы определенного контекста, в который должна быть помещена некоторая строка. Для запросов MySQL следует использовать функцию, которая экранирует метасимволы строкового объявления context в MySQL . Для этой цели PHP имеет функцию mysql_real_escape_string :

$add = "INSERT INTO ids (ID, token) VALUES ('".mysql_real_escape_string($ID)."', '".mysql_real_escape_string($token)."')";
0 голосов
/ 15 февраля 2010

Ваш код предполагает, что запрос успешно завершен, даже не проверяя, была ли ошибка. Я предполагаю, что это будет синтаксическая ошибка из-за пробелов. Если ваше поле идентификатора является целочисленным типом, то выполнение ID=123 123 будет синтаксической ошибкой. Включая все советы по внедрению SQL и очистке данных в другие ответы, вы должны переписать свою функцию add_ID следующим образом:

function add_ID($ID, $token) {
  $query = 'blah blah blah';
  mysql_query($query);
  if (mysql_error()) {
       echo 'ruhroh, someone set us up the bomb: ', mysql_error();
  } else {
       echo 'woohoo, it worked!';
  }
}

По крайней мере, это скажет вам, действительно ли запрос ДЕЙСТВИТЕЛЬНО завершился успешно, и что взорвалось, если это не так. Никогда не предполагайте, что какой-либо запрос к базе данных будет успешным. Существует слишком много способов его взорвать (сервер остановлен, тупик транзакции, пул соединений исчерпан, не хватает места на диске и т. Д.), Чтобы НЕ иметь даже упрощенную обработку ошибок, как указано выше.

0 голосов
/ 15 февраля 2010

Ваша функция уязвима для внедрения SQL. Вы должны проверить все полученные пользователем параметры перед их использованием в запросе SQL и пропустить все строки через mysql_real_escape_string, потому что тогда я мог бы просто передать что-то вроде example.php?token='; DROP DATABASE; и по-королевски испортить ваше приложение.

В вашем случае вам следует проверить, что полученные параметры имеют ту форму, которую вы ожидаете, сначала вернуть ошибку пользователю, если они этого не делают, и только затем передать их в запрос SQL.

function add_ID($ID, $token)  {
  $id = mysql_real_escape_string($id);
  $token = mysql_real_escape_string($token);

  $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
  mysql_query($add);
  echo 'added successfully';
}  

if(isset($_GET['addDeviceID'])) {
  $id    = isset($_GET['id']) ? $_GET['id'] : 0; // in case no ID has been passed in
  $token = isset($_GET['token']) ? $_GET['token'] : '';

  if (!is_numeric($id) {
    die('ID is not a number');
  } 

  // validate token here as well

  add_ID($id, $token);
}

Вам также следует изучить параметризованные запросы, которые в целом являются гораздо лучшим способом выполнения запросов SQL с параметрами, чем просто с помощью конкатенации строк. Для этого рассмотрим использование расширения mysqli вместо mysql или на более высоком уровне PDO.

0 голосов
/ 15 февраля 2010

Вы можете использовать str_replace для удаления пробелов. Но это не очень хорошая практика. Как можно так изменить URL? В нормальных случаях это нереально. Наоборот, вы должны проверить все входные значения от пользователя (идентификатор должен быть целым числом, токен не должен содержать символ «» и другие проверки). Читайте о sql-инъекциях.

0 голосов
/ 15 февраля 2010

Удалить из них пробел, используя функцию str_replace, например:

 $ID = str_replace(' ', '', $ID);
 $token= str_replace(' ', '', $token);

 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";

Кроме того, я подозреваю, что ваш $ ID является целочисленным полем в вашей таблице, поэтому вы можете выполнить свой запрос без указания кавычек, например:

 $add = "INSERT INTO ids (ID, token) VALUES ($ID, '$token')";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...