PHP форма обратной связи (какие могут быть косяки)

Discussion in 'PHP' started by Befan, 20 Dec 2012.

  1. Befan

    Befan New Member

    Joined:
    27 Mar 2012
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Вот что есть
    PHP:
        if (isset($_POST['email']) and isset($_POST['qtext']) and isset($_POST['code'])) { 
                
    $email=trim($email);
                
    $qtext=trim($qtext);
                
    $email=htmlspecialchars($_POST['email']);
                
    $qtext=htmlspecialchars($_POST['qtext']);            
                if(
    trim($_POST['code'])==$_SESSION['captcha']){
                    if(
    preg_match('|([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})|is'$email)){
                        if((
    strlen($qtext)<5000) and (strlen($qtext)>10))  {
                            include_once(
    '/msql.php');  
                            include(
    '/tools.php');
                            
    $ip=getIp();
                            
    $date=date('Y:m:d G:i:s');
                            
    $email=addslashes($email);
                            
    $qtext=addslashes($qtext);
                            if (
    mysql_query ("INSERT INTO questions (email,qtext,ip,date) VALUES('$email','$qtext','$ip','$date')")){
                                
    $err_con="Ваше сообщение отправлено администратору, он ответит в ближайшее время";
                                  
    $qtext='';
                                  
    $email='';    
                            }else {
                                echo 
    "Ошибка! Повторите операцию позже.";
                                }          
                        }else{
                            
    $err_con=$err_con.'<br>Длинна сообщения не должна быть больше 5000 символов и';       
                        }
                    }else{
                        
    $email='';
                        
    $err_con=$err_con.'<br>Ошибка ввода E-mail';    
                    }
                }else{
                    
    $err_con=$err_con.'<br>Ошибка ввода проверочного кода';     
                }
        }
    Опишите ваше мнение по поводу езопасности кода. (уязвимости)
     
  2. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    PHP:
    (isset($_POST['email']) and isset($_POST['qtext']) and isset($_POST['code'])) {
    Меняеться на:
    PHP:
    (isset($_POST['email'], $_POST['qtext'], $_POST['code'])) {
    PHP:
    if(preg_match('|([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})|is'$email)){ 
    Меняеться на http://php.net/manual/en/function.filter-var.php, с опциией ваидации мыла.
    PHP:
         $email=addslashes($email); 
                            
    $qtext=addslashes($qtext); 
    Надо сменить на mysql_real_escape_string, или юзать mysqli.


    Фильтровать html теги надо при выводе, а не вводе.
    PHP:
     $email=htmlspecialchars($_POST['email']); 
                
    $qtext=htmlspecialchars($_POST['qtext']);   
    Нет приведения типов, а это раскрытие путей, если вкл. отображение ошибок.
    Я бы написал так:
    PHP:
    include_once('/msql.php');   
    include(
    '/tools.php');  

    if (!isset(
    $_POST['email'], $_POST['qtext'], isset($_POST['code']))
        exit;

     
        
    //Приводим в порядок переменые
        
    $email=(string)$_POST['email']; 
        
    $qtext=(string)$_POST['qtext']; 
        
    $email=trim($email); 
        
    $qtext=trim($qtext);  //trim переносы строк сьест..(вроде)
        
        
    $err_con '';   
        if(!
    trim((string)$_POST['code']) == $_SESSION['captcha']) //Чекаем код...
          
    $err_con $err_con.'<br>Ошибка ввода проверочного кода'

        if(!
    filter_var($emailFILTER_VALIDATE_EMAIL)) //Проверяем мыло на валидность
          
    $err_con=$err_con.'<br>Ошибка ввода E-mail';    


        
    $qlen strlen($qtext); //Дабы не дергать str_len 2 раза
        
    if (!(($qlen <5000) && ($qlen 10)))
           
    $err_con $err_con.'<br>Длинна сообщения не должна быть больше 5000 символов и';   
        
        if (!
    $err_con) { //если не было ошибок...
         
            
    $ip getIp(); 
            
    $date date('Y:m:d G:i:s'); 
            
    $email mysql_real_escape_string($email); 
            
    $qtext mysql_real_escape_string($qtext); 
     
                
    $sql_q "INSERT INTO questions (email,qtext,ip,date) VALUES('$email','$qtext','$ip','$date')";
                if (
    mysql_query ($sql_q)){ 
                   
    $err_con="Ваше сообщение отправлено администратору, он ответит в ближайшее время"
                
    else
                   echo 
    "Ошибка! Повторите операцию позже.";
         } else 
           echo  
    $err_con;
     
    #2 mironich, 20 Dec 2012
    Last edited: 20 Dec 2012
    1 person likes this.