2017-10-01 10 views
0

J'utilise la classe de pagination ci-dessous avec AOP POOEnvoi de données d'utilisateur à base de données sans Préparée statment

<?php 
class Paginator{ 
private $db; 
public $page_no;//current page 
public $limit;//record_per page 
public $row_start; 
public $total_rec; 
public $query; 

function __construct($con){ 
    $this->db = $con; 
} 
//get total no of records 
public function get_no_records($query){ 
    $this->query = $query; 
    $stmt = $this->db->prepare($query); 
    $stmt->execute(); 
    $row_num = $stmt->rowCount(); 
    if($row_num > 0){ 
     $this->total_rec = $row_num; 
     return $row_num; 
    } 
} 
public function get_data($limit,$page_no){ 
    try { 
     $this->limit = $limit; 
     $this->page_no = $page_no; 
     if($this->limit == "all"){ 
      $query = $this->query; 
     } 
     else{ 
      $this->row_start = (($this->page_no-1) * $this->limit); 
      $query = $this->query . " LIMIT ". $this->row_start . "," . $this->limit; 
     } 
     $stmt = $this->db->prepare($query); 
     $stmt->execute(); 
     while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
      //create an array to hold record 
      $results[] = $row; 
     } 
     $result = new stdClass(); 
     $result->page_no = $this->page_no; 
     $result->limit = $this->limit; 
     $result->total_rec = $this->total_rec; 
     $result->data = $results; 
     return $result; 
    } catch (PDOException $e) { 
     echo $e->getMessage(); 
    } 
} 
public function create_links($links,$list_class){ 
    if($this->limit == 'all'){ 
     return ''; 
    } 
    $last = ceil($this->total_rec/$this->limit); 
    $start = (($this->page_no - $links) > 0) ? $this->page_no - $links : 1; 
    $end = (($this->page_no + $links) < $last) ? $this->page_no + $links : $last; 
    $html = '<ul class="' . $list_class . '">'; 
    $class = ($this->page_no == 1) ? "disabled" : ""; 
    $previous_page = ($this->page_no == 1) ? 
    '<a href= ""><li class="' . $class . '">&laquo;</a></li>' : 
    '<li class="' . $class . '"><a href="?limit=' . $this->limit . '&page_no=' . ($this->page_no-1) . '">&laquo;</a></li>'; 
    $html .= $previous_page; 
    if($start > 1){ 
     $html .= '<li><a href="?limit=' . $this->limit . '&page_no=1">1</a></li>'; 
     $html .= '<li class="disabled"><span>....</span></li>'; 
    } 
    for($i = $start;$i<=$end;$i++){ 
     $class = ($this->page_no == $i)? "active" : ""; 
     $html .= '<li class="' . $class . '"><a href="?limit=' . $this->limit . '&page_no=' . $i .'">' . $i . '</a></li>'; 
    } 
    if($end < $last){ 
     $html .= '<li class="disabled"><span>....</span></li>'; 
     $html .= '<li><a href="?limit=' . $this->limit . '&page_no=' . $last . '">' . $last . '</a></li>'; 
    } 
    $class = ($this->page_no == $last)? "disabled" : ""; 

    $next_page = ($this->page_no == $last)? 
    '<li class="' . $class . '"><a href="">&raquo;</a></li>': 
    '<li class="' . $class . '"><a href="?limit=' . $this->limit . '&page_no=' . ($this->page_no + 1) . '">&raquo;</a></li>'; 
    $html .= $next_page; 
    $html .= '</ul>'; 
    return $html; 
} 
} 
?> 

Des get_no_records (requête de $) au dessus de toute requête passée est exécutée, j'avais une requête comme SELECT * FROM users et a bien fonctionné. J'ai une fonction où la valeur du nom de la colonne est déterminée par l'entrée d'utilisateur à partir d'un champ de texte sous une forme ici est la fonction

  public function search_user($value){ 
     $query = "SELECT * FROM users WHERE username = " . "'" . $value . "'"; 
      return $query; 
     } 

Voici mon formulaire de recherche

<form method="GET"> 
Username:<input type="text" name="uname"/> 
<button type="submit" class="btn btn-primary" name="srch">Search</button> 
</form> 

Le $ La requête retournée est passée à get_no_records ($ query) Et elle fonctionne bien. Voici ma question. Est-il correct d'envoyer l'entrée de l'utilisateur à la base de données de cette façon? Mon code est-il vulnérable à l'injection SQL? Comment puis-je empêcher cela. Merci.

+1

Tant que vous ne sont pas les instructions préparées, vous êtes très vulnérable à l'injection sql – Akintunde007

Répondre

0

Vous avez vraiment besoin d'utiliser des instructions préparées par PDO, car c'est un moyen fiable de vous assurer que votre site Web est à l'abri de l'injection SQL.

Référence: https://stackoverflow.com/a/3716402/5287820

+0

Mais le script ci-dessus donne la pagination pas de place pour cela, comment je S'il vous plaît ne fais .Depuis la get_no_records ($ query) ne prend que des requêtes SQL – Muhammed

+1

Changez juste pour prendre une requête et un tableau de paramètres – JimL

+0

@JimL Merci. Mais j'utilise la classe de pagination dans plus d'une partie de mon site web, ne pas passer un tableau de paramètres restreindre l'utilisation de cette classe à une seule partie de mon site Web – Muhammed