[PHP] Skrypt logowania wywala do strony serwera


(Konradnie1) #1

Witam 


(Piesek64) #2

Ludzie, pamiętajcie że to nie bash tylko PHP.

$zap_log=mysql_query("SELECT login, haslo FROM users WHERE login = '".$login."' AND haslo = '".$md5_has."';");

Zauważ, że gdy logowanie się uda, jesteś przenoszony na index.php


(Konradnie1) #3

No to tak ma być.

 

Jeśli nie jest zalogowany to wyświetla formularz index a jak jest zalogowany albo zaloguje to odświeza index.php i wyświetla to co ma być dostępne po zalogowaniu.


(Piesek64) #4

SQL injection...

Jako login pójdzie ,,admin or 1=" a 1' pójdzie do zapytania.

Podaj zawartość index.php.

 

P.S: samo md5? Polecam ci sha256 (a najlepiej sha512) hashu md5.


(Konradnie1) #5

Sory że dopiero teraz odp ale nie mialem dostępu do internetu przez weekend.

<?php
$klucz="458gfd2486gfds12";
session_start();
if(empty($_SESSION['log_id']) )
{
?>
<!DOCTYPE html>
<html>
<head>
<link rel="Stylesheet" type="text/css" href="style.css">
<meta charset="UTF-8">
</head>
<body>
<div id="ALL">
<div id="BANNER"></div>
<div id="MENU">

<dl>
<dt style='background-image: url("grafika/menu-big.png")'>Menu</dt>
<dd><a href="index.php">Newsy</a></dd>
<dd><a href="index.php">Buildy</a></dd>
<dd><a href="index.php">Skład</a></dd>
<dd><a href="index.php">Zastępstwo</a></dd>
<dd><a href="index.php">Czas na grę</a></dd>
<dd><a href="index.php">Wardy</a></dd>
<div id="TS3-AKTULANY">
<br />
<br />
<dt style='background-image: url("grafika/menu-big.png")'>Aktualny Ts3</dt>
<dd style="width:150px; height:29px; padding:px;"></dd>

</div>
</dl>

</div>
<div id="SHOUT">

</div>


<div ID="TRESC">
<div id='form_log'>
<form action='' method='post'>
  <label for='login'>Login:</label>
  <input type='text' name='log' id='login'><br>
  <label for='haslo'>Hasło:</label>
  <input type='password' name='pass' id='haslo'><br>
  <input type='submit' name='zaloguj' value='Zaloguj'>
</form>
</div>
<?php
	if(isset($_POST['zaloguj']))
	{
		include('dodaj/setting.php');
		include('dodaj/funkcje.php');

		$login = filtr($_POST['log']);
		$haslo = filtr($_POST['pass']);
		$md5_has=md5($haslo);
		$zap_log=mysql_query("SELECT login, haslo FROM users WHERE login = '$login' AND haslo = '$md5_has';");
		
		if (mysql_num_rows($zap_log) > 0)
		{	
			$_SESSION['log'] = true;
			$_SESSION['log_id'] = $login;
			$_SESSION['ip_id']=$_SERVER['REMOTE_ADDR'];
			
			header("Location: index.php");
		}
		else
		{	
		$komunikat="Podano błędne dane!";
		}
	echo"<div id='komunikaty_log'>$komunikat</div>";
	}
	
?>
</div>
</div>

</body>
</html> 
<?php 
 }
else
 {
include("dodaj/setting.php");
include("dodaj/funkcje.php");
$login=filtr($_SESSION['log_id']);
$ilosc_ogl=mysql_num_rows(mysql_query("SELECT id FROM ogloszenia"));

	if(isset($_POST['post_zapisz']))
	{
	$post=filtr($_POST['post']);
	$data=date('d-m-y');
	$czas=date(I);
	if($czas==1)
	{
	$godz=date('H:i:s');
	$data2=$data.'<br>'.$godz;
	mysql_query("INSERT INTO ogloszenia (nadawca, tresc, data) VALUES ('$login', '$post', '$data2')");
	header("Location: index.php");
	}
	else
	{
	$godz=date(H)+1;
	$min=date('i:s');
	$data2=$data.'<br>'.$godz.':'.$min;
	mysql_query("INSERT INTO ogloszenia (nadawca, tresc, data) VALUES ('$login', '$post', '$data2')");
	header("Location: index.php");
	}
	}
	if(isset($_POST['zmien_ts']))
	{
		$ts3=filtr($_POST['ts']);

		mysql_query("UPDATE ts SET ts='$ts3'");
		header("Location: index.php");
	}
	if(isset($_GET['c_s']) && $_GET['c_s']==1 && $login=="Rois Wufe")
	{
		mysql_query("DELETE FROM ogloszenia");
		header("Location: index.php");
	}
	
	$ts_w=mysql_query("SELECT ts FROM ts");
	$i=0;
	while($ts_a=mysql_fetch_assoc($ts_w))
	{
		$info[$i]=$ts_a;
		$i++;
	}
	$ts_w=$info[0]['ts'];
?>
<!DOCTYPE html>
<html>
<head>
<link rel="Stylesheet" type="text/css" href="style.css">
<meta charset="UTF-8">
<script type="text/javascript" src="skrypty_js.js"></script>
</head>
<body>
<div id="ALL">
<div id="BANNER"></div>
<div id="MENU">

<dl>
<dt style='background-image: url("grafika/menu-big.png")'>Menu</dt>
<dd><a href="index.php?r=0">Newsy</a></dd>
<dd><a href="index.php?r=1">Buildy</a></dd>
<dd><a href="index.php?r=2">Skład</a></dd>
<dd><a href="index.php?r=3">Zastępstwo</a></dd>
<dd><a href="index.php?r=4">Czas na grę</a></dd>
<dd><a href="index.php?r=5">Wardy</a></dd>
<dd><a href="wyloguj.php">Wyloguj</a></dd>
<div id="TS3-AKTULANY">
<br />
<br />
<dt style='background-image: url("grafika/menu-big.png")'>Aktualny Ts3</dt>
<dd style="width:150px; height:29px;">
<form action='' method='post'>
<a style='position:relative;top:2px;'><input id='ts_input' type='text' name='ts' value='<?php echo"$ts_w";?>'><input id='ts_submit' type='submit' name='zmien_ts' value='Z'></a>
</form>
</dd>
	
	
</div>
<div>
<?php
$result=mysql_query("SELECT nazwa, opis FROM buildy");
				if(!empty($result))
				{
					$num = mysql_num_rows($result);
				}
				else
				{
					$num = 0;
				}
				$i=0;
				$e=1;
				while ($i < $num) 
				{
					$nazwa=mysql_result($result,$i,"nazwa");
					$opis=mysql_result($result,$i,"opis");
					echo(" 
					<div id='$nazwa' class='build_nazwa_champ' style='display:none'>
					<p><h3>$nazwa</h3></p>$opis
					</div>
					");
				$i++;
				}
?>
</div>
</dl>

</div>
<div id="SHOUT">
<div id='ogloszenia' onmouseover="BigShoutbox(<?php echo"$ilosc_ogl";?>);" onmouseout="LittleShoutbox(<?php echo"$ilosc_ogl";?>);">
 <div id='ogloszenia_text'>
 <table>
 <?php
 $result=mysql_query("SELECT * FROM ogloszenia ORDER BY id DESC");
 if(!empty($result))
 {
  $num = mysql_num_rows($result);
 }
 else
 {
  $num = 0;
 }
 $i=0;
 while ($i < $num) 
 {
  $nick=mysql_result($result,$i,"nadawca");
  $text=mysql_result($result,$i,"tresc");
  $data=mysql_result($result,$i,"data");
 echo(" 
 <tr>
 <td width='200px'><a id='txt2'>$nick:</a><a id='pola'>$text</a></td>
 <td id='data_shout_".$i."' style='display:none;' width='60px'><a id='pola'>$data</a></td>
 </tr>
 ");
 $i++;
 }
 echo"
 </table>";
 ?>
  </div>
 <form action='' method='post'>
 <input id='pola_ogl' type='text' name='post' value=''><input id='o_sub' type='submit' name='post_zapisz' value='Wyślij'>
 </form>
 </div>

<div id="TS3">
<iframe id="gametrisTs3statusScript" src="" frameborder="0" scrolling="yes" width="220px" height="279px"></iframe>
<script type="text/javascript">var gametrisTs3date = new Date();document.getElementById("gametrisTs3statusScript").src="https://gametris.com/ts3view2.php?ip=178.217.186.66&port=8929&style=1&reload="+gametrisTs3date.getTime();</script>
</div>
</div>


<div ID="TRESC">
<?php
if(isset($_GET['r']))
{
switch ($_GET['r']) {
 case 0:
  include('newsy.php');
  break;
 case 1:
  include('buildy.php');
  break;
 case 2:
  include('sklad.php');
  break;
 case 3:
  include('zastepstwo.php');
  break;
 case 4:
  include('czas.php');
  break;
 case 5:
  include('wardy.php');
  break;
 case 6:
  include('news_edit.php');
  break;
}
}
else
{
include('newsy.php');
}
?>
</div>
<div id="STOPKA">
Strona internetowa stworzona przez Rois & Kongi. Wszelkie prawa zastrzeżone.
</div>
</div>

</body>
</html> 
<?php
 }
if(!isset($_SESSION['log']))  
{
session_regenerate_id();
$_SESSION['log']=true;
$_SESSION['ip_id'] = $_SERVER['REMOTE_ADDR'];
}
if($_SESSION['ip_id'] !== $_SERVER['REMOTE_ADDR'])
{
session_destroy();
header("Location: index.php");
}
?>

(Snaffx) #6

Cześć :slight_smile:

 

Słuchaj pierwsze co rzuca sie w oczy to to:

$login = filtr($_POST['log']);

Zapodaj na forum funkcję filtr() z /dodaj/funkcje.php


(Konradnie1) #7

Funkcja:

function filtr($zmienna)
{
    if(get_magic_quotes_gpc())
        $zmienna = stripslashes($zmienna);
    return mysql_real_escape_string(htmlspecialchars(trim($zmienna)));
}

Funkcje znalazłem na jakiejś stronie.

 

Możesz napisać coś więcej o tych błędach?? Podaj kilka i napisz co jest żle jak możesz.

Funkcji używałem wszędzie przy formularzu.

 

To jest taka stronka dla siebie i kilku kolegów nie musi być jakoś mega zabezpieczona.


(Piesek64) #8

Polecam ci dodatkowo użycie funkcji trim(), ponieważ białe znaki (w tym spacje) na końcu zmiennej mogą sporo namieszać.


(Konradnie1) #9

W ww funkcji jest funkcja trim().


(Snaffx) #10

Pierwsza rzecz jeśli chcesz uratować jakoś ten skrypt to oddzielenie kodu PHP od HTML. NIGDY nie trzymaj wszystkiego w jednym pliku. Lepiej mieć 100 małych plików, jak jeden duży :slight_smile:


(Konradnie1) #11

Dzięki za odpowiedz.

 

Sporo z tych błędów pojawiło się dlatego że html pisał mój znajomy a php ja dlatego jest trochę namieszane.

 

Możesz podać jakiąś strone z funkcjami mysql w php 5??

Nie wiedziałem że to się zmieniło. Kiedys się dowiedziałem że tak się obsługuje baze mysql i cały czas tak robiłem.

 

Jak możesz to podaj jakis ciekawy kurs do php5.

Php uczyłem sie dosyć dawno dlatego korzystam z starych funkcji jak możesz to podaj strone z funkcjami do bazy.

Chodzi mi własnie o te funkcje wykonywania zapytań.

 

Pozdrawiam.

 

 

A jeszcze w jaki sposób oddzielic php od html?? Napisz oo co dokładniej chodzi.


(Snaffx) #12

Coś sensownego co mi przychodzi do głowy to... dokumentacja. Jest w miarę przejżyście napisana. Niestety do obsługi bazy jest po angielsku.

 

Ja używam osobiscie najczęściej MySQLi, choć niekiedy lepszym rozwiazaniem wydaje sie PDO.

 

Tutaj masz link do dokumentacji MySQLi:

http://php.net/manual/en/book.mysqli.php

Oto przykładowe połaczenie z bazą danych:

// PDO - tylko obiektowy
$pdo = new PDO("mysql:host=localhost;dbname=database", 'username', 'password');


// MySQLi - strukturalny
$mysqli = mysqli_connect('localhost','username','password','database');


// MySQLi - obiektowy
$mysqli = new mysqli('localhost','username','password','database');

Lepiej używać wersji obiektowej.

 

W ogóle cały projekt oprzeć na obiektach :slight_smile: Już od dawien dawna nie pisze się w czystym PHP poważniejszych skryptów. Ba, już nawet MVC odchodzi do lamusa :wink:

 

Jeszcze kilka przydatnych linków:

http://php.net/manual/en/mysqli.overview.php
http://code.tutsplus.com/tutorials/pdo-vs-mysqli-which-should-you-use--net-24059
http://www.pontikis.net/blog/how-to-use-php-improved-mysqli-extension-and-why-you-should
https://www.udemy.com/blog/mysql-vs-mysqli/

Polecenia SQL jako tako się nie zmieniają. Chociaż nie mniej jednak poprawne powinno wyglądać coś w ten deseń:

INSERT INTO `tabela`(`id`, `pole1`, `pole2`, `pole3`, `pole4`) VALUES ([value-1],[value-2],[value-3],[value-4],[value-5])

Obecnie na wielu hostingach domyślnie (niestety) ustawione jest PHP w wersji 5.3. W wersji 5.4 polecenia z serii mysql_* zostały oznaczone jako deprecated, czyli do usunięcia. A w wersji 5.5 i wyżej już ich nie spotkamy :slight_smile: Dlatego jak skrypt działa na jednym hoście, to po przenosinach za np. 5 lat na inny host już nie koniecznie :wink:

 

Jeżeli chodzi o oddzielenie PHP od HTML to po prostu utwórz odpowiednie pliki dla odpowiednich sekcji kodu. Np. za zalogowanie będzie odpowiadał plik login.php, a w nim kod, który sprawdza dane. Wszystkie te pliki możesz ułożyć w logiczną całość, którą będziesz załączał w index.php po przez polecenia include, albo require. Mam nadzieję, ze wiesz, jaka jest różnica między include, a require.

 

Co do kursu PHP to nie spotkałem się z niczym bardziej sensowniejszym jak dokumentacja (ba, w niemal każdym języku tak jest). Podstaw możesz sie nauczyć ze strony kursphp.com (sam od niej zaczynałem, są tam przedstawione dosłownie podstawy podstaw).


(Konradnie1) #13

Dobra wielkie dzięki za podpowiedzi.

 

Ale dalej po wpisaniu w login admin or 1='1' przenosi na strone serwera. Jak to zmienic żeby nie przenosiło na strone hosta tylko na mojej stronie wywaliło blad??

Jeśli trzeba to podam link do strony.

 

A przykład łączenia z bazą to też tak mam ale mi chodziło jak np wyswietlic dane z bazy mysql_query mówisz że stare to jaka jest nowa funkcja. 

 

Pozdrawiam.


(Piesek64) #14

Przecież podał ci link do dokumentacji. Co jeszcze chcesz?

 

MySQL nie toleruje znaków '. Żeby je używać, muszą mieć przed sobą znak .

Zapytanie jest ok, jednak to co wprowadzasz może zapewnić mały sql injection.

Tutaj przykład tego co może wyjść.


(Konradnie1) #15

Nie zwróciłem uwagi na dokumentacje.

 

Dzieki za podpowiedz.


(Piesek64) #16

Przyda się link do tej strony. Isset sprawdza czy zmienna jest ustawiona. Użycie na przycisk skutkuje niewywołaniem skryptu.


(Konradnie1) #17

Wszystko działa jak należy jak wcisne przycisk to sie loguje ale jak podam liczba=liczba w loginie lub hasle to wywala na strone hosta.

 

Zawsze używałem isset na przycisk i po wcisnięciu wykonywało kod. Nigdy nie próbowałem podawać liczba=liczba w formularzu.

 

Na localhoscie jak tak wpisze to wywala ze nie ma takiego konta a na serwerze wywala. Nie wiem o co chodzi.


(Piesek64) #18

Sprawdź co zwróci MySQL po zapytaniu przez phpmyadmin wykonując takie zapytanie: SELECT login, haslo FROM users WHERE login = '1=1' AND haslo = '1=1'


(Konradnie1) #19

MySQL zwrócił pusty wynik (zero wierszy).

 

Żadnego błędu.

 

Ale to nie może być coś z bazą bo jak usune zapytania tylko zostawie sam formularz i coś takiego:

if(isset($_POST['zaloguj'])){
echo $_POST['login'];

}

to też wywala. Nawet nie musze pobierać wartości z pola login czy haslo.

Poprostu jak wpisze 1=1 i nacisne przycisk to sie sype niezależnie co jest w skrypcie.


(Snaffx) #20

Poprawiłeś w ogóle to o czym mówiłem? Tam jest masa błędów, wiec nie dziw, że coś nie działa.

 

Mistrzu, a ty czyścisz sesję za każdym błędnym zalogowaniem (wysłaniem formularza)? Może ci się strona scachowała? Daj Ctrl+F5, albo sprawdź na innej przeglądarce.