ППП: Статья предполагает наличие определенных знаний
В наше время многие сайты взламываются по неосторожности программистов, при написании различных программ.
Мы поговори о 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