защитата ми не работи.

sentenello

Registered
Здравейте.
Направих ето така, за да защитя от пробиви, но пак успява да се бъгне.
ето го и самия код.

Код:
if (isset($_POST['submit'])) {
foreach ($_POST['chasa'] AS $id => $chaso) {

$ligata = htmlspecialchars(addslashes($_POST['pyrvenstvoto'][$id]));
$matcha = htmlspecialchars(addslashes($_POST['sreshtata'][$id]));
$zalogo = htmlspecialchars(addslashes($_POST['zalog'][$id]));
$datata = htmlspecialchars(addslashes($_POST['data'][$id]));
$golovedomakin = trim(intval($_POST['gold'][$id]));
$golovegost = trim(intval($_POST['golg'][$id]));
$ztochki = trim(intval($_POST['tochki'][$id]));
if ($zalogo == 1) {
$pkoef = trim(intval($_POST['koef1'][$id]));
}else if ($zalogo == X) {
$pkoef = trim(intval($_POST['koefx'][$id]));
}else if ($zalogo == 2) {
$pkoef = trim(intval($_POST['koef2'][$id]));
}

ето и как го вкарвам в БД
Код:
$ligata = mysql_real_escape_string($ligata); 
$chaso = mysql_real_escape_string($chaso); 
$matcha = mysql_real_escape_string($matcha); 
$zalogo = mysql_real_escape_string($zalogo); 
$resultato = mysql_real_escape_string($resultato); 
$useraa = mysql_real_escape_string($useraa); 
$id = mysql_real_escape_string($id); 
$datata = mysql_real_escape_string($datata); 
$pkoef = mysql_real_escape_string($pkoef); 
$ztochki = mysql_real_escape_string($ztochki); 
$month = mysql_real_escape_string($month); 

$queryto = mysql_query("INSERT INTO userbets (league,chas,matcha,prognoza,resultat,tipster,matchid,data,pkoef,zalogtochki,month) VALUES ('$ligata','$chaso','$matcha','$zalogo','$resultato','$useraa','$id','$datata','$pkoef','$ztochki','$month')")or die(mysql_error());
 
5 реда код ти обезопасяват всички данни наведнъж - няма смисъл за всеки елемент да го прилагаш отделно.

Код:
<?php
foreach($_POST as $key => $value)
{
	if(!is_numeric($_POST[$key]))
		$_POST[$key] = htmlspecialchars(addslashes(rtrim(trim($value))));
}
?>

Слагаш най-отгоре в страницата и това е.. Можеш да промениш $_POST и на $_GET, $_SESSION, $_COOKIE и т.н.
 
Направи го така:


Код:
	 $queryto = mysql_query("INSERT INTO userbets (league,chas,matcha,prognoza,resultat,tipster,matchid,data,pkoef,zalogtochki,month) VALUES ('".mysql_real_escape_string($ligata)."','".mysql_real_escape_string($chaso)"','".mysql_real_escape_string($matcha)"','".mysql_real_escape_string($zalogo)"','".mysql_real_escape_string($resultato)"','".mysql_real_escape_string($useraa)"','".mysql_real_escape_string($id)"','".mysql_real_escape_string($datata)"','".mysql_real_escape_string($pkoef)"','".mysql_real_escape_string($ztochki)"','".mysql_real_escape_string($month)"')")or die(mysql_error());
 
Правиш си функция:


Код:
function sec($text) 
{
	$text = htmlspecialchars($text);
	$text = addslashes($text);
	return $text;
}


и всяка променлива за вход я правиш така:


Код:
$name=sec($_POST['name']);
 
Не разбирам изобщо как успявате да се оправите с толкова омазани данни в базата данни.

Правите си preg_match който пуска само a-zA-Z0-9, после един mysql_real_escape_string и всичко е на 6.

После htmlspecialchars се използва за визуализиране на данни !
 
Soul_Stealler каза:
Не разбирам изобщо как успявате да се оправите с толкова омазани данни в базата данни.

Правите си preg_match който пуска само a-zA-Z0-9, после един mysql_real_escape_string и всичко е на 6.

После htmlspecialchars се използва за визуализиране на данни !

След толкова много отговори мисля, че ще успея да се справя, ако ли не пак ще пиша :)
 
А какво мислите за това:
Код:
<?php
$_POST = array_map('strip_tags', $_POST);
$_GET = array_map('strip_tags', $_GET);
?>
Това също може да предпази ? Най - добре е да си направиш една функция със защитата и да филтрираш полетата през нея. Нещо подобно е дадено в по - горен пост.
 
PHPclown каза:
Направи го така:


Код:
	 $queryto = mysql_query("INSERT INTO userbets (league,chas,matcha,prognoza,resultat,tipster,matchid,data,pkoef,zalogtochki,month) VALUES ('".mysql_real_escape_string($ligata)."','".mysql_real_escape_string($chaso)"','".mysql_real_escape_string($matcha)"','".mysql_real_escape_string($zalogo)"','".mysql_real_escape_string($resultato)"','".mysql_real_escape_string($useraa)"','".mysql_real_escape_string($id)"','".mysql_real_escape_string($datata)"','".mysql_real_escape_string($pkoef)"','".mysql_real_escape_string($ztochki)"','".mysql_real_escape_string($month)"')")or die(mysql_error());

Ако се направи със stringf мисля че ще е по добре :)
 
PHPclown каза:
Направи го така:


Код:
	 $queryto = mysql_query("INSERT INTO userbets (league,chas,matcha,prognoza,resultat,tipster,matchid,data,pkoef,zalogtochki,month) VALUES ('".mysql_real_escape_string($ligata)."','".mysql_real_escape_string($chaso)"','".mysql_real_escape_string($matcha)"','".mysql_real_escape_string($zalogo)"','".mysql_real_escape_string($resultato)"','".mysql_real_escape_string($useraa)"','".mysql_real_escape_string($id)"','".mysql_real_escape_string($datata)"','".mysql_real_escape_string($pkoef)"','".mysql_real_escape_string($ztochki)"','".mysql_real_escape_string($month)"')")or die(mysql_error());

За жалост и това не свърши работа ..
 
Soul_Stealler каза:
Не разбирам изобщо как успявате да се оправите с толкова омазани данни в базата данни.

Правите си preg_match който пуска само a-zA-Z0-9, после един mysql_real_escape_string и всичко е на 6.

После htmlspecialchars се използва за визуализиране на данни !

Ако обясниш малко по-подробно кога да го използвам прег-мача и реал_ескейп... няма въобще да ти се разсърдя :)
 
Всяка променлива, до чиято стойност има достъп потребителя гледай да минаваш през preg_match. Ако я вкарваш в дб добавяш и mysql_real_escape_string.

Ако имаш примерно $_GET променлива, която ти е само от цифри, ползваш 0-9, т.е. гледаш какви стойности има и ги слагаш в regex-a на preg_match.


Като изкарваш нещо от базата данни и искаш да ти се визуализира в сайта ползваш htmlspecialchars ENT_QUOTES
 
Soul_Stealler каза:
Всяка променлива, до чиято стойност има достъп потребителя гледай да минаваш през preg_match. Ако я вкарваш в дб добавяш и mysql_real_escape_string.

Ако имаш примерно $_GET променлива, която ти е само от цифри, ползваш 0-9, т.е. гледаш какви стойности има и ги слагаш в regex-a на preg_match.


Като изкарваш нещо от базата данни и искаш да ти се визуализира в сайта ползваш htmlspecialchars ENT_QUOTES

Може ли да дадеш някви прости примери...
 
Код:
function is_num($var)
{
	if(preg_match('/^[0-9]+$/', $var))
	{
		return $var;
	}
	else
	{
		return FALSE;
	}
}

$var = '1312341234123412341234213421';

echo is_num($var);

ако не е само цифри, нищо няма да ти изпише
 
Първо си оправи POST и GET методите защото така на в суров вид са си бомба с закъснител първия пробив е там. Втория пробив се оправя лесно:
Код:
function __sql_replace($sql_query) {
	return strtr($sql_query, array("\\" => "\\\\", "'" => "\\'"
		, "\"" => "\\\"", "`" => "\\`", "\t" => "\\t"
		, "\r" => "\\r", "\n" => "\\n", "\x00" => "\\0"
		, "\x1A" => "\\Z")
	);
}
 
Аз извличам от БД-то информацията и го извеждам в таблица където има select полета в който може да се избира от 0 до 10.

Когато даден потребител избере от 0 до 10 и даде прогнозирай, вземам всяко едно поле поотделно и го вкарвам в нова БД.
Отборите който извеждам от първото БД ги променя и във втората БД влизат както ги е променил.

Примерно имам.
Челси - Арсенал 1.50 коефициент резултат 10-5

Той вкарва.
Челсиииии - Арсенал5 5.00 коефициент резултат 15 -15

Как променя тези полета който се извличат от БД, и тези който имат максимално избиране 10,а той ги прави 15.
 

Back
Горе