Форум русской поддержки Joomla!® CMS
05.12.2016, 08:32:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2  Все   Вниз
  Добавить закладку  |  Печать  
Автор

AJAX только со страниц сайта

 (Прочитано 220 раз)
0 Пользователей и 1 Гость смотрят эту тему.
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« : 02.11.2016, 13:39:10 »

Подскажите как правильно ограничить работу AJAX-запроса.

Мне надо чтобы запрос выполнялся только с конкретной страницы (страница с формой). Хочется исключить простую передачу параметров через адрес и получения информации.

Думаю должно решаться с помощью TOKEN, подскажите ход мысли.
Записан
Septdir
Живу я здесь
******

Репутация: +32/-3
Offline Offline

Пол: Мужской
Сообщений: 819


Skype: septdir


« Ответ #1 : 02.11.2016, 13:43:29 »

Ну по токену вот документация https://docs.joomla.org/How_to_add_CSRF_anti-spoofing_to_forms а вообще проверок может быть несколько. Продумывайте логику. Можете даже в данном топике, найдутся энтузиасты которые будут тыкать вас в ошибки
Записан
robert
Профи
********

Репутация: +343/-11
Offline Offline

Пол: Мужской
Сообщений: 3576


« Ответ #2 : 02.11.2016, 14:27:45 »

Не совсем понял вопрос. У вас что, AJAX выполняется на каждой странице?
Задайте определенные события, при которых AJAX срабатывает, а также его тип запроса (POST или GET), которые можно фильтровать на серверной стороне.
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #3 : 02.11.2016, 21:24:23 »

Вопрос в том, чтобы запрос не был выполнен из другого приложения/стороннего сайта.

Решил пока при помощи стандартного TOKEN. Правда пришлось в JS скрипте вылавливать этот ключ со странице и отправлять внутри запроса AJAX.
Осталась проблема... в принципе, если человек зайдет на страницу и получит TOKEN, то он может зарядить в приложение этот ключ и прошерстить базу. Как этого избежать?
CAPCHA?
Записан
robert
Профи
********

Репутация: +343/-11
Offline Offline

Пол: Мужской
Сообщений: 3576


« Ответ #4 : 03.11.2016, 09:58:29 »

CAPTCHA — это аббревиатура от английских слов "Completely Automated Public Turing test to tell Computers and Humans Apart" — Полностью Автоматический тест Тьюринга для Различения Компьютеров и Людей. Он как раз нужен для того, чтобы только "человеки" могли отправлять запросы к серверу Grin. Приведите ваш код, мне уже интересно, что вы там делаете.
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #5 : 03.11.2016, 12:32:57 »

Делаю следующее.
Запрашиваю данные из сторонней базы FireBird по средствам php-interbase.

Создал вид с формой.

Форма (шаг 1)
input - номер счета
button - проверка счета (существование и состояние)

кнопка из default.php
Код
...
$ajaxUrlCheck = JRoute::_('//'.$_SERVER['SERVER_NAME'].'/index.php?option=com_paymentsbrf&task=getAccount&format=raw');
$ajaxUrlPay = JRoute::_('//'.$_SERVER['SERVER_NAME'].'/index.php?option=com_paymentsbrf&task=goToBank&format=raw');
...
<input
type="button"
value="Далее"
onClick="$( document ).ready( confirmPersonalAccount('<?php echo $this->base->id; ?>', '<?php echo $ajaxUrlCheck; ?>', '<?php echo $ajaxUrlPay; ?>') );"
class="uk-button uk-button-primary uk-button-large"
id="com_paymentsbrf_form_button_next"
/>
 
 

На кнопке висит JS функция
Код
function confirmPersonalAccount(base_id, ajaxUrl, ajaxUrlPay) {
var account_no = $( "#jform_account_no" ).val();
var token = $( "#com_paymentsbrf_form" ).find($( "input:hidden" )).attr('name');
var input = 'base_id='+base_id;
input+= '&account_no='+account_no;
input+= '&'+token+'=1';
$.ajax({
           type:'GET',
           cache:false,
           dataType:'JSON',
           url: ajaxUrl,
           data: input,
           success:function (data) {
if (data.error){
alert("Error");
} else {
... Make somethings with var data
}
 
           }
       });
}
 


Далее в дефолтном контроллере создана функция
Код
	public function getAccount()
{
$this->input->set('view', 'getAccount');
parent::display();
}
 
