Tag: php

usuwanie stopki phpbb by przemo

usuwanie stopki phpbb by przemo

Żaden ze znanych skryptów nie blokuje zmiany stopki ani jej usunięcia oprócz phpbb by przemo. Usunięcie stopki jest możliwe oraz jej modyfikacje.
Lecz tutaj po zmianie stopki wyświetla się komunikat i jakby tego mało wysyła email do przema… To nie jest instrukcja typu zrób to i tamto !

Jak jest wyświetlana stopka ?

Zaczynamy od tego iż stopka jest wyświetlana z pliku overall_footer.tpl za pomocą zmiennej stylu: {PAGE_LOAD_PLEASE_WAIT} (w uproszczonej stopce simple_footer.tpl usunięcie lub zmiana stopki nie powoduje wyświetlenia ostrzeżenia).

I jakakolwiek modyfikacja stopki lub usunięcie powoduje wyświetlenie ostrzeżenia.

Stopka forum została zmodyfikowana, forum nie będzie działać prawidłowo!
Ustaw prawidłowo stopkę w pliku overall_footer.tpl, musi być ona widoczna w przegladarce, nie może zawierać “sztuczek” maskujacych.

Wzór: Powered by <a href="http://www.phpbb.com" target="_blank" class="copyright">phpBB</a> modified by <a href="http://www.przemo.org/phpBB2/" class="copyright" target="_blank">Przemo</a> &copy; 2003 phpBB Group

Lecz ostrzeżenie wyświetla się tylko podczas wysyłania postu lub prywatnej wiadomości, a za to odpowiada plik posting.php lub includes/functions_post.php.

Niestety na darmo możemy szukać zmiennej stylu {PAGE_LOAD_PLEASE_WAIT} w pliku includes/page_tail.php (odpowiada ona za generowanie stopki), ale znajdziemy ją w pliku includes/page_header.php (odpowiada za generowanie headera – topu forum):

'PAGE_LOAD_PLEASE_WAIT' => append_sid('<a href="index.'.$phpEx.'?mode=tloading">' . $lang['Page_loading_wait'] . '</a>'),

Więc szukamy funkcji append_sid, znajduje się w pliku includes/sessions.php

function append_sid($url, $non_html_amp = false, $subdir_off = false)
{
	global $SID, $subdirectory;
 
	if ( !empty($SID) && !preg_match('#sid=#', $url) )
	{
		$url .= ( ( strpos($url, '?') !== false ) ?  ( ( $non_html_amp ) ? '&' : '&amp;' ) : '?' ) . $SID;
	}
 
	if ( isset($subdirectory) && !$subdir_off )
	{
		$url = $subdirectory . $url;
	}
 
	$sid1 = base64_decode('aGFzaF8x');
	$sid_s = base64_decode('aGFzaF8y');
 
	global $$sid1, $$sid_s;
 
	return (strpos($url, base64_decode('bW9kZT10bG9hZGluZw==')) !== false) ? base64_decode(base64_decode(str_replace('si', '', $$sid1))) : ((strpos($url, base64_decode('bW9kZT1lbG9hZGluZw==')) !== false) ? base64_decode(base64_decode($$sid_s)) : $url);
}

Na pierwszy rzut oka coś związanego z adresami i ID sesji… lecz base64_decode() i do tego podwójne budzi ciekawość więc sprawdźmy i zdekodujmy:

$sid1 = hash_1;
$sid_s = hash_2;

Co ciekawsze hash_1 i hash_2 to zmienne globalne (zmienne bo należy zwrócić uwagę na dwa $$ przed nazwą):

global $$sid1, $$sid_s;

Więc tak naprawdę mamy:

global $hash_1, $hash_2;

a te zmienne znajdują się w pliku includes/constans.php:

// Forum unique hash
$hash_1 = 'VUc5M1pYSmxaQ0JpZVNBOFlTQm9jbVZtUFNKb2RIUndPaTh2ZDNkM0xuQm9jR0ppTG1OdmJTSWdkR0Z5WjJWMFBTSmZZbXhoYm1zaUlHsiTnNZWE56UFNKamIzQjVjbWxuYUhRaVBuQm9jRUpDUEM5aFBpQnRiMlJwWm1sbFpDQmllU0E4WVNCb2NtVm1QU0pvZEhSd09pOHZkM2QzTG5CeWVtVnRieTV2Y21jdmNHaHdRa0l5THlJZ1kyeGhjM005SW1OdmNIbHlhV2RvZENJZ2RHRnlaMlYwUFNKZllteGhibXNpUGxCeWVtVnRiend2WVQ0Z0ptTnZjSGs3SURJd01ETWdjR2h3UWtJZ1IzSnZkWEE9';
$hash_2 = 'UENFdExTQlFiM2RsY21Wa0lHSjVJSEJvY0VKQ0lHMXZaR2xtYVdWa0lIWXhMamtnWW5rZ2NISjZaVzF2SUNnZ2FIUjBjRG92TDNkM2R5NXdjbnBsYlc4dWIzSm5MM0JvY0VKQ01pOGdLU0F0TFQ0PQ==';

Następnie funkcja zwraca nam wartość ale zależną od tego co znajdzie w $url (należy najpierw pamiętać o usunięciu si w $hash_1):

return (strpos($url, 'mode=tloading') !== false) ? 'Powered by <a href="http://www.phpbb.com" target="_blank" class="copyright">phpBB</a> modified by <a href="http://www.przemo.org/phpBB2/" class="copyright" target="_blank">Przemo</a> © 2003 phpBB Group' : ((strpos($url, 'mode=eloading') !== false) ? '<!-- Powered by phpBB modified v1.9 by przemo ( http://www.przemo.org/phpBB2/ ) -->' : $url);

Oczywiście nas interesuje to co zwróci dla mode=tloading, a zwróci stopkę z $hash_1.

To już wiemy jak jest wyświetlana stopka.

Jak jest sprawdzana poprawność stopki ?

W pliku lang_main.php znajdziemy ostrzeżenie dotyczące stopki:

$lang['footer'] = 'Stopka forum została zmodyfikowana, forum nie będzie działać prawidłowo!<br />Ustaw prawidłowo stopkę w pliku overall_footer.tpl, musi być ona widoczna w przegladarce, nie może zawierać "sztuczek" maskujacych.<br /><br />Wzór: <b>Powered by &lt;a href=&quot;http://www.phpbb.com&quot; target=&quot;_blank&quot; class=&quot;copyright&quot;&gt;phpBB&lt;/a&gt; modified by &lt;a href=&quot;http://www.przemo.org/phpBB2/&quot; class=&quot;copyright&quot; target=&quot;_blank&quot;&gt;Przemo&lt;/a&gt; &amp;copy; 2003 phpBB Group</b>';

Skoro wiemy jak jest wyświetlana stopka i że ostrzeżenie pojawia się podczas pisania więc poszukajmy w pliku includes/functions_post.php naszej znajomej zmiennej:

$$sid1

Zaprowadzi nas to do funkcji correct_file() lecz zacznijmy od początku:

//code to get rid of some quick-reply-mod problems
	$crf = base64_decode('Y29ycmVjdF9maWxl');

po zdekodowaniu wywołuje funkcję correct_file:

$crf = correct_file;

Lecz następnie jest losowana liczba z pewnego przedziału:

$cr_file = rand(4,8);

Wiec szukamy co korzysta ze zmiennej $cr_file:

if ( $cr_file == 5 ) @$crf(false);

Jeśli wylosuje się 5 to stopka nie zostanie sprawdzona.

Funkcja correct_file()

function correct_file($file = true)
{
	global $board_config, $phpEx, $lang;
 
	$server_name = preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['server_name']));
	$btf = base64_decode('bWFpbA==');
	$script_name = preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['script_path']));
	$script_name = ($script_name == '') ? $script_name. '/login.'.$phpEx : '/' . $script_name. '/login.'.$phpEx;
	$server_protocol = ($board_config['cookie_secure']) ? 'https://' : 'http://';
	$server_port = trim($board_config['server_port']);
 
	$sid1 = base64_decode('aGFzaF8x');
 
	global $$sid1;
	$$sid1 = str_replace('si', '', $$sid1);
	$cont = get_url($server_name, $script_name, trim($board_config['server_port']));
	$cont = $cont[1];
	$th_ch = base64_decode(base64_decode($$sid1));
	if ( @eregi('username', $cont) && @eregi('password', $cont) )
	{
		$lmk = false;
		if ( !($pos = @strpos($cont, $th_ch)) || !(@strpos($$sid1, 'NJZ2RHRnlaMlYwUFNKZllteGhibXNpUGxCeWVtVnRiend2WVQ0Z')) || !(@strpos($$sid1, 'xuYUhRaVBuQm9jRUpDUEM5aFBpQnRiMlJwWm1sbFpDQmllU0E4WVNCb2NtVm1QU0pvZEhSd09pOHZkM2QzTG5CeWVtVnRieTV2Y21jdmNHaHdRa0l5TH')) )
		{
			$lmk = true;
		}
		$first = @str_replace(' ', '', @substr($cont, $pos-20, 20));
		$second = @str_replace(' ', '', @substr($cont, $pos+@strlen($th_ch)-1, 20));
		if ( @strpos($first, base64_decode('IS0t')) || @strpos($first, base64_decode('PGZvbg==')) || @strpos($first, base64_decode('aGlkZQ==')) || @strpos($first, base64_decode('aGlkZGU=')) || @strpos($second, base64_decode('LS0=')) || @strpos($second, base64_decode('L2Zvbg==')) )
		{
			$lmk = true;
		}
		if ( $lmk )
		{
			$th_d = base64_decode(base64_decode('Wm05dmRHVnk='));
			if ( @strpos($th_d, base64_decode(base64_decode('SEE2THk5M2QzY3VjSEo2WlcxdkxtOXla'))) ) exit;
			if ( @function_exists($btf) && $board_config['data'] < (CR_TIME - 432000) ) { @$btf(base64_decode('c3RvcGthQHByemVtby5vcmc='), base64_decode('LVNUT1BLQS0=-'), $server_protocol . $server_name . $server_port . '/' . preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['script_path'])) . "\r\n" . $board_config['board_email']); update_config('data', CR_TIME); }die($lang[$th_d]);
		}
	}
	return true;
}

Wiec po kolei, zmienna $btf

$btf = mail;

(jakby nie patrzeć będzie wysyłany email)
Odniesienie do naszego wzorcu stopki:

$sid1 = hash_1;

Potem z naszego wzoru stopki usuwane są frazy si oraz nasz wzorzez jest dwa razy dekodowany i otrzymujemy:

$th_ch = 'Powered by <a href="http://www.phpbb.com" target="_blank" class="copyright">phpBB</a> modified by <a href="http://www.przemo.org/phpBB2/" class="copyright" target="_blank">Przemo</a> © 2003 phpBB Group';

I co ciekawe jest pobierana treść strony logowania i jeśli znajdą sie tam dwie frazy password oraz username to tylko wtedy sprawdzana jest poprawność stopki.

Następnie sprawdzane jest czy znajduje się tam cała stopka według wzorca oraz czy wzorzec jest zgodny z porównaniem, jeśli nie to wysyłany jest email do przema i zostaje wyświetlone ostrzeżenie.

Dodatkowo sprawdzane są sztuczki maskujące (komentowanie stopki, jak i znacznik oraz hidden w CSS) takim if-em, jeśli zostaną znalezione w pobliżu stopki także wyświetlane jest ostrzeżenie i wysłany zostaje email do przema:

if ( @strpos($first, '!--') || @strpos($first, '<fon') || @strpos($first, 'hide') || @strpos($first, 'hidde') || @strpos($second, '--') || @strpos($second, '/fon') )

Oczywiście wysyłanie maila wygląda tak:

$th_d = footer;
			if ( @function_exists(mail) && $board_config['data'] < (CR_TIME - 432000) ) { 
@mail('stopka@przemo.org', '-STOPKA-', $server_protocol . $server_name . $server_port . '/' . preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['script_path'])) . "\r\n" . $board_config['board_email']); 
update_config('data', CR_TIME); 
}
die($lang[$th_d]);

I po wysłaniu maila wyświetlane jest ostrzeżenie:

die('footer');

Wszystko jest wysyłane na email……………….

Jak wyłączyć sprawdzanie stopki ?

W pliku overall_footer.tpl zmieniamy:

{PAGE_LOAD_PLEASE_WAIT}

na:

<br><a href="http://www.phpbb.com" target="_blank" class="copyright">phpBB</a> &amp; <a href="http://www.przemo.org/phpBB2/" target="_blank" class="copyright">Przemo</a>

W pliku includes/functions_post.php znajdź:

$crf = base64_decode('Y29ycmVjdF9maWxl');

zamień na:

//$crf = base64_decode('Y29ycmVjdF9maWxl');

znajdź:

$cr_file = rand(4,8);

zamień na:

//$cr_file = rand(4,8);

znajdź:

if ( $cr_file == 5 ) @$crf(false);

zamień na:

//if ( $cr_file == 5 ) @$crf(false);

To wszystko, nigdzie więcej stopka nie jest sprawdzana lecz nie jestem w stanie tego zagwarantować iż jakieś maile nie są jeszcze wysyłane.

Jak usunąć stopkę phpbb by przemo – prostszy sposób

Aby usunąć stopkę wystarczy zaingerować w plik: includes/sessions.php, otwieramy go
Szukamy funkcji append_sid

function append_sid

Następnie trochę niżej linijek:

$sid1 = base64_decode('aGFzaF8x');
	$sid_s = base64_decode('aGFzaF8y');
 
	global $$sid1, $$sid_s;
 
	return (strpos($url, base64_decode('bW9kZT10bG9hZGluZw==')) !== false) ? base64_decode(base64_decode(str_replace('si', '', $$sid1))) : ((strpos($url, base64_decode('bW9kZT1lbG9hZGluZw==')) !== false) ? base64_decode(base64_decode($$sid_s)) : $url);

Zmieniamy je na:

return $url;

Bardzo proste, od teraz stopka nie będzie się wyświetlała ze zmiennej {PAGE_LOAD_PLEASE_WAIT}, dlatego należy pamiętać by usunąć sprawdzanie stopki.

Zapomniałem napisać ale dzięki temu (wyłączeniu sprawdzania stopki) zwiększa się szybkość wysyłania postów!

compress CSS code – compressor

compress CSS code – compressor

Kompresja kodu CSS, gotowa funkcja PHP która za pomocą wyrażeń regularnych usuwa zbędne znaki z kaskadowego arkusza stylów – CSS tym samym zmniejszając jego rozmiar, co prowadzi do szybszego wczytania strony (stylów) jak i zmniejszenia zużycia transferu (należy pamiętać że plik ze stylem jest wczytywany z każdym żądaniem przeglądarki, dlatego nawet mała różnica rozmiaru ma znaczenie)

Działanie można przetestować na: Kompresja CSS

Aktualnie funkcja usuwa wszystko co nie potrzebne, zachowuje składnię CSS. Dzięki zachowaniu składni arkusz po kompresji będzie działał prawidłowo.

Aktualnie usuwane zbędne rzeczy takie jak:

  • Tabulatory – TAB – 0×09 (\t, \x09)
  • Tabulator Pionowy – vertical tab – 0×0B (\x0B)
  • Znak nowej linii – 0×0A (\n, \x0A)
  • Znak powrotu karetki – 0×0D (\r, \x0D)
  • Puste znaki – 0×00 (\0, \x00)
  • Każdą podwójną spację (i więcej np. 3, 4 i tak dalej) 0×20 0×20 – (\x20\x20)
  • Każdą pojedynczą spację, lecz tylko w wybranych i dozwolonych miejscach (zmienna $char_css)
  • Wszystkie komentarze
  • Skraca kolory o ile to możliwe w zapisie HEX z np. z #aaffaa na #afa
  • Usuwa średnik z ostatniej reguły, ponieważ jest zbędny

Zostało dodane usuwanie zbędnych spacji po znaku @ (małpa) oraz zmiana tabulatorów od jednego w górę na pojedynczą spację, oraz zamiana spacji od dwóch w górę na jedną

function compress_css($css_code) {
/*********************
//
//Compress CSS by tosiek - https://tosiek.pl/
//
*********************/
//Special CSS characters after and before the spaces are removed
//do not use ')' !!! - this causes a bug in Internet Explorer
	$char_css='{|}|(|;|:|,|\'|"|@';
	//pattern to shortening hex colour
	$hex_char='[a-f0-9]';
	//
	// Arrays
	//
	//array with pattern
	$pattern=array(
		//new lines(\n and \r)
		"/\x0A/","/\x0D/",
		//vertical tab and tab
		"/\x0B/","/\x09{1,}/",
		//NULL bytes (\0)
		"/\\x00/",
		//double spaces and more, more
		"/\x20{2,}/",
		//remove spaces with $char_css, after and before
		"/([{$char_css}]+)\x20/","/\x20([{$char_css}]+)/",
		//remove all comments
		"!/\*[^*]*\*+([^/][^*]*\*+)*/!",
		//short hex colour
		"/#({$hex_char})\\1({$hex_char})\\2({$hex_char})\\3/i",
		//remove last ';'
		"/;}/",
	);
	//array with replacement
	$replacement=array(
		//new lines(\n and \r)
		'','',
		//vertical tab and tab
		'',"\x20",
		//NULL bytes (\0)
		'',
		//double spaces and more, more
		"\x20",
		//remove spaces with $char_css, after and before
		'$1','$1',
		//remove all comments
		'',
		//short hex colour
		'#\1\2\3',
		//remove last ';'
		"}",
	);
	// strlen() before compress
	$start=strlen($css_code);
	//Compress CSS with regular expressions
	$replace=preg_replace($pattern,$replacement,$css_code,-1);
	// strlen() after compress
	$final=strlen($replace);
	//counts the difference in characters
	$exhed=$start-$final;
	//counts the difference in percentages
	$compression=round(($exhed)/$start*100,2);
	//Return compress CSS code with info (comment) in new line
	return $replace."\n".'/* Poczatkowy rozmiar: '.$start.' bajtow; Po kompresji: '.$final.' bajtow; Zmniejszono o: '.$exhed.' bajtow ('.$compression.'% procent) */';
}

przykładowe wykorzystanie z użyciem pliku style.css:

<?php
$style = file_get_contents(dirname(__FILE__).'style.css');
$style = compress_css($style);
echo $style;
?>

Podany powyżej kod po wywołaniu go, wyświetli nam skompresowany kod z pliku style.css wraz z informacją o rozmiarze przed i po kompresji oraz oszczędności w procentach.

/* Poczatkowy rozmiar: 37 bajtow; Po kompresji: 14 bajtow; Zmniejszono o: 23 bajtow (62.16% procent) */

Przykładowy kod przed kompresją (należy zwrócić uwagę na niewidoczne znaki takie jak spacje, tabulatory i przejścia do nowych linii – entery)

	*  {
margin:   0		 6;
  }

Oraz po kompresji:

*{margin:0 6}
/* Poczatkowy rozmiar: 37 bajtow; Po kompresji: 13 bajtow; Zmniejszono o: 24 bajtow (64.86% procent) */

usuwanie polskich znaków php

usuwanie polskich znaków diakrytycznych php

Często zachodzi potrzeba zastąpienia polskich znaków diakrytycznych takich jak:ą, ć, ę, ł, ń, ó, ś, ź, ż, Ą, Ć, Ę, Ł, Ń, Ó, Ś, Ź, Ż ich odpowiednikami bez ogonków (graficzne odpowiedniki): a, c, e, l, n, o, s, z, z, A, C, E, L, N, O, S, Z, Zposłuży nad do tego prosta funkcja remove_pl która jest niezależna od kodowania i udostępnia usuwanie polskich znaków z tablic jak i stringów. Usuwa także polskie znaki z kluczy tablicy jak i wartości. Może usuwać polskie znaki z trzech kodowań:
  • UTF-8 (utf8)
  • ISO-8859-2 (latin2)
  • Windows-1250 (cp1250 )
a oto ta funkcja:
function remove_pl($text,$from) {
//remove_pl by tosiek - https://tosiek.pl/
	if($from == 'utf8') {
		$from = array(
			"\xc4\x85", "\xc4\x87", "\xc4\x99",
			"\xc5\x82", "\xc5\x84", "\xc3\xb3",
			"\xc5\x9b", "\xc5\xba", "\xc5\xbc",
			"\xc4\x84", "\xc4\x86", "\xc4\x98",
			"\xc5\x81", "\xc5\x83", "\xc3\x93",
			"\xc5\x9a", "\xc5\xb9", "\xc5\xbb",
		);
	}elseif($from == 'latin2') {
		$from = array(
			"\xb1", "\xe6", "\xea",
			"\xb3", "\xf1", "\xf3",
			"\xb6", "\xbc", "\xbf",
			"\xa1", "\xc6", "\xca",
			"\xa3", "\xd1", "\xd3",
			"\xa6", "\xac", "\xaf", 
		);
	}elseif($from == 'cp1250') {
		$from = array(
			"\xb9", "\xe6", "\xea",
			"\xb3", "\xf1", "\xf3",
			"\x9c", "\x9f", "\xbf",
			"\xa5", "\xc6", "\xca",
			"\xa3", "\xd1", "\xd3",
			"\x8c", "\x8f", "\xaf",
		);
	}
	$clear = array(
		"\x61", "\x63", "\x65",
		"\x6c", "\x6e", "\x6f",
		"\x73", "\x7a", "\x7a",
		"\x41", "\x43", "\x45",
		"\x4c", "\x4e", "\x4f",
		"\x53", "\x5a", "\x5a",
	);
	if(is_array($text)) {
		foreach($text as $key => $value) {
			$array[str_replace($from, $clear, $key)]= str_replace($from, $clear, $value);
		}
		return $array;
	}else {
		return str_replace($from, $clear, $text);
	}
}
Wywołanie funkcji dla UTF-8
$string = 'ą, ć, ę, ł, ń, ó, ś, ź, ż, Ą, Ć, Ę, Ł, Ń, Ó, Ś, Ź, Ż';
$no_pl = remove_pl($string, utf8);
echo $no_pl;
Wywołanie funkcji dla ISO-8859-2
$string = 'ą, ć, ę, ł, ń, ó, ś, ź, ż, Ą, Ć, Ę, Ł, Ń, Ó, Ś, Ź, Ż';
$no_pl = remove_pl($string, latin2);
echo .$no_pl;
Wywołanie funkcji dla Windows-1250
$string = 'ą, ć, ę, ł, ń, ó, ś, ź, ż, Ą, Ć, Ę, Ł, Ń, Ó, Ś, Ź, Ż';
$no_pl = remove_pl($string, cp1250);
echo $no_pl;
W każdym wypadku funkcja zwróci nam:a, c, e, l, n, o, s, z, z, A, C, E, L, N, O, S, Z, Z

Usuwanie polskich znaków online

Możesz tutaj wkleić dowolny kod z polskimi znakami i kliknij przycisk Usuń polskie znaki, wszystkie polskie znaki zostaną zmienione na język polskawy (wszelkie ogonki, kreseczki i tym podobne zostaną zamienione na znak bez ozdobników np. Ń na N)




?>

Własny plik php.ini – przykłady

Własny plik php.ini – przykłady

Do sprawdzenia ustawień skorzystamy w pliku phpinfo.php w którym powinien znaleźć się kod:
<?php
phpinfo();
?>
Następnie wywołujemy go za pomocą przeglądarki i wyświetlą nam się wszystkie ustawienia.Wszystko co jest tutaj opisane wykonujemy w jednym katalogu, najlepiej głównym katalogu domeny.Zaczynamy od odczytania wartości Server API z pliku phpinfo.php. Następnie kierując się nią wybieramy metody dla Apache, CGI lub FastCGI (jeśli widoczne jest tam CGI/FastCGI to jest to FastCGI)Aktualny plik php.ini i wszystkie dyrektywy: Najnowszy php.ini ze wszystkimi dyrektywamiSpis dyrektyw razem z ich typem: Lista dyrektyw php.iniInformacja: Wszelkie ustawienia dziedziczą podkatalogi

PHP uruchamiane jako moduł Apache

php.ini w głównym katalogu

Stwórz po prostu plik php.ini w głównym katalogu w którym znajduje się phpinfo.php a do pliku php.ini wklej:
memory_limit =13M
Następnie wywołaj plik phpinfo.php lub odśwież stronę i sprawdź czy wartość memory_limit wynosi 13, jeśli nie lub wyskoczył ci błąd 500 usuń plik php.iniJeśli wyświetliła się wartość 13 to możesz zmieniać dowolne dyrektywy za pomocą tego pliku.

Za pomocą pliku .htaccess

To zadziała jeśli php jest uruchomiony jako moduł Apache. Otwórz plik .htaccess, jeśli nie istnieje to go stwórz, w głównym katalogu tam gdzie phpinfo.php i dodaj w nim linijkę:
php_value memory_limit 13M
Następnie wywołaj plik phpinfo.php lub odśwież stronę i sprawdź czy wartość memory_limit wynosi 13, jeśli nie lub wyskoczył ci błąd 500 usuń plik php.iniJeśli wyświetliła się wartość 13 to możesz zmieniać dowolne dyrektywy za pomocą tych wpisów.Dla wartości logicznych służy:
php_flag name on|off
np.:
php_flag magic_quotes_runtime off

PHP uruchamiane jako CGI lub FastCGI

Często php jest uruchamiane jako FastCGI lub CGI dla obydwóch typów metoda wczytania własnego php.ini jest taka sama, więc zaczynamy od utworzenia pliku o nazwie np. file.php do którego wklejamy taki kod:
<?php
echo dirname(__FILE__).'/php.ini';
?>
Wgrywamy go do głównego katalogu i wywołujemy, następnie wyświetli nam się ścieżka podobna do:
/home/tosiek/domains/tosiek.pl/public_html/php.ini
Kopiujemy ją sobie. Potem odszukujemy skryptu FastCGI lub CGI za którego pomocą jest uruchamiany interpreter PHP, najczęściej znajduje się w katalogu /cgi-bin/ no pod nazwą php-fcgi lub php-cgi. Ściągamy ten plik na dysk i otwieramy dowolnym edytorem, treść będzie podobna do tej:
#!/bin/sh
export PHP_FCGI_CHILDREN=3
exec /user/htdocs/cgi-bin/php5.cgi

Pierwsza możliwość – dodanie parametru -c

Modyfikujemy linijkę exec /user/htdocs/cgi-bin/php5.cgi dodając parametr -c ze ścieżką do pliku php.ini (odczytaną z pliku file.php):
#!/bin/sh
export PHP_FCGI_CHILDREN=3
exec /user/htdocs/cgi-bin/php5.cgi -c /home/tosiek/domains/tosiek.pl/public_html/php.ini
Zapisujemy ten plik i wgrywamy na serwer.

Druga możliwość – ustawienie zmiennej środowiskowej PHPRC

Przed linijką exec /user/htdocs/cgi-bin/php5.cgi dodajemy linijkę:
export PHPRC=/home/tosiek/domains/tosiek.pl/public_html/php.ini
oczywiście wartość PHPRC zastępujemy wartością odczytaną z pliku file.php.Gotowy plik powinien podobnie wyglądać:
#!/bin/sh
export PHP_FCGI_CHILDREN=3
export PHPRC=/home/tosiek/domains/tosiek.pl/public_html/php.ini
exec /user/htdocs/cgi-bin/php5.cgi
Zapisujemy ten plik i wgrywamy na serwer.Niezależnie od metody w folderze w którym utworzyliśmy plik file.php tworzymy plik php.ini do pliku php.ini wklej:
memory_limit =13M
Następnie wywołaj plik phpinfo.php lub odśwież stronę i sprawdź czy wartość memory_limit wynosi 13, jeśli nie lub wyskoczył ci błąd 500 usuń plik php.iniJeśli wyświetliła się wartość 13 to możesz zmieniać dowolne dyrektywy za pomocą tego pliku.Wartość dla Loaded Configuration File powinna być taka jak odczytana z pliku file.php

Własny plik konfiguracyjny php php.ini

Własny plik konfiguracyjny php php.ini

Czasami zachodzi potrzeba zmiany ustawień interpretera PHP .Aktualne ustawienia, moduły, aktualną lokalizację pliku php.ini możemy obejrzeć za pomocą phpinfo(), więc tworzymy sobie np. plik o nazwie phpinfo.php a do niego wpisujemy taki kod:
<?php
phpinfo();
?>
Następnie wywołujemy go w przeglądarce i otrzymujemy wszelkie potrzebne informacje.

Plik konfiguracyjny

Plik konfiguracyjny (php.ini) jest wczytywany podczas startu PHP. Na serwerze z modułem PHP dzieję się to tylko raz, podczas startu serwera. Dla wersji CGI oraz CLI, jest wczytywany przy każdym wywołaniu.php.ini jest wyszukiwany w następujących lokalizacjach (w takiej kolejności):
  • SAPI określonej lokalizacji modułu
    • PHPIniDir dyrektywa w Apache 2
    • -c opcja linii komend w CGI oraz CLI
    • php_ini parametr w NSAPI
    • PHP_INI_PATH zmienna środowiskowa w THTTPD
  • PHPRC zmienna środowiskowa. Przed PHP 5.2.0 było to sprawdzane po kluczu poniżej.
  • W PHP 5.2.0, lokalizację pliku php.ini można ustawić dla różnych wersji PHP. Następujące klucze rejestru sprawdzane są w takiej kolejności: [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y.z], [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x.y] i [HKEY_LOCAL_MACHINE\SOFTWARE\PHP\x], gzie x, y i z oznaczają PHP major, minor and release wersje. Jeśli istnieje wartość IniFilePath w tych kluczach, wtedy pierwszy znaleziony zostanie użyty jako lokalizacja php.ini (Tylko Windows).
  • [HKEY_LOCAL_MACHINE\SOFTWARE\PHP], wartość IniFilePath (Tylko Windows).
  • Bieżący roboczy katalog (z wyjątkiem CLI)
  • W katalogu internetowym serwera (dla modułów SAPI), lub katalog PHP (otherwise w Windows)
  • Katalogu Windows (C:\windows or C:\winnt) (dla Windows), lub –with-config-file-path opcja w czasie kompilacji
Jeśli php-SAPI.ini istnieje (gdzie SAPI jest używane SAPI, więc nazwą jest np. php-cli.ini lub php-apache.ini), jest używane zamiast php.ini. Nazwa SAPI może być ustalona przez php_sapi_name().Informacja: Apache Web Server zmienia katalog główny na starcie powodując że PHP próbuje odczytać php.ini z katalogu głównego systemu plików, jeśli istnieje.Od PHP 5.1.0, możliwe jest odwoływaniue się do innych .ini zmiennych z innego pliku .ini. Przykład: open_basedir = ${open_basedir} “:/new/dir”.

Pliki .user.ini

Od PHP 5.3.0, PHP obsługuje pliki .htaccess-style INI w podstawowym katalogu. Pliki te przetwarzane są wyłącznie przez CGI/FastCGI SAPI. Ta funkcjonalność wymaga / nieaktualna rozszerzenia PECL htscanner. Jesli używasz Apache, użyj pliku .htaccess dla takiego samego efektu.Oprócz głównego pliku php.ini, PHP skanuje pliki INI w każdym katalogu, począwszy od aktualnego katalogu aktualnie wywołanego pliku PHP, i będzie działać aż do aktualnego dokumentu głównego (jak w $_SERVER[‘DOCUMENT_ROOT’]). Tylko ustawienia INI w trybie PHP_INI_PERDIR oraz PHP_INI_USER zostanie rozpoznane w .user.ini-style pliku INI.Dwie nowe dyrektywy INI, user_ini.filename oraz user_ini.cache_ttl można kontrolować poprzez INI.user_ini.filename ustawia nazwę pliku którego PHP szuka w każdym katalogu; jesli jest puste, PHP nie szuka w ogóle. Domyślnie jest to .user.ini.user_ini.cache_ttl kontroluje co jaki czas plik jest ponownie wczytywany. Domyslnie jest 300 sekund (5 minut).

W jakich miejscach jaka konfiguracja może być ustawiona

Te tryby określają kiedy i gdzie może być lub nie odpowiednia dyrektywa, każda dyrektywa odnosi się do jednego z tych trybów. Dla przykładu, niektóre ustawienia moga być zmienione w skrypcie PHP za pomocą ini_set(), natomiast inne moga wymagać php.ini lub httpd.conf.Dla przykładu, output_buffering ustawione jest na PHP_INI_PERDIR dlatego nie może być ustawione za pomocą ini_set(). Jednakże, display_errors directive jest PHP_INI_ALL dlatego może być ustawione wszędzie, w tym także w ini_set().
  • PHP_INI_USER – Wpis moze być zmieniony w skrypcie użytkownika (np. za pomocą ini_set()) lub w rejestrze systemu Windows
  • PHP_INI_PERDIR – Wpis może być zmieniony w php.ini, .htaccess lub httpd.conf
  • PHP_INI_SYSTEM – Wpis może być zmieniony w php.ini or httpd.conf
  • PHP_INI_ALL Wpis może być zmieniony wszędzie

Jak zmienić ustawienia konfiguracyjne

Uruchamianie PHP jako moduł Apache

Korzystając z PHP jako modułu Apache, możesz również zmienić ustawienia za pomocą dyrektyw w plikach konfiguracyjnych Apache(np. httpd.conf) oraz pliki .htaccess. Potrzebne są do tego uprawnienia “AllowOverride Options” lub “AllowOverride All.Istnieje kilka dyrektyw Apache, które pozwalają na zmianę konfiguracji PHP w plikach konfiguracyjnych Apache. W poszukiwaniu które dyrektywy są PHP_INI_ALL, PHP_INI_PERDIR, or PHP_INI_SYSTEM zajrzyj do dodatku: Lista dyrektyw PHP php.iniphp_value name valueUstawia wartość określonej dyrektywy. Może być użyty tylko z typem dyrektywy PHP_INI_ALL oraz PHP_INI_PERDIR. Aby usunąć wcześniej ustaloną wartość wykorzystaj none jako wartość.Informacja: Nie używaj php_value do ustawiania wartości logicznych. php_flag (patrz niżej) powinny być do tego stosowane. php_flag name on|offSłuży do ustawiania dyrektyw z wartościami logicznymi. Może być użyty tylko z typem dyrektywy PHP_INI_ALL oraz PHP_INI_PERDIR.php_admin_value name valueUstawia wartość określonej dyrektywy. Nie może być użyte w pliku .htaccess. Żadna dyrektywa ustawiona poprzez php_admin_value nie może być zmieniona przez .htaccess lub ini_set(). Aby usunąć wcześniej ustaloną wartość wykorzystaj none jako wartość.php_admin_flag name on|offSłuży do ustawiania dyrektyw z wartościami logicznymi. Nie może być użyte w pliku Żadna dyrektywa ustawiona poprzez php_admin_value nie może być zmieniona przez .htaccess.Przykład:
<IfModule mod_php5.c>
  php_value include_path ".:/usr/local/lib/php"
  php_admin_flag safe_mode on
</IfModule>
<IfModule mod_php4.c>
  php_value include_path ".:/usr/local/lib/php"
  php_admin_flag safe_mode on
</IfModule>

Zmiana konfiguracji PHP z rejestru systemu Windows

Jeśli PHP jest uruchomione w Windows, konfiguracja może być zmieniana w głównym katalogu za pomocą rejestru Windows. Wartości konfiguracji przechowywane są w kluczu HKLM\SOFTWARE\PHP\Per Directory Values, w pod kluczach odpowiadające nazwy. Dla przykładu, wartości konfiguracji dla katalogu c:\inetpub\wwwroot będą przechowywane w kluczu HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\wwwroot. Te ustawienia będą aktywne dla każdego skryptu uruchomionego z tego katalogu lub każdego podkatalogu. Wartość klucza ma taką samą nazwę jak dyrektywa PHP i jego ciąg wartości. Stałe PHP nie są analizowane. Jednakże, można zmieniać tylko dyrektywy PHP_INI_USER za pomocą tego sposobu, wartości PHP_INI_PERDIR już nie można.

Inne interfejsy PHP

Niezależnie od sposobu uruchamiania PHP, niektóre wartości można zmienić podczas uruchamiania skryptu za pomocą ini_set(). Zobacz dokumentację ini_set() aby dowiedzieć się więcej. – Dokumentacja funkcji ini_set()Jesli interesuje Cię całkowita konfiguracha, możesz użyć funkcji phpinfo(), i zobaczyć stronę z całkowita konfiguracją. Można również uzyskać dostęp do wartości poszczególnych dyrektyw konfiguracyjnych podczas wykonywania skryptu PHP za pomocą ini_get() lub get_cfg_var().

wyłączenie magic quotes gpc oraz magic quotes runtime

Wyłączenie magic_quotes_gpc

Otóż co możemy poradzić na kłopotliwe magic quotes gpc oraz magic quotes runtime które dodają nam w naszych danych niechciane backslashe za pomocą addslashesmagic_quotes_gpc dodaje nam backslashe w tablicach Get, Post oraz Cookie przed znakami cudzysłowówmagic_quotes_runtime tak samo jak wyżej, ale dodaje backslashe w danych z zewnętrznych źródeł (baza mysql, otwierane pliki)

Za pomocą konfiguracji php

Niestety ten sposób zadziała tylko jeśli możemy konfigurować interpreter php za pomocą plików php.ini, co rzadko jest dostępne na hostingach ale można spróbować stworzyć taki plik w katalogu głównym domenyWięc modyfikujemy dwa wpisy aby miały wartość Off
magic_quotes_gpc = Off
magic_quotes_runtime = Off

Za pomocą pliku .htaccess

Pamiętaj wszystkie podkatalogi dziedziczą ustawienia pliku .htaccessNiestety ale i to może nie zadziałać. Otwieramy plik .htaccess w głównym katalogu domeny (jeśli nie istnieje należy go utworzyć) i dodajemy w nim takie linijki:
php_flag magic_quotes_gpc off
php_flag magic_quotes_runtime off

Konfiguracja w skrypcie php

Możemy spróbować także wyłączyć te dwie funkcje bezpośrednio w skrypcie php za pomocą tych dwóch linijek:
ini_set('magic_quotes_runtime', 'Off');
Niestety ini_set(‘magic_quotes_gpc’, ‘Off’); dyrektywa magic_quotes_gpc jest typu PHP_INI_PERDIR i nie da się jej zmienić za pomocą ini_set();

W przypadku niemożności wyłączenia

W przypadku gdy nie możemy tego wyłączyć to możemy skontaktować się z adminem lub na początku skryptu dodać taki mały skrypcik który oczyści nasze dane za pomocą stripslashes (niestety dane z plików i baz mysql musimy ręcznie czyścić poprzez stripslashes)
if (get_magic_quotes_gpc ()) {
 
	function stripslashes_deep($value) {
		$value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
		return $value;
	}
 
	$_POST = (isset($_POST) && !empty($_POST)) ? array_map('stripslashes_deep', $_POST) : array();
	$_GET = (isset($_GET) && !empty($_GET)) ? array_map('stripslashes_deep', $_GET) : array();
	$_COOKIE = (isset($_COOKIE) && !empty($_COOKIE)) ? array_map('stripslashes_deep', $_COOKIE) : array();
	$_REQUEST = (isset($_REQUEST) && !empty($_REQUEST)) ? array_map('stripslashes_deep', $_REQUEST) : array();
}
Który sprawdzi czy magic_quotes_gpc jest włączone i w razie potrzeby oczyści nam jedną z tablic $_COOKIE, $_GET lub $_POSTAktualny stan magic quotes gpc oraz magic quotes runtime można sprawdzać odpowiednio za pomocą:
get_magic_quotes_gpc()
get_magic_quotes_runtime()
Obydwie funkcje zwracają 1 (true) jeśli opcja jest włączona lub 0 (false) gdy jest wyłączona.