Дупка от $_GET

peiN

Registered
Значи в сайта имам дупка от $_GET, но не е число а текст, примерно index.php?име=peiN. Как да я оправя?
 
Проверяваш дали има специални знаци и ако има задаваш default стойност. Също така може да сложиш и максимална дължина за GET ..
 
Какво точно имаш в предвид с това дупка в сайта ?
Ето ти два начина за страници където няма да имаш дупка:

PHP:
<?php
$ime = htmlspecialchars($_GET['ime']);
switch($ime)
{
default:
echo "home page";
break;
case 'peiN'
echo "peiN page";
break;
}
?>

или

PHP:
<?php
$ime = htmlspecialchars($_GET['ime']);
if ($ime == "peiN")
{
echo "peiN page";
}
else
{
echo "home page";
}
?>
 
Просто валидираш името,проверяваш дали съществува и т.н. Ето една проста проверка, която прави чудеса:

PHP:
<?php
$name = $_GET['name'];
$row= mysql_query('SELECT * FROM table WHERE name="'.$name.'"');
if(mysql_num_rows($row)==1)
{
 echo 'okey';
}
else
{
 echo 'go f**k yourself';
}
?>
 
xmmm каза:
Просто валидираш името,проверяваш дали съществува и т.н. Ето една проста проверка, която прави чудеса:

PHP:
<?php
$name = $_GET['name'];
$row= mysql_query('SELECT * FROM table WHERE name="'.$name.'"');
if(mysql_num_rows($row)==1)
{
 echo 'okey';
}
else
{
 echo 'go f**k yourself';
}
?>

Наистина може да направи чудеса, като например да изведе всички записи от таблицата.
 
xmmm каза:
Просто валидираш името,проверяваш дали съществува и т.н. Ето една проста проверка, която прави чудеса:

PHP:
<?php
$name = $_GET['name'];
$row= mysql_query('SELECT * FROM table WHERE name="'.$name.'"');
if(mysql_num_rows($row)==1)
{
 echo 'okey';
}
else
{
 echo 'go f**k yourself';
}
?>

Ами представи си,че пусне адна SQL инжекция. Тогава ко правим ? :)
 
relax4o каза:
xmmm каза:
Просто валидираш името,проверяваш дали съществува и т.н. Ето една проста проверка, която прави чудеса:

PHP:
<?php
$name = $_GET['name'];
$row= mysql_query('SELECT * FROM table WHERE name="'.$name.'"');
if(mysql_num_rows($row)==1)
{
 echo 'okey';
}
else
{
 echo 'go f**k yourself';
}
?>

Наистина може да направи чудеса, като например да изведе всички записи от таблицата.

Ако го пренасочиш няма как да ги изтегли, трябва просто да помислиш малко :) И + това, защо ще му е на някои потребителски имена ?
 
xmmm каза:
relax4o каза:
xmmm каза:
Просто валидираш името,проверяваш дали съществува и т.н. Ето една проста проверка, която прави чудеса:

PHP:
<?php
$name = $_GET['name'];
$row= mysql_query('SELECT * FROM table WHERE name="'.$name.'"');
if(mysql_num_rows($row)==1)
{
 echo 'okey';
}
else
{
 echo 'go f**k yourself';
}
?>

Наистина може да направи чудеса, като например да изведе всички записи от таблицата.

Ако го пренасочиш няма как да ги изтегли, трябва просто да помислиш малко :) И + това, защо ще му е на някои потребителски имена ?

Значи първо... не имена, а пароли. И от тук може да ти изтрие цялата база
 
Може само
$row= mysql_query('SELECT name FROM table WHERE name="'.$name.'"');
и след това
if(mysql_num_rows($row) != 0) {
......................

А и обяснете как могат да се направят SQL инжекции в този пример
 
Не можеш да направиш, ти не изкарваш никъде резултатите от тази заявка, просто правиш проверка.
 
nbacool2 каза:
Да и аз това се чудех. Щом няма input полета, значи няма откъде да се направи SQL инжекция :D

Караш ме да цитирам един потребител от един друг форум

заради такива програмисти няма да ни бъде

макар че тука тази дума е силно казана.

Това, че няма input полета не значи, че не може да се направи SQL инжекция. Явно ти си чувал само за инжекции чрез ПОСТ заявки.
Както виждаш автора взима по ГЕТ метода.

А @xmmm понеже, както викаш "просто трябва да се мисли", ами да трябва да се мисли. Кой ти говори за имена? @StormBreaker ти го каза, не имената му трябват на някой, а паролите. А защо не и по лошото да изтрие цялата база данни или просто да я "почисти" с TRUNCATE ?

И сега най-интересното е някой да обади със следващата защита

PHP:
addslashes(htmlspecialchars($_GET['name'])

Разберете, че винаги трябва да знаете къде отива даден метод. Ако се извежда на екрана, разбира се, че на дадения метод ще трябва да му се махне HTML-а, ако има такъв.

Ако ще влиза в заявка, задължително трябва да му се ескейпнат кавичките(в случай, че някой се мъчи да са прави на хакер), като най-удачен вариант е mysql_real_escape_string() , ако работите с mysql функциите. Ако не, се препоръчва mysqli или PDO, защото са в пъти по-надеждни и няма нужда от разни шмекерии, за да се предпазите. Prepare ви прави всичко.

Друг е въпроса, кой как ще си валидира данните. Това, че се правят проверки за злорадски пратени данни, не значи, че това ви е спасило напълно, за това е хубаво да "контролирате парада". :)
 
Ако няма такива методи, значи няма динамика в цялата работа. Все едно си пишеш чист HTML с PHP функции. Ако ги няма методите значи администратора трябва да му кажат кое име иска да се види и просто да промени този код:

PHP:
$query = mysql_query("SELECT * FROM `table` WHERE `name` = 'pein'; ");

като заменя pein с други имена. И така вече наистина няма как да направиш инжекция. :)
 
Кажете как да се справа с тази SQLi.
PHP:
<?php
header("Content-type: image/png; charset=UTF-8");
include "config.php";
$image = imagecreatefrompng("deathrun.png");

$black=imagecolorallocate($image, 0, 0, 0);
$fontsize = 5;
$username = mysql_real_escape_string($_GET['name']);
if($username != $connect[name])
$username2=$_GET['name'];
$sql=mysql_query("SELECT * FROM `connections_rank` WHERE `name`='$username'");
$sql2=mysql_query("SELECT * FROM `drm_lifes` WHERE `name`='$username2'");
$connect = mysql_fetch_array($sql);
if($username != $connect[name]){
echo "hui";
}
....
 

Back
Горе