kamilo818
28.01.2015, 16:11:02
Chciałym aby do includowanych plików nie można było dostać się bezpośrednio. Tylko i wyłacznie ze strony głównej.
Czy takie rozwiązanie nie będzie 'dziurą' w systemie? W sensie czy jest bezpieczne?
glowna.php
<html>
<head></head>
<body>
<?php
$dostep=true;
?>
<div id="content_box">
<?php
include('users.php');
?>
</div>
</body>
</html>
users.php
<?php
if($dostep==true || $_POST['dostep']==true){
//wyswietl strone
}else{
}
?>
<div class='users'>
</div>
<script>
$('.block').click(function(e){
var login=login;
var dataString = 'login='+login + 'dostep=true';
$.ajax({
type: 'post',
url: ('users.php'),
data: dataString,
success: function (obj) {
$('.users').html(obj);
}
});
e.preventDefault();
});
</script>
markuz
28.01.2015, 16:22:35
Pliki które dołączasz w ten sposób umieść w katalogu np. includes a w nim umieść plik .htaccess "deny from all" - wtedy będzie bezpiecznie.
nospor
28.01.2015, 16:23:48
Wrzuc poprostu pliki includowane do katalogu, który nie jest dostepny przez przeglądarke i juz.
Od biedy do katalogu wrzuc plik .htaccess, ktory zabroni dostep do tego katalogu o tresci:
Kod
order deny,allow
deny from all
kamilo818
28.01.2015, 16:33:16
robilem tak ale jeśli chce przesłać za pomocą ajaxa
$.ajax({
type: 'post',
url: ('users.php'),
data: dataString,
success: function (obj) {
$('.users').html(obj);
}
});
to odmawai mi dostępu do users.php które jest w tym katalogu. Chyba ze inaczej to zrobic?
aniolekx
28.01.2015, 16:44:05
pytanie czy plik users.php jest plikiem "includowanym" czy plikiem który ma obsłużyć request z ajaxa?
kamilo818
28.01.2015, 16:46:26
tym i tym
dokłądnie to działa jak przykłąd w 1szym poście
nospor
28.01.2015, 21:19:24
To sie zdecyduj: albo ma byc dostep do pliku z przegladarki albo nie. Bo w tej chwili raz chcesz miec dostep a za chwile nie...
kamilo818
29.01.2015, 08:18:47
Chce aby był dostęp przez ajaxa. Nie chce aby bezpośrednio użytkownik wszedł wpisując w pasek adresu.
Czyli
Do pliku głównego userpanel.php są includowane pliki na których wykonuje operacje przesyłając ajaxem. Includuje np users.php. I chce aby do users.php użytkownik miał dostęp z poziomu userpanel a nie bezpośrednio wchodząc na users.php
Moje rozwiazanie ze sprawdzaniem wartości zmiennej sprasza się. Ale nie wiem czy jest poprawne (bezpieczne)
Chyba ze jakoś inaczej mogę to rozwiązać ?
phpion
29.01.2015, 08:24:47
Cytat(kamilo818 @ 29.01.2015, 08:18:47 )

Chce aby był dostęp przez ajaxa. Nie chce aby bezpośrednio użytkownik wszedł wpisując w pasek adresu.
Jeśli korzystasz np. z jQuery czy innej biblioteki wysyłającej odpowiedni nagłówek, wówczasz możesz poszukac nagłówka X-Requested-With:
http://stackoverflow.com/questions/4301150...a-ajax-with-phpCytat(kamilo818 @ 29.01.2015, 08:18:47 )

Do pliku głównego userpanel.php są includowane pliki na których wykonuje operacje przesyłając ajaxem. Includuje np users.php. I chce aby do users.php użytkownik miał dostęp z poziomu userpanel a nie bezpośrednio wchodząc na users.php
W pliku głównym userpanel zadeklaruj stałą np. ACCESS, a w users.php sprawdzaj czy stała jest zdefiniowana (
defined). Jeśli nie - zakończ dalsze wykonywanie skryptu.
nospor
29.01.2015, 08:27:55
Cytat
W pliku głównym userpanel zadeklaruj stałą np. ACCESS, a w users.php sprawdzaj czy stała jest zdefiniowana (defined). Jeśli nie - zakończ dalsze wykonywanie skryptu.
Ale wowczas nie bedzie mial dostepu z ajaxa, bo tam odwoluje sie bezposrednio do users.php.
@kamilo818 Twoje próby "zabezpieczenia" nie maja żadnego sensu... Skoro skrypt jest dostepny dla ajaxa, to jest dostepny dla całej przegladarki i juz. Co ci szkodzi, ze ktos go wywoła bezposrednio z paska przegladarki? No nic to nie szkodzi.
Od biedy mozesz patrzec na te naglowki co wspomniał o nich phpion, ale to tak czy siak niczemu nie sluzy takie "zabezpieczenie"
Jeżeli chcesz żeby był dostęp przez AJAX, to możesz tylko utrudniać bezpośrednie wejście, tak jak to robisz przez tą zmienną. Możesz też sprawdzać referer, ale to wszystko da się ominąć. Po co właściwie chcesz to zabezpieczać?
phpion
29.01.2015, 08:44:24
Cytat(nospor @ 29.01.2015, 08:27:55 )

Ale wowczas nie bedzie mial dostepu z ajaxa, bo tam odwoluje sie bezposrednio do users.php.
No to OR: jeśli jest to ajax LUB zadeklarowano stałą to wpuść. W przeciwnym wypadku - zakończ działanie skryptu. Co do skuteczności zabezpieczenia patrząc na nagłówki to się zgadzam - nie jest to pewne. Jednak w większości przypadków typowych użytkowników to zadziała. Pytanie tylko, czy ci typowi użytkownicy będą tak kombinować
nospor
29.01.2015, 08:59:25
@phpion ale tu nie chodzi o "pewnosc zabezpieczenia" ale o jego zasadnosc, która jest zerowa. Co komu da, ze bedzie mozna tam wejsc tylko ajaxem? No nic.
kamilo818
29.01.2015, 09:26:45
Już wyjaśniam moje założenie(może błedne)
Po poprawnym zalogowaniu mam dostęp do userpanel.php
w user panel sprawdzam czy mam dostęp(czy jestem zalgoowany)
if(empty($_COOKIE['islogged'])){ header('Refresh: 2; url=login_form.php'); die( '<div class="notlogged">Czas sesji wygasł. Proszę zalogować się ponownie.<br> Za chwilę nastąpi przepierowanie</div>'); }
if(isset($_SESSION['nick']) && isset($_SESSION['ip']) && $_SESSION['ip']==$_SERVER['REMOTE_ADDR']){
}
w userpanel.php includuje pliki. Dlatego chciałem żeby nie można wejść bezpośrednio includowanych plików, żeby użytkownik nie zalogowany nie miał do nich dostępu.
Tak teraz myślę, że moze po prostu w includowanych plikach też sprawdzać czy jest user zalogowany tak jak w userpanel.php
nospor
29.01.2015, 09:32:16
Masz bledne zalozenia.
Pliki, ktore mają nie byc dostepne przez przegladarke, w tym i AJAX, mają leżec w katalogu niedostepnym dla przegladarki. Pisalem ci juz o tym.
Jesli masz akcje logowania, to ona z ajaxa ma nie byc bezposrednio dostepna jako users.php, tylko ma przechodzic nadal przez Twoj główny skrypt, który to dopiero includuje users.php.
Wowczas pilnowanie praw masz tylko w jednym pliku, a wszystkie inne są niedostepne przez przegladarke i ajax.
kamilo818
29.01.2015, 10:22:27
Ok.
Ale skoro users bedzie w katalogu niedostępnym, ale ajaxem bede chciał działać na tym pliku to dostep bedzie zabroniony.
Przeciez nie mogę przez nadrzędny plik userpanel działać na users bez dostepu do niego?
Aktualnie struktura moich plików wyglada tak:
root:
login_form.php
login.php
register_form.php
register.php
logout.php
page:
userpanel.php
includes
users.php
config.php
functions.php
ajax jest w pliku users.php
nospor
29.01.2015, 10:28:43
No to ci wlasnie mowie:
ma byc jeden plik ogolny, ktory bedzie includowal pliki odpowiedzialen za daną akcje. Ty zawsze masz odpalac ten plik ogolny z parametrem bedącym nazwą akcji, ktora cie interesuje. Na podstawie tego parametru, plik ogolny zaincluduje wlasciwy plik.
kamilo818
29.01.2015, 11:59:17
Sprawdz czy dobrze rozumiem:
plik users.php i ajax.js w nieodstpenym katalogu
userpanel.php - głowny plik (normalnie dostpeny)
W users.php (z 'includem' ajax.js) mam listę uzytkowników. Jesli chcę wykonać na niej akcję np usunac rekord z bazy, to po kliknięciu 'usun' ajax przesyła żądanie do userplanel.php który usuwa rekord i po tym includuje jeszcze raz users.php
Czy tak?
nospor
29.01.2015, 12:12:05
pliki .js mają byc w dostepnym katalogu. No niby jak je przeglądarka załaduje?
Chyba ze ajax.js jest zwykly js ktory normalnie jako tekst includujesz na strone.
Cytat
, to po kliknięciu 'usun' ajax przesyła żądanie do userplanel.php który usówa rekord i po tym includuje jeszcze raz users.php
Mniej wiecej. Ale glowy nie dam sobie uciac bo nie wiem jakie ty tam masz dokladnie te kody.
kamilo818
29.01.2015, 20:49:37
Dzięki wszytkim za pomoc.
Sam nie wiem jak ale udało mi się wszystkie pliki wrzućić do niedostępnego koatlogu oprócz index w którym mam jakby routing i w zależnści od parapetru includuje pliki.
Nawet jak wwysłam ajaxem do pliku który jest w niedostepnym katalogu to śmiga. Podaje tylko parametr do routingu i wsio.
<?php
$strDefaultPath = '';
$_SERVER['PATH_INFO'] = isset($_SERVER['PATH_INFO']) ?
$_SERVER['PATH_INFO'] : $strDefaultPath; //print_r($arrParams);
if($arrParams[0]=='' || $arrParams[0]=='logowanie'){
include_once('includes/login_form.php');
}elseif($arrParams[0]=='rejestracja'){
include_once('includes/register_form.php');
}elseif($arrParams[0]=='logout'){
include_once('includes/logout.php');
}elseif($arrParams[0]=='userpanel'){
include_once('includes/userpanel.php');
}elseif($arrParams[0]=='login_done'){
include_once('includes/login.php');
}elseif($arrParams[0]=='register_done'){
include_once('includes/register.php');
}else{
include_once('includes/login_form.php');
}
?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.