Дупки в сайта и защити срещу тях

Ozka

Registered
Здравейте,
едно момче ми каза че имам много дупки в сайта и ми изпрати това
Код:
ID Unknow column "55"
SQL: Order by 55--
drugo nqma kvo da pi6a
hackerski team sme,sp0x nqma da ti atakuwame saita
prosto pomagame
;)
Union sucessful !
SQL: union select 1,2,3.../../../../../all * db(mysql_socks);

<<<
Какво мога да направя за защита и има ли програми за да вида къде са тези дупки или там какво са?
Благодаря!
 
това значи, че имаш 55 таблици WOW :D :D и, че лесно може да ти изведе паролата, спасението ти е да правиш проверка на ид дали е числова стойност и ако не е .. ето пример :

Код:
$id=(int)$_GET['id'];
$id=abs($id);
$id=htmlspecialchars(addslashes(trim($id)));

if ($id < 1)
{
echo "Грешка !";
}
else
{
//Твоя код тук
}
 
Ами това е SQL Injection. Те са около пет вида, познати на мен, но най-лесно можеш да се защитиш с addslashes() функцията. Тоест с нея филтрираш входящата и изходяща информация. Ако имаш id в $_GET като параметър, проверяваш го дали е число или кастваш с int().

Има алтернатива на аddslashes, това е mysql_real_escape_string. И не на последно място, най-добрата защита са prepared statements.
 
Ако използваш PHP5, използвай PDO Prepared Statements! С него ще забравиш за всякакви SQL Injection-и.
PDO е вграден модул на PHP5. PDO върши всичкото ескейпване вместо теб. Ти само казваш какъв е параметъра стринг или число.
http://bg2.php.net/pdo :?:
 
Може ли да ми дадете примери
какво как да се промени и т.н , защото не разбирам много много от PHP
 
Така се прави възката към сървъра:
Код:
$dsn = 'mysql:dbname=име на базата данни;host=хост';
$user = 'потребител';
$password = 'парола';

$dbh = new PDO($dsn, $user, $password);

А тук виж различните примери за работа с PDO::prepare и PDOStatement::bindParam
:?:
 
Код:
$user = "root";
$pass = "password";
$db = "baza";
$host = "localhost";
$connection = mysql_connect($host, $user, $pass);
$db = mysql_select_db($db,$connection);

направих така?

Код:
$dsn = 'mysql:dbname=baza;host=localhost';
$user = 'root';
$password = 'password';

$dbh = new PDO($dsn, $user, $password);
 
Да ето и една примерна заявка как се прави:
(извадих го от един скрипт за регистрация, който писах наскоро)
Код:
$sql = "INSERT INTO users(username,password,email)VALUES(:username,:password,:email)";
$insert = $dbh -> prepare( $sql );
$insert -> bindParam( ':username', $username, PDO::PARAM_STR );
$insert -> bindParam( ':password', $password, PDO::PARAM_STR );
$insert -> bindParam( ':email', $email, PDO::PARAM_STR );
$status = $insert -> execute();
if($status === true){
echo 'OK';
}else{
echo 'NOT OK';
}

а ако искаш да изпълниш някаква проста заявка, която не съдържа данни получени от потребителя правиш така:
Код:
$status = $dbh -> query($sql);
Вече там си разгледай менюъла за другите функции. На български е и е добре обяснено всичко :?:
 

Back
Горе