Которая вызывает метод display вида

Вот сам вид который формирует данные для возврата в AJAX запрос
Код
function display($tpl = null)
   {
JSession::checkToken('get') or die( 'Invalid Token' );
 
$input = JFactory::getApplication()->input;
$base_id = $input->getInt( 'base_id', 0 );
$account_no = $input->getInt( 'account_no', 0 );
$model = JModelLegacy::getInstance( 'pay' , 'PaymentsbrfModel');
 
$item = $model->getBase($base_id);
switch ($item->type){
// Work with other DB
case 'type1': $array = $this->getFromDBType1($item, $account_no); break;
case 'type2': $array = $this->getFromDBType2($item, $account_no); break;
}
 
 
if (!$array) {
// If error
$array['error'] = 1;
}
 
...
 
echo json_encode($array);
exit;
   }
 

Собственно все что сейчас есть. Это работает. Но нужно привязать еще капчу либо привязать капчу и выкинуть TOKEN
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #6 : 03.11.2016, 12:52:31 »

Решил пока при помощи стандартного TOKEN. Правда пришлось в JS скрипте вылавливать этот ключ со странице и отправлять внутри запроса AJAX.
Осталась проблема... в принципе, если человек зайдет на страницу и получит TOKEN, то он может зарядить в приложение этот ключ и прошерстить базу. Как этого избежать?
токен это ключ сессии, даже если человек зайдет на сайт, получит токен, вставит в свое приложение (и вы реально думаете что спам бота только под ваш сайт будут писать), то для его приложения ключ уже будет не действителен, ибо сессии не будет в приложение..

CAPCHA?
Сто лет как неэффективна...


Собственно все что сейчас есть. Это работает. Но нужно привязать еще капчу либо привязать капчу и выкинуть TOKEN
Вы не понимаете для чего токен и для чего CAPTCHA, избавляясь от токена вы откроете доступ к CRSF уязвимости! это значит что вашу форму смогут отправить с другого вообще сайта, на ваш сайт! Вот именно без токена  и смогут зарядить в бота отправку чего угодно через вашу форму!
Хотя у вас же оплата вроде? Вы хоть на одной форме оплаты чего либо видели капчу?! Или вы думаете что бот будет в форму слать бабло?) так зачем тогда защита ) пусть заспамят баблом  Grin
« Последнее редактирование: 03.11.2016, 13:06:41 от Aleks.Denezh » Записан
Septdir
Живу я здесь
******

Репутация: +32/-3
Offline Offline

Пол: Мужской
Сообщений: 819


Skype: septdir


« Ответ #7 : 03.11.2016, 13:01:28 »

У меня видать тотальный тупняк, но я вообще не вижу не логики, ни картины в целом и что за внешняя база?
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #8 : 03.11.2016, 13:03:07 »

А ваш код это вообще издевательство над Joomla, и принципами MVC.. если хотите я вам напишу как привильно делать AJAX в условиях компонента Joomla
Записан
Septdir
Живу я здесь
******

Репутация: +32/-3
Offline Offline

Пол: Мужской
Сообщений: 819


Skype: septdir


« Ответ #9 : 03.11.2016, 13:13:03 »

А ваш код это вообще издевательство над Joomla, и принципами MVC.. если хотите я вам напишу как привильно делать AJAX в условиях компонента Joomla
А чего тут писать и думать то.
Отправляем в контролер там  подгоняем полученные данные под свои нужны, делаем проверки если нужно (или если не удобно делаем через модель) > отправляем в модель, делаем что нужно > возвращаем результат(если нужно вьющку подключаем) и используем JResponseJson = профит.
Но все равно я один фиг не понимаю приведенного ТС кода, ну не вижу вообще как он работает.

P.S а если игнорить mvc тогда есть com_ajax
Записан
robert
Профи
********

Репутация: +343/-11
Offline Offline

Пол: Мужской
Сообщений: 3576


« Ответ #10 : 03.11.2016, 13:15:44 »

Некоторые советы по коду:
-При использовании JRoute() можно опускать $_SERVER['SERVER_NAME'], которое лучше получить по API Joomla - JURI::base().
-Убрать onclick с кнопки, добавить input с id, а в скрипте уже выполнять AJAX по onclick или onsubmit.
-Получить данные формы в скрипте посредством serialize().
-Убрать вид, весь код прописать в контроллер - вам ведь не нужно выводить страницу, верно?
-В Joomla есть возможность выполнять AJAX посредством com_ajax, но я ее не использую. Пусть Aleks.Denezh вам расскажет.
По token и captcha Aleks.Denezh уже писал.
Одно мне непонятно: вам нужно отсеивать боты или людей?

