Безопасный ли запрос такого вида
Model::find()->where(["=", "city", $_COOCKIE['city']])->all();
вставлять данные полученные от пользователя в запрос - это плохая практика и лучше так вообще не делать. Что касается безопасности - SQL-инъекцию в запросе такого вида сделать не получиться, т.к. встроенный строитель запросов экранирует данные.
и такой save
$model->city = $_COOCKIE['city'];
$model->save();
тут все зависит от множества факторов: от того какой тип данных может принимать атрибут, какие правила валидации для него предусмотрены в модели, что Вы делаете дальше с этим атрибутом (как экранируете его на выводе). Например, если параметр может принимать строку и в модели Вы его валидируете как простую строку, но при этом нигде не экранируете его вывод - это уже дыра в безопасности