[PHP] Skrypt logowania wywala do strony serwera

Witam 

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

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.

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.

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");
}
?>

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

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.

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

W ww funkcji jest funkcja trim().

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:

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.

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).

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.

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ść.

Nie zwróciłem uwagi na dokumentacje.

 

Dzieki za podpowiedz.

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

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.

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’

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.

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.