Как мога да проверя сайта за дупки

chepa

Registered
Сканирах го с една програма, но искам да съм 100% сигурен, че няма да има дупки. Тя намери 1 - 2 "SQL Injection"-на и ги оправих, но все си мисля, че има нещо. Така ми дойде и на идея да попитам вие как си проверявате сайтовете за дупки ? :oops:
 
Незнам за програми, но когато пишеш заявки, използвай PDO и prepare заявките със bindparam();

Когато показваш някъде по сайта, информация въведена от потребителя имаш 2 опции:

1. htmlspecialchars.
2. Регулярен израз, с който заменяш/забраняваш/премахваш отделни групи символи.

Защитавай си сесиите като хешираш ид - то и го записваш във база данни и после правиш проверки, (точно ей това незнам как ще го хване програмата, като тя най - вероятно няма достъп до базата данни).

Друго пиши подреден код и си води логове.

Не използвай JS и Бисквитки за нищо сериозно. Тях единствено само за улеснение на потребителя ги използвай. Винаги трябва да има алтернатива на тях.

Води си една сесия, с която ще засичаш времето между кликовете на даден потребител и ако надвишава нивото, тогава го записвай във базата данни и му блокирай сайта за 1 - 2 секунди да се осъзнае. И на тези хора ИП - та им ги записвай във някой лог и разбира се ще си го следиш, това с цел някой да не флооди. Разбира се флоода до някъде се контролира и от самия хост.

Използвай Exception.

Също така използвай и кеширане.

Ако кода ти е подреден и има възможно най - малко дублиране на код, много лесно сам ще си откриеш дупка, ако има такава. Разгледай за MVC.

А и си прави Unit Test, така ще тестваш абсолютно всеки елемент от кода, като хардкодваш различна информация за обработка.
 
За това с PDO и Prepare, ако имам заявка примерно

PHP:
  $mysql_db = mysql_query("SELECT * FROM `banlist` WHERE `kraen_srok` != 0") or die(mysql_error());

Как точно трябва да стане? Погледнах в php manul-а, но нещо не ми стана много ясно.
 
Ето ти един клас:

PHP:
class db {
    
    private static $instance = null;

    private function __construct() {
        
    }

 public static function Connect() {
        if (self::$instance == null) {
            try {
                
                $Connect = Configure::Read('connect');
                
                self::$instance = new PDO
                                (
                                "mysql:host=" . $Connect['host']
                                . ";dbname=" . $Connect['dataBase'],
                                $Connect['user'],
                                $Connect['password'],
                                array(
                                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES " . $Connect['charset'],
                                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
                                )
                );
            } catch (PDOException $e) {
//echo $e->getMessage();                
//throw new DatabaseExceptions('Incorrect given database information');
                           }
        }

        return self::$instance;
    }
    
   private function __clone() {
       
   }
}

Може и без класа, важното е да се свържеш към базата данни. PDO е просто друго обръщение към базата данни, а не нормалното mysql_connect(); а ако незнаеш какво представляват тези неща по класа, може да огледаш темите за OOP (има една даже е направена важна, тук във форума).

След това просто викаш връзката ето така:

PHP:
$con = db::Connect();

$srok = 0;
$sql = "SELECT * FROM `banlist` WHERE `kraen_srok` !=  :srok";
$query = $con->prepare($sql);
$query->bindParam(':srok', $srok, PDO::PARAM_INT);
$query->execute();

bindParam го използвай само когато очакваш проверката да се извършва от информация въведена от потребителя.
Иначе може да си го напишеш така:

PHP:
$con = db::Connect();


$sql = "SELECT * FROM `banlist` WHERE `kraen_srok` !=  0";
$query = $con->prepare($sql);
$query->execute();
 

Back
Горе