1/3
XenForo’da JSON İstekleri Nasıl Engellenir?
Sorunun özeti
XenForo’da
/index.php?login/login&json=1 gibi JSON isteklerini (özellikle frontend’de görünen ?json=1 yanıtlarını) tamamen kapatmak veya ziyaretçilere kullandırmamak istiyorsun.Aşağıda iki mantıklı yaklaşım var:
- XenForo’nun kendi mekanizmasını kullanarak JSON/“API benzeri” istekleri devre dışı bırakmak (önerilen, güncelleme dostu)
- Web sunucusu (Apache/Nginx) seviyesinde JSON isteklerini engellemek
1. XenForo İçinde JSON İsteklerini Engelleme (Add-on / Listener ile)
XenForo’da JSON cevaplar genelde
?json=1 parametresiyle tetiklenir. Bunu global seviyede yakalayıp 403 döndürmek için app_pub_setup event’ine bir listener bağlayabilirsin.Örnek basit eklenti mantığı:
a) Listener sınıfı –
src/addons/Ornek/NoJson/Listener/AppSetup.php:
PHP:
<?php
namespace Ornek\NoJson\Listener;
use XF\App;
use XF\Http\Request;
class AppSetup
{
public static function appPubSetup(App $app)
{
/** @var Request $request */
$request = $app->request();
// JSON isteklerini tespit et
$isJson = $request->filter('_xfResponseType', 'str') === 'json'
|| $request->filter('json', 'bool');
if ($isJson) {
// İster direkt 403 döndür
$reply = $app->reply()->errorException(
\XF::phrase('no_permission'),
403
);
// Veya basit bir 403 header + exit:
// header('HTTP/1.1 403 Forbidden');
// exit('JSON istekleri devre dışı bırakıldı.');
$app->runReply($reply);
exit;
}
}
}
b) Event Listener kaydı (addon.json / admin panel)
Admin panelden:
- Development → Code event listeners
- Add code event listener
- Event:
app_pub_setup - Execute callback:
Ornek\NoJson\Listener\AppSetup::appPubSetup
Bu şekilde public tarafta tüm JSON istekleri (login, register, overlay formlar vb.) engellenir. Dikkat et: Bazı XenForo fonksiyonları (özellikle overlay login vs.) JSON’a bağımlı; bunları kapatırsan kullanıcı deneyimi bozulur, tıklamalar tam sayfa yenilemeye dönmelidir (tema/şablon düzeni gerekebilir).
2. Web Sunucusu Seviyesinde
?json=1 EngellemeJSON isteklerinin büyük kısmı query parametre üzerinden gidiyorsa,
json=1 parametresini Apache ya da Nginx ile de engelleyebilirsin.Apache (.htaccess) için:
Kod:
<IfModule mod_rewrite.c>
RewriteEngine On
# JSON isteklerini engelle
RewriteCond %{QUERY_STRING} (^|&)json=1(&|$) [NC]
RewriteRule ^ - [F,L]
</IfModule>
Bu kural, URL’de
?json=1 geçen tüm istekleri 403 (Forbidden) ile kapatır.Nginx için (server bloğu içine):
NGINX:
location / {
if ($arg_json = "1") {
return 403;
}
try_files $uri $uri/ /index.php?$uri&$args;
}
Bu da
json=1 GET parametresi olan istekleri engeller.3. Nelere Dikkat Etmelisin?
- XenForo’nun bazı AJAX/overlay fonksiyonları JSON yanıt bekler. Bunları engellersen:
- Login penceresi overlay şeklinde açılıyorsa çalışmayabilir
- Bazı butonlar “arka planda” çalışmak yerine tam sayfa hata verebilir
- Canlı sitede denemeden önce mutlaka test ortamında dene veya en azından dosya/DB yedeği al
- Sadece belirli route’larda (örneğin login, register dışındakilerde) engellemek istersen, listener içinde
routeMatchüzerinden controller/action’a göre filtre eklemen gerekir
Sonuç
XenForo’da JSON isteklerini tamamen kapatmak mümkün; en temiz yöntem
app_pub_setup event’ini yakalayıp JSON istekleri 403’e düşürmek, daha basit/pratik yöntem ise .htaccess veya Nginx ile json=1 parametresini bloklamak. Hangisini uygularsan uygula, bazı arayüz fonksiyonlarının buna göre davranacağını göz önünde bulundurman gerekir.