Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Как отключить API IP при работе с заказом


Recommended Posts

Здравствуйте, в opencart 2 существует чертовски неприятная плюшка - проверка API IP при редактировании заказа из амдинки. Если твоего IP нет в списке разрешённых редактировать заказ запрещено. Нужно заходить в Система > Пользователи > IP добавлять свой IP в список разрешенных.

 

Всё классно, но что делать если IP динамичный? Каждый раз добавлять? Зачем? Это же глупо и не удобно!

 

Решение найти мне не удалось, поэтому написал своё.

 

Opencart Version 2.1.0.2 (rs.1).

 

Скрипт узнаёт IP пользователя когда тот заходит в заказы и добавляет его в список ращрешённых, причем не добавляет ещё один IP, а заменяет последний (чтобы не создавать гигантскую таблицу).

 

1. В папке /admin/model/sale создаем файл ip.php с содержимым

<?php
class ModelSaleIp extends Model {
public function getIp($data) {
$query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "api_ip` ORDER BY `api_ip_id` DESC LIMIT 1");
return $query->rows;
}

public function InsertIp($new_ip, $api_ip_id) {
$query = $this->db->query("UPDATE  `" . DB_PREFIX . "api_ip` SET  `ip` =  '".$new_ip."' WHERE  `" . DB_PREFIX . "api_ip`.`api_ip_id` = '".$api_ip_id."'");
}

} 
?>

2. Редактируем /admin/controller/sale/order.php

После 316-й строки $data['filter_date_modified'] = $filter_date_modified;

 

$this->load->model('sale/ip');
$results = $this->model_sale_ip->getIp($data);

foreach ($results as $result) {
$data['ip'][] = array(
'last_ip_in_table' => $result['ip'],
'last_ip_in_table_id' => $result['api_ip_id']
);

$data['last_ip_in_table'] = $result['ip'];
$data['last_ip_in_table_id'] = $result['api_ip_id'];
$api_ip_id = $result['api_ip_id'];
}

$data['ip'] = $this->request->server['REMOTE_ADDR'];
$new_ip  = $this->request->server['REMOTE_ADDR'];

if ($data['last_ip_in_table'] != $data['ip']) {
$this->model_sale_ip->InsertIp($new_ip, $api_ip_id);
}

3. Ну и для красоты /admin/view/template/sale/order_list.tpl

 

После 17-й строки <div class="container-fluid">

<div class="row">
<div class="col-sm-12 ">
<div class="container-fluid alert-fake alert-success">
<?php if($ip != $last_ip_in_table) { ?>
Ваш текущий IP -  <?php echo $ip; ?> последни ИП - <?php echo $last_ip_in_table; ?><br />
Обновите страницу, чтобы перезаписать IP


<?php } else { ?> 
Все в порядке, ваш IP занесён в список разрешённых. Можете редактировать заказы
<? } ?>
    </div>
</div>
 </div>

 

4. Опять таки для красоты в css /admin/view/stylesheet/bootstrap.css

.alert-fake {    
    padding: 10px;
    margin-bottom: 17px;
    border: 1px solid transparent;
    border-radius: 3px;
}

P.S. Я совсем недавно изучаю PHP и MVC паттерн. Поэтому уверен что код можно улучшить Меня очень смущает контроллер, уверен, что его можно упростить. Если кто помодет - буду очень благодарен и обещаю оформить всё в виде модуля и выложить в свободный доступ на этом сайте.

  • +1 1
Надіслати
Поділитися на інших сайтах


  • 4 weeks later...

Хорошая вещь, но

подскажите как быть с этим ?

В редактор переходит не переходит появляется ошибка доступа, IP в базе API не прописывается

 

978ed3e0f306.png

Змінено користувачем kors06
Надіслати
Поділитися на інших сайтах


  • 2 weeks later...

Хорошая вещь, но

подскажите как быть с этим ?

В редактор переходит не переходит появляется ошибка доступа, IP в базе API не прописывается

 

978ed3e0f306.png

Поздновато заметил. Как раз новый сайт делаю. Поставил на чистую версию Version 2.1.0.1 (rs.2) - работает как нужно, когда не было ни одного разрешённого IP - ругалось, но немного другим образом.

 

Какая у Вас версия opencart? Протестирую на ней

Змінено користувачем Muzicant09
Надіслати
Поділитися на інших сайтах


Тогда понятно, там какие-то модификации есть, возможно другие классы используются, также таблица в БД может быть другая. К сожалению для этой версии скрипт нужно допиливать

Надіслати
Поділитися на інших сайтах


  • 8 months later...

.define('VERSION', '2.1.0.1.1');

работает. Добавляем айпи. Обновляем страницу 

и после этого можем менять статус.

колхоз, но другого способа не найти. 

Змінено користувачем igorfelix
Надіслати
Поділитися на інших сайтах


а если сюда еще добавить компот из 

Для снятии защиты с добавления истории.

в файле \catalog\controller\api\login.php

перед
if (!$json) {    
перед ним ставим
$json = false;

далее в файле \catalog\controller\api\order.php в функции public function history() {

перед
if (!isset($this->session->data['api_id'])) {
ставим
$this->session->data['api_id'] = 1;

 

Надіслати
Поділитися на інших сайтах


  • 7 months later...
  • 9 months later...
В 27.01.2018 в 01:02, pasho12 сказал:

Простите, а не проще в списке IP прописать следующее:  0.0.0.0-255.255.255.255 и не париться????

Прописывать в Система-Пользователи-API-admin ? Если да, то не работает. Даже 45.212.*.* не работает. Есть еще варианты, как прописать сразу диапазон ip, которым разрешен доступ в редактирование заказов?

 

ps

IP-адресов в формат CIDR тоже не работает. есть идеи?

Змінено користувачем Piercer
Надіслати
Поділитися на інших сайтах


  • 3 months later...

Там гораздо проще всё решается

В файле catalog\controller\api\login.php закомментировать:

/*
$ip_data = array();

$results = $this->model_account_api->getApiIps($api_info['api_id']);

foreach ($results as $result) {
$ip_data[] = trim($result['ip']);
}

if (!in_array($this->request->server['REMOTE_ADDR'], $ip_data)) {
$json['error']['ip'] = sprintf($this->language->get('error_ip'), $this->request->server['REMOTE_ADDR']);
}
*/

В файле catalog\controller\startup\session.php код

$query = $this->db->query("SELECT DISTINCT * FROM `" . DB_PREFIX . "api` `a` LEFT JOIN `" . DB_PREFIX . "api_session` `as` ON (a.api_id = as.api_id) LEFT JOIN " . DB_PREFIX . "api_ip `ai` ON (as.api_id = ai.api_id) WHERE a.status = '1' AND as.token = '" . $this->db->escape($this->request->get['token']) . "' AND ai.ip = '" . $this->db->escape($this->request->server['REMOTE_ADDR']) . "'");

заменить на

$query = $this->db->query("SELECT DISTINCT * FROM `" . DB_PREFIX . "api` `a` LEFT JOIN `" . DB_PREFIX . "api_session` `as` ON (a.api_id = as.api_id) LEFT JOIN " . DB_PREFIX . "api_ip `ai` ON (as.api_id = ai.api_id) WHERE a.status = '1' AND as.token = '" . $this->db->escape($this->request->get['token']) . "'");

После этих изменений при работе с API ваш IP проверяться не будет

Змінено користувачем SZQ
  • +1 1
Надіслати
Поділитися на інших сайтах


  • 7 months later...
  • 8 months later...

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.