MySQLi подготовить с fetch_assoc, или mysql_real_escape_string нормально использовать? - PullRequest
0 голосов
/ 31 октября 2011

Я унаследовал кодовую базу среднего размера, которая широко использует mysql_fetch_assoc и mysql_fetch_object и не имеет никаких мер безопасности, предотвращающих внедрение SQL.Я решил, что это очень плохая вещь TM , требующая исправления.

Изначально я намеревался перейти к операторам mysqli prepare / bind_param / execute для обработки запросов к БД.Однако следующее не работает:

$stmt = $GLOBALS['db']->prepare('SELECT * FROM Users WHERE Username=?');
$stmt->bind_param('s', $username);
$stmt->execute();

// Somehow retrieve the fetched row as an object (Doesn't work!)
return $stmt->fetch_assoc();

Вопрос 1: Есть ли способ использовать fetch_assoc или fetch_object с использованием prepare / bind?Я могу выполнить рефакторинг всего кода, но это будет грязно и займет очень много времени.

Вопрос 2: Если это невозможно, это так же эффективно, как ис точки зрения безопасности использовать mysqli_query (), при условии, что все входы правильно экранированы через mysql_real_escape_string ()?Есть ли у вас другие предложения?

Ответы [ 2 ]

1 голос
/ 01 ноября 2011
  1. $row = $stmt->fetch(PDO::FETCH_ASSOC) Ссылка: http://php.net/manual/en/pdostatement.fetch.php

  2. Вы можете использовать mysqli, если хотите. Пока вы используете функции real_escape_string для ВСЕХ пользовательских данных (включая ваши собственные), которые входят в операторы SQL, это не менее безопасно, чем использование подготовленных операторов - гораздо проще пропустить сообщение и оставить дыру открытой.

0 голосов
/ 01 ноября 2011

Замена необработанного mysql на raw mysli не имеет большого смысла.
на самом деле, все эти печальные повторяющиеся подготовительные / bind / execute / fetch такие же уродливые, как mysql_query / fetch.

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

Что касается экранирования всех входных данных через mysql_real_escape_string (), то это будет эквивалент магических кавычек, которые, наконец, были признаны плохой практикой.

на самом деле mysql_real_escape_string () не делает данные безопасными.это никак не связано с безопасностью.это просто процедура форматирования, и она работает только для строк.Но есть и другие типы для вставки в запрос.Подробные объяснения см. В моем предварительном ответе Как включить переменную PHP в оператор вставки MySQL

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