Здравствуйте, гость ( Вход | Регистрация )

Навигация

Ссылки форума

Навигация по форуму

 
Reply to this topicStart new topic
Что такое Php инъекция и Mysql, Как с этим боротся
Doomer
сообщение 8.11.2009, 2:19
Сообщение #1



Свой человек
Группа: Advanced Members
Сообщений: 160
Регистрация: 9.9.2007
Поблагодарили: 47 *


ППП: Статья предполагает наличие определенных знаний

В наше время многие сайты взламываются по неосторожности программистов, при написании различных программ.
Мы поговори о PHP программистах, то-есть о написании внешних сайтов(PHP можно использовать по разным назначении, не смотря на то, что Personal Home Page:).
Все дело в фантазии программиста). Сначало выясним, что такое php инекция и mysql, не буду фантазировать, возьму с wiki

PHP-инъекция (англ. PHP injection) — один из способов взлома веб-сайтов, работающих на PHP, заключающийся в выполнении постороннего кода на серверной
стороне.
СЫЛКА прилагается _http://ru.wikipedia.org/wiki/PHP-%D0%B8%D0%BD%D1%8A%D0%B5%D0%BA%D1%86%D0%B8%D1%8F

Внедрение SQL-кода (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный
на внедрении в запрос произвольного SQL-кода
СЫЛКА прилагается _http://ru.wikipedia.org/wiki/%D0%92%D0%BD%D0%B5%D0%B4%D1%80%D0%B5%D0%BD%D0%B8%D0%B5_SQL-%D0%BA%D0%BE%D0%B4%D0%B0

В нашем случае SQL injection происходит путем PHP injection. Расмотрим в примере
Допустим код просмотра информации о пользователе по имени:

Раскрывающийся текст
Код
<?
//получаем $_POST из вне
$name = $_POST['name']; // мы получили имя Doomer
$query = mysql_query("SELECT * FROM user WHERE nick='$name'");
$info = mysql_fetch_assoc($query);
//,.. и т.д.
?>


Запрос выглдит так "SELECT info FROM mysql WHERE nick='Doomer'". В чем заклкючается ошибка, нельза пользоватся такой переменной без предвадительной
проверки. Злоумышленик может передать, не те данные которы вы хотие.
Например: мы получили вместо "Doomer" вот такое значение "' and password ='xasx", теперь запрос выглядит так
"SELECT info FROM mysql WHERE nick='' or password ='admin'". Такие места обычно не застрахованны от брута, вот и получили, но обычно пароль записывают через md5(), но программисту хакеру не мешает саму пропустить пароль через алгоритм md5(), но опять повторюсь такой пример не встречается на практике, приведен он для общего понимания процесса инъекций, но и не стоит забывать, что SQL очень коварный. Нам остаетсяя сделать вывод, предварительно надо проверять данные на введеные
символы. Как это сделать? Например, через функцию preg_match();

Раскрывающийся текст
Код
<?
$name = $_POST['name'];
if(!preg_match('/^[a-zA-Z]+$/',$name)){
    print "Попытка взлома";
    exit;
}
$query = mysql_query("SELECT * FROM user WHERE nick='$name'");
$info = mysql_fetch_assoc($query);
?>


Мы сделали проверку через preg_match();(_http://ua.php.net/manual/en/function.preg-match.php)
Если имя содержит только латинские буквы, все будет О.К., если не соджержит, выведится сообщение "Попытка взлома" и прервется выполнение прораммы.

Можно это сделать через мой написанный класс :)

guard.php
Раскрывающийся текст
Код
<?
class guard{
    public $rule = array();
    
    public function add_rule($name,$type,$var_1=null,$var_2=null){
        if($type == 'ereg'){
            $this->rule[$name] = $this->ereg($var_1,$var_2);
        }
    }

    private function ereg($type,$data){
        $email_regexp="/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|";
        $email_regexp.="(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/";
        $types=array(
            "email"=>$email_regexp,
            "digit"=>"/^[0-9]$/",
            "number"=>"/^[0-9]+$/",
            "alpha"=>"/^[a-zA-Z]+$/",
            "alpha_space"=>"/^[a-zA-Z ]+$/",
            "alphanumeric"=>"/^[a-zA-Z0-9]+$/",
            "alphanumeric_space"=>"/^[a-zA-Z0-9 ]+$/",
            "string"=>""
        );
        if(empty($data)){
            return true;
        }else{
            return preg_match($types[$type],$data);
        }
    }
}
?>


Это будет выглядеть так

Раскрывающийся текст
Код
<?
include('guard.php')//включи файл

$guard = new guard;//объявили класс guard

$guard->add_rule("nick","ereg","alpha",$name);//Добавили правило

$name = $_POST['name'];

if(!$rule['nick']){//проверяем соблюдается ли правило и остальное аналагично
    print "Попытка взлома";
    exit;
}
$query = mysql_query("SELECT * FROM user WHERE nick='$name'");
$info = mysql_fetch_assoc($query);
?>


Мой класс можно модифицировать,может как-нибудь совершенствую его. Общий принцип работы думаю понятен всем=)
Входящие данные от пользователя нужно проверять всегда и все желательбно, и разумеется за типом, который нееобходим.

Еще многие пренебрегают,что php являет Си подобным языком "Си включается в PHp" это утверждение не является ошибочным т.к.
некотрорые методики Си можно использвать в PHP
Например: переобразование формата данных:

Раскрывающийся текст
Код
<?

$i = "1232";

if(is_int($i)){
    print "Is int<br/>";
}else{
    print "Not int<br/>";
}

$i = (int)$i;

if(is_int($i)){
    print "Is int<br/>";
}else{
    print "Not int<br/>";
}

?>


Выведет
Not int
Is int

Из строки, мы преобразовали число.

Еще такое маленькое замечание, в '' лутше заключать символы, а в двойный "" строки, но не обязательно, но потом преведу статью в чем разница.


П.С.: Это моя первая статья такого рода так, что прошу не сильно бить, критику приветствую. Если комуто понравится могу написать на другие тематики, тем много.

Ту Администрации если сочтете нужным можете разместить статью, по вашему усмотрению в нужный раздел

Спасибо за внимание.
MyICQ 413300858

Go to the top of the page
 
+Quote Post
rusman
сообщение 8.11.2009, 17:29
Сообщение #2



Devil's Little Brother
Группа: Модератор
Сообщений: 286
Регистрация: 13.5.2008
Поблагодарили: 132 *


Перенёс в PHP раздел.
Go to the top of the page
 
+Quote Post
Amazing
сообщение 9.11.2009, 12:50
Сообщение #3



6
Группа: Партнеры
Сообщений: 1929
Регистрация: 2.2.2009
Поблагодарили: 5 *


Дополнительно можно реализовать счетчик по ключам в запросе. Тогда лучше полностью реализовать работу с mysql через собственный класс, и в функции query() выполнять проверку на количество ключевых слов( insert, select, update, delete, etc...) например. Когда пишешь собственный сайт знаешь, какие запросы используются. Если весь сайт построен на схеме одного запроса - таккая защита тоже будет полезна. Можно, например, передавать в query() не только сам запрос, но и количество ключей. На самом деле вариантов куча, нужно только включать воображение. Да и mysql_escape_string() никто не отменял.
Go to the top of the page
 
+Quote Post
yArrr
сообщение 9.11.2009, 13:14
Сообщение #4



Новичок
Группа: Newbies
Сообщений: 13
Регистрация: 20.6.2009
Поблагодарили: 0 *


а что
Код
addslashes()
htmlspecialchars()

мало ?

Я решил покончить с собой и выкинуться в консоль. Я стоял на краю кадрового буфера, и bash перебирал мои волосы...
Go to the top of the page
 
+Quote Post
Doomer
сообщение 9.11.2009, 14:37
Сообщение #5



Свой человек
Группа: Advanced Members
Сообщений: 160
Регистрация: 9.9.2007
Поблагодарили: 47 *


а зачем делать замену или добавлять слешь если их не должно в запросе быть
Go to the top of the page
 
+Quote Post
yArrr
сообщение 9.11.2009, 14:46
Сообщение #6



Новичок
Группа: Newbies
Сообщений: 13
Регистрация: 20.6.2009
Поблагодарили: 0 *


Цитата(Doomer @ 9.11.2009, 14:37) *
а зачем делать замену или добавлять слешь если их не должно в запросе быть

а если они должны быть в запросе ?.. не все же ники выбирать, иногда и текст сообщения для форума от пользователя принять приходится, например ...

Я решил покончить с собой и выкинуться в консоль. Я стоял на краю кадрового буфера, и bash перебирал мои волосы...
Go to the top of the page
 
+Quote Post
Doomer
сообщение 9.11.2009, 15:07
Сообщение #7



Свой человек
Группа: Advanced Members
Сообщений: 160
Регистрация: 9.9.2007
Поблагодарили: 47 *


вообще все входящие данные то-есть заголовки POST должны проверятся сразу
Структура программ должна быть такая
Определение классов и функция
Объявление и определение переменных и классов
проверка входящих данных
операция
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 13.6.2026, 14:29