P.S. А кто вообще имеет право выполнять сие действие? Если не все, то создавайте секретные ключи, которые нужно вводить для отправки запроса.
« Последнее редактирование: 03.11.2016, 13:42:52 от robert » Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6453



« Ответ #11 : 03.11.2016, 13:16:39 »

если хотите я вам напишу как привильно делать AJAX в условиях компонента Joomla
научи, друже, - тут так мало примеров хорошего кода, что любой твой пост с таким примером - это как глоток кислорода в открытом космосе
« Последнее редактирование: 03.11.2016, 13:20:50 от AlekVolsk » Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6453



« Ответ #12 : 03.11.2016, 13:19:22 »

а если игнорить mvc тогда есть com_ajax
а зачем игнорить mvc? com_ajax прекрасно в него вписывается, следует понимать, что каноны mvc классические и mvc J -все же различаются, иногда местами настолько кардинально, как теплое с мягким
Записан
Septdir
Живу я здесь
******

Репутация: +32/-3
Offline Offline

Пол: Мужской
Сообщений: 819


Skype: septdir


« Ответ #13 : 03.11.2016, 13:22:29 »

а зачем игнорить mvc? com_ajax прекрасно в него вписывается, следует понимать, что каноны mvc классические и mvc J -все же различаются, иногда местами настолько кардинально, как теплое с мягким
Ну игнорить это конечно некорректно. я хотел сказать, если не юзать mvc целиком, то зачем делать комопнент. Судя по тому что AJAX идет в основной контролер, то работа с этим запросом чуть ли не вся задача компонента. А если это так то для формы хватит и модуля + com_ajax
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6453



« Ответ #14 : 03.11.2016, 13:24:41 »

для формы хватит и модуля + com_ajax
не возьмусь утверждать - мы не видим всего, там под капотом мож еще чего дохрена напихано (мож это маленькая чавстичка большого компонента магаза? но я даж боюсь представить себе качество кода в нем...)
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #15 : 03.11.2016, 14:08:24 »

Итак в 100500 раз про формы и AJAX, и да я я не юзаю com_ajax для аякса в своем компоненте, ибо в своем компоненте проще все контролировать...
1. компонент оплаты называем com_pay например
2. Форма:
Показать текстовый блок
В ней поля для примера, можно создать любое количество нужных полей как видимых, так и скрытых (для передачи каких то данных)

Все на этом форма заканчивается, и вызывается так index.php?option=com_pay (или завязать на пункт меню, и открыть по ссылке) отобразится ваша форма!

2. Отправка формы идет в контроллер pay в метод send:
Показать текстовый блок
Все расписано в контроллере! В контроллере мы обрабатываем данные и готовим их для сохранения в базу через модель!

3. Модель:
Показать текстовый блок
В нем метод только для того что бы сохранить данные в базу, модель у нас работает только с базой, все!

P.S. ниже вы можете скачать пример в котором все это сделано!

* com_pay.zip (20.76 Кб - загружено 1 раз.)
« Последнее редактирование: 03.11.2016, 14:15:47 от Aleks.Denezh » Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #16 : 03.11.2016, 14:16:28 »

За пинок по качеству кода спасибо, но лучше пока не выходит. Я не все еще понимаю где лучше писать каждый участок кода.

Компонент нужен именно компонент, т.к. это только часть.

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

Понял ошибку про контроллер и вид, про то что не использую JResponse, а в чем еще косяки по коду?

Закрыть AJAX запрос нужно для того чтобы бот не мог прошукать по базам и получить инфу (пусть и обрезанную) из сторонних баз
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #17 : 03.11.2016, 14:19:52 »

Закрыть AJAX запрос нужно для того чтобы бот не мог прошукать по базам и получить инфу (пусть и обрезанную) из сторонних баз
И как он их получит если:

Есть базы клиентов которые платят абонентку (несколько баз) они доступны по логину и паролю для выполнения определенных операций.
или у бота есть все логины и пароли?
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #18 : 03.11.2016, 14:36:00 »

