Управление памятью NSMutableArray

Параметрированный запрос И проверка ввода - это путь. Существует множество сценариев, в которых может произойти SQL-инъекция, хотя используется mysql_real_escape_string().

Эти примеры уязвимы для SQL-инъекции:

$offset = isset($_GET['o']) ? $_GET['o'] : 0;
$offset = mysql_real_escape_string($offset);
RunQuery("SELECT userid, username FROM sql_injection_test LIMIT $offset, 10");

или

$order = isset($_GET['o']) ? $_GET['o'] : 'userid';
$order = mysql_real_escape_string($order);
RunQuery("SELECT userid, username FROM sql_injection_test ORDER BY `$order`");

В обоих случаях вы не можете использовать ' для защиты инкапсуляции.

Источник : Непредвиденная инъекция SQL (при эвакуации Недостаточно)

24
задан PGSystemTester 10 June 2018 в 18:04
поделиться

4 ответа

Когда Вы добавляете объект к массиву, это звонит retain на том объекте. Если Вы не выпустите свой указатель на тот объект, это будет утечка. При выпуске массива он будет звонить release на всех объектах, которые он содержит, так как он звонил retain ранее.

Что касается автовыпуска по сравнению с выпуском, единственный способ знать наверняка (кроме возможного чтения документации) под названием метод. Я полагаю, что правило в целом состоит в том, что, если Вы не выделили объект, тогда Вы не ответственны за выпуск его.

Относительно методов создания объекта, всех удобных методов (array:, arrayWithObjects:, arrayWithArray:, и т.д.) возврат автовыпустил объекты. Однако их соответствующие init методы (init:, initWithObjects:, initWithArray:, и т.д.) не делают - при вызове их Вы ответственны за вызов release на возвращенном объекте.

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

45
ответ дан Andy 28 November 2019 в 22:59
поделиться

Легче думать об управлении памятью Objective C как владение , а не с точки зрения сохранять-выпуска. Когда Вы добавляете объекты к массиву, массив является теперь совладельцем объекта и ответственен за то, что правильно управлял памятью. Когда владелец (независимо от того, что объект содержит код, который Вы отправили) вызовы release на объектах, это бросает владение, и теперь массив является единственным владельцем.

Apple имеет хорошую краткую информацию о том, как владение работает в Какао (включая то, как Вы знаете, когда Вы ответственны за вызов release на объекте): Руководство по программированию управления памятью Для Какао . Это - обязательное для чтения, если Вы хотите использовать Какао.

12
ответ дан Chuck 28 November 2019 в 22:59
поделиться

Основная вещь помнить является этим: необходимо сбалансировать каждый вызов к "init", "сохранить" или "скопировать" с соответствующим вызовом, чтобы "выпустить" или "автовыпустить". Это - действительно все, что необходимо знать.

В Вашем примере, a1 имел вызов к "init", таким образом, у Вас должен быть "выпуск" где-нибудь на нем. Так же с "obj". Вы не назвали "init", "сохранили" или "скопировали" на чем-либо еще, таким образом, Вы не должны называть "выпуск" или "автовыпуск" ни на чем больше.

0
ответ дан Jason Harris 28 November 2019 в 22:59
поделиться

Я не знаю, прав я или нет

NSMutableArray *a1 = [[NSMutableArray alloc] init]; // will be autorelease
NSMutableArray *a1 = [NSMutableArray alloc]; // will not autorelease

после того, как вы [a1 removeAllObjects];

-1
ответ дан 28 November 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: