Вечните проблеми с header...

streleca_stz

Registered
Здравейте! Написах една обикновена страница за потребителите си, но не мога да разбера защо не се изпълнява част от кода.. ето го малко осъкатен вариант (това което мисля, че ще е от полза, а не да задръствам форума)
PHP:
<?php
$queryString = strtolower($_SERVER['QUERY_STRING']);
if (strstr($queryString,"<") OR strstr($queryString,">") OR strstr($queryString,"(") OR strstr($queryString,")") OR
strstr($queryString,"..") OR
strstr($queryString,"%") OR
strstr($queryString,"*") OR
strstr($queryString,"+") OR
strstr($queryString,"!") OR
strstr($queryString,"@")) {
	$loc = $_SERVER['PHP_SELF'];
	$ip = $_SERVER['REMOTE_ADDR'];
	$date = date ("d-m-Y @ h:i:s");
	$lfh = "../log.txt";
	$log = fopen ( $lfh,"a+" );
	fputs ($log, "Attack Date: $date | Attacker IP: $ip | QueryString: $loc?=$queryString\n");
	fclose($log);
	echo "You are wasting your time..."; exit;
}

require '../functions.php';
db_init();
ban_system();

	$page = isset($_GET['user_id'])? intval($_GET['user_id']) : 0;
	$query = mysql_query("SELECT user_id, username, rank, email, avatar, skype, icq, name, city, gender, site, description, date, timestamp, signature FROM users WHERE user_id = '$page'") or die (mysql_error());
	$user = mysql_fetch_assoc($query);
	
	if($_GET['page'] == "viewVideos")
	{
		bg_header('Всички Видеа');
		      //showing info
		bg_footer();
	}
	if($_GET['page'] == "viewPhotos")
	{
		bg_header('Всички Снимки');
		      //showing info
		bg_footer();
	}
	if($_GET['page'] == "viewTexts")
	{
		bg_header('Всички Текстове');
		      //showing info
		bg_footer();
	}
	else
	{
		header('Location: members.php');
		exit;
	}
?>
Пример за линковете: info.php?page=viewVideos&user_id=1... А ето го и предупреждението което ми показва:
Warning: Cannot modify header information - headers already sent by (output started at /home/tokiohot/public_html/functions.php:255) in /home/tokiohot/public_html/bg/userInfo.php on line 337
И не мога да разбера как да го оправя :S
 
PHP:
<?php

$queryString = strtolower($_SERVER['QUERY_STRING']);
if (strstr($queryString, "<") OR strstr($queryString, ">") OR strstr($queryString, "(") OR strstr($queryString, ")") OR
        strstr($queryString, "..") OR
        strstr($queryString, "%") OR
        strstr($queryString, "*") OR
        strstr($queryString, "+") OR
        strstr($queryString, "!") OR
        strstr($queryString, "@")) {
    $loc = $_SERVER['PHP_SELF'];
    $ip = $_SERVER['REMOTE_ADDR'];
    $date = date("d-m-Y @ h:i:s");
    $lfh = "../log.txt";
    $log = fopen($lfh, "a+");
    fputs($log, "Attack Date: $date | Attacker IP: $ip | QueryString: $loc?=$queryString\n");
    fclose($log);
    echo "You are wasting your time...";
    exit;
}

require '../functions.php';
db_init();
ban_system();

$page = isset($_GET['user_id']) ? intval($_GET['user_id']) : 0;
$query = mysql_query("SELECT user_id, username, rank, email, avatar, skype, icq, name, city, gender, site, description, date, timestamp, signature FROM users WHERE user_id = '$page'") or die(mysql_error());
$user = mysql_fetch_assoc($query);

if ($_GET['page'] == "viewVideos") {
    bg_header('Всички Видеа');
    //showing info
    bg_footer();
}
if ($_GET['page'] == "viewPhotos") {
    bg_header('Всички Снимки');
    //showing info
    bg_footer();
}
if ($_GET['page'] == "viewTexts") {
    bg_header('Всички Текстове');
    //showing info
    bg_footer();
} else {
    ob_start();
    header('Location: members.php');
    ob_end_flush();
    exit;
}
?>

Пробвай така. Дано да ти помогне ;)
 
t0shk0 каза:
PHP:
<?php

$queryString = strtolower($_SERVER['QUERY_STRING']);
if (strstr($queryString, "<") OR strstr($queryString, ">") OR strstr($queryString, "(") OR strstr($queryString, ")") OR
        strstr($queryString, "..") OR
        strstr($queryString, "%") OR
        strstr($queryString, "*") OR
        strstr($queryString, "+") OR
        strstr($queryString, "!") OR
        strstr($queryString, "@")) {
    $loc = $_SERVER['PHP_SELF'];
    $ip = $_SERVER['REMOTE_ADDR'];
    $date = date("d-m-Y @ h:i:s");
    $lfh = "../log.txt";
    $log = fopen($lfh, "a+");
    fputs($log, "Attack Date: $date | Attacker IP: $ip | QueryString: $loc?=$queryString\n");
    fclose($log);
    echo "You are wasting your time...";
    exit;
}

require '../functions.php';
db_init();
ban_system();

$page = isset($_GET['user_id']) ? intval($_GET['user_id']) : 0;
$query = mysql_query("SELECT user_id, username, rank, email, avatar, skype, icq, name, city, gender, site, description, date, timestamp, signature FROM users WHERE user_id = '$page'") or die(mysql_error());
$user = mysql_fetch_assoc($query);

if ($_GET['page'] == "viewVideos") {
    bg_header('Всички Видеа');
    //showing info
    bg_footer();
}
if ($_GET['page'] == "viewPhotos") {
    bg_header('Всички Снимки');
    //showing info
    bg_footer();
}
if ($_GET['page'] == "viewTexts") {
    bg_header('Всички Текстове');
    //showing info
    bg_footer();
} else {
    ob_start();
    header('Location: members.php');
    ob_end_flush();
    exit;
}
?>

Пробвай така. Дано да ти помогне ;)

И така пак показва същото предупреждение.. А ако сложа ob_start(); в началото на страницата ме редиректва към members.php и все едно условията не са изпълнени..
 
webdeveloper каза:
Защо не ползваш elseif?

А защо не ползва switch() {} ?? От дървени по-дървени варианти.


PHP:
require '../functions.php';

db_init();

ban_system();



$page = isset($_GET['user_id']) ? intval($_GET['user_id']) : 0;

$query = mysql_query("SELECT user_id, username, rank, email, avatar, skype, icq, name, city, gender, site, description, date, timestamp, signature FROM users WHERE user_id = '$page'") or die(mysql_error());

$user = mysql_fetch_assoc($query);


$available = array('viewPhotos' => 'Всички снимки',
					'viewTexts' => 'Всички текстове',
					'viewVideos' => 'Всички видеа');

$uri = isset($_GET['page']) ? $_GET['page'] : 'index';					

switch(array_key_exists($uri, $available)){

	case $uri:
		bg_header($available[$uri]);
		#Някаква информация
		bg_footer();
	break;
	
	default:
		header('Location: members.php');
	break;

}

?>

И защо ти е да спираш цяло изпълнение на код при XSS атака ? Когато вкарваш в база данни или ползвай PDO или mysql_real_escape_string(), ако ползваш mysql_ функциите.
Когато извеждаш на екрана просто премахвай всякакъв HTML

PHP:
function strip_html($value)
{
        if(preg_match("@(\<(/?[^\>]+)\>)@i", $value)){
            $value = NULL;
        }
                     
        return $value;
}

$_GET = array_map("strip_html", $_GET);
$_POST = array_map("strip_html", $_POST);

Според мен няма смисъл да спираш работата на потребителите. Просто им покажи, че нищо няма да стане при XSS.
 

Back
Горе