Поясню логику.
1. выбор услуги (это отдельная сторонняя база)
2. ввод лиц.сч. исполняется по кнопке через Аякс
3. получение подрезанных персональных данных по лиц.сч.
4. переформирование формы (убираем поле лиц.сч., добавляем поле суммы), проводим подстановку данных в поля такие как сумма,
5. выводим новую кнопку на которой висит новый AJAX, который сохраняет превоначальные данные в DB компонента, регит заявку в банке и по выполнению перенаправляет на страницу оплаты.
6. возвращаемся на страницу формы из банка с доп.параметрами выполняем проверку оплаты, выполняем перезапись в DB сайта, выполняем процедуру в сторонней базе, выводим сообщение.
Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #19 : 03.11.2016, 14:36:54 »

И как он их получит если:
или у бота есть все логины и пароли?
в том то и дело что пароли к базам хранятся на сайте. Пароли с ограничениями, но часть данных все равно можно получить.
Записан
Septdir
Живу я здесь
******

Репутация: +32/-3
Offline Offline

Пол: Мужской
Сообщений: 819


Skype: septdir


« Ответ #20 : 03.11.2016, 14:57:44 »

Итак в 100500 раз про формы и AJAX, и да я я не юзаю com_ajax для аякса в своем компоненте, ибо в своем компоненте проще все контролировать...
А почему ты не используешь JResponseJson в контролере, как по мне он очень удобный.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #21 : 03.11.2016, 15:06:33 »

А почему ты не используешь JResponseJson в контролере, как по мне он очень удобный.
Потому что юзал такой способ до появления JResponseJson и привык к нему )
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #22 : 03.11.2016, 15:15:49 »

Поясню логику.
1. выбор услуги (это отдельная сторонняя база)
2. ввод лиц.сч. исполняется по кнопке через Аякс
3. получение подрезанных персональных данных по лиц.сч.
4. переформирование формы (убираем поле лиц.сч., добавляем поле суммы), проводим подстановку данных в поля такие как сумма,
5. выводим новую кнопку на которой висит новый AJAX, который сохраняет превоначальные данные в DB компонента, регит заявку в банке и по выполнению перенаправляет на страницу оплаты.
6. возвращаемся на страницу формы из банка с доп.параметрами выполняем проверку оплаты, выполняем перезапись в DB сайта, выполняем процедуру в сторонней базе, выводим сообщение.
1. Для нас это не важно логику этого вы сами должны писать, и это никак не связано с защитой..
2-5. ну ввели лицевой счет, по кнопке через AJAX, в форме, что вам мешает после этого аяксом вернуть ещё одну форму юзеру с оплатой и вставить вместо текущей с порезаными данными и переформатированной формой это вообще новая форма будет! которая будет!
6. а тут уже другая пестня, если у банка API вменяемое, то вы должны будете вставить минимум три ссылки:
1) ссылка на страницу с успешной оплатой ссылка на
2) ссылка на страницу с ошибкой оплаты
3) скрытая ссылка куда банк пошлет результаты оплаты
Притом что первые две ссылки могут быть банальными ссылками на какой то материал, где будет банальный текст о том что пользователь совершил оплату!
последняя ссылка должна быть типа: site.ru/index.php?option=com_pay&task=pay.confirm
где в методе confrim вы проверите все что вам надо!
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #23 : 03.11.2016, 15:36:37 »

пример того как бы я написал (точнее как уже писал на одном сайте), через аякс:
Сначала идет форма запроса лицевого счета, и если код верен выведет следующую форму где будут уже какие то данные взятые из базы и новая форма с новыми действиями!
Скачать ниже в прикрепленном файле можно:

* com_pay.zip (22.1 Кб - загружено 1 раз.)
Записан
b2z
Support Team
*****

Репутация: +708/-0
Offline Offline

Пол: Мужской
Сообщений: 7517


Разраблю понемногу


« Ответ #24 : 03.11.2016, 19:14:21 »

Код
if ( !JSession::checkToken() ) exit; //Проверка токена
$form = $this->input->get( 'form', [ ], 'array' ); //получаем данные формы
if ( trim( $form['name'] ) === '' ) $this->printJson( 'Вы не ввели ваше имя!' ); //проверка имени
if ( !filter_var( $form['email'], FILTER_VALIDATE_EMAIL ) ) $this->printJson( 'Неверный формат E-mail!' );//проверка E-mail
if ( $this->getModel()->savePay( $form ) ) { //дергаем в модели метод savePay, и если вернулось true то выполняем какие то действия и выводим сообщение
$this->printJson( 'Оплата выполнена!', true );
}
$this->printJson( 'Не удалось выполнить оплату!' );//если не удалось сохранить
Блин, оффтоп - но код - вырви глаз! Когда ты уже научишься отступы делать или тебе строчек жалко?  Grin Я уже молчу про стандарты кодинга Joomla Wink
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #25 : 03.11.2016, 19:37:24 »

Код
if ( !JSession::checkToken() ) exit; //Проверка токена
$form = $this->input->get( 'form', [ ], 'array' ); //получаем данные формы
if ( trim( $form['name'] ) === '' ) $this->printJson( 'Вы не ввели ваше имя!' ); //проверка имени
if ( !filter_var( $form['email'], FILTER_VALIDATE_EMAIL ) ) $this->printJson( 'Неверный формат E-mail!' );//проверка E-mail
if ( $this->getModel()->savePay( $form ) ) { //дергаем в модели метод savePay, и если вернулось true то выполняем какие то действия и выводим сообщение
$this->printJson( 'Оплата выполнена!', true );
}
$this->printJson( 'Не удалось выполнить оплату!' );//если не удалось сохранить
Блин, оффтоп - но код - вырви глаз! Когда ты уже научишься отступы делать или тебе строчек жалко?  Grin Я уже молчу про стандарты кодинга Joomla Wink
Дима ты про какие отступы у меня с ними все впорядке!
Показать текстовый блок
или ты имеешь ввиду между строками ставить? Как по мне все красиво читается...
А про стандарты кодинга Joomla это какие?
Записан
b2z
Support Team
*****

Репутация: +708/-0
Offline Offline

Пол: Мужской
Сообщений: 7517


Разраблю понемногу


« Ответ #26 : 04.11.2016, 10:54:46 »

Цитировать
или ты имеешь ввиду между строками ставить?
Да и if по другому писать.

https://joomla.github.io/coding-standards/

Ставишь в PhpStorm стандарты кодинга и радуешься Azn
https://docs.joomla.org/Joomla_CodeSniffer

Сравни читаемость:
Код
if (!JSession::checkToken()) exit; //Проверка токена
 
$form = $this->input->get('form', [ ], 'array'); //получаем данные формы
 
if (trim($form['name']) === '') $this->printJson('Вы не ввели ваше имя!'); //проверка имени
if (!filter_var( $form['email'], FILTER_VALIDATE_EMAIL)) $this->printJson('Неверный формат E-mail!');//проверка E-mail
 
if ($this->getModel()->savePay($form))
{
//дергаем в модели метод savePay, и если вернулось true то выполняем какие то действия и выводим сообщение
$this->printJson('Оплата выполнена!', true);
}
 
$this->printJson('Не удалось выполнить оплату!');//если не удалось сохранить
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #27 : 04.11.2016, 13:36:51 »

Ставишь в PhpStorm стандарты кодинга и радуешься Azn
https://docs.joomla.org/Joomla_CodeSniffer
Эм как бы шторм на то и шторм что в нем можно настроить отображение переносов  и скобочек.. и если у меня отображается так то у кого то будет отображаться по другому комбинация: (){}

Сравни читаемость:
Сравнил, для меня разницы ноль.. а отступы чуть ли не после каждой строки мне наоборот мешают...
« Последнее редактирование: 04.11.2016, 13:50:26 от Aleks.Denezh » Записан
Septdir
Живу я здесь
******

Репутация: +32/-3
Offline Offline

Пол: Мужской
Сообщений: 819


Skype: septdir


« Ответ #28 : 04.11.2016, 13:43:40 »

Да и if по другому писать.
Ну о стандартках не спорят, но я привык (может из примеров научился, может сказал когда-то кто) писать if так
Код
if ($x == $a) {
что нибудь
}
 
Так что сугубо для меня такое написание
Код
if ($x == $a) 
{
что нибудь
}
 
Индийский код, и читается через силу. Ну а переучиваться это уже перебор

Ну это пол беды я и такое написание не раз встречал
Код
public
static
function
{
}
 
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #29 : 04.11.2016, 13:53:11 »

Ну о стандартках не спорят, но я привык
Не спорят о вкусах, а о стандартах можно...

Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet