Advertisement
galvao

Auxílio em código pronto sobre as questões de segurança

Jul 10th, 2014
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2. class Firewall{
  3.     public function __construct() {
  4.         // O isset elimina a necessidade da supressão de erros(@)
  5.         // Invertendo a condição elimina a necessidade de um if vazio
  6.         if(isset($_POST['firewall']) and $_POST['firewall'] != 'cancelar') {
  7.             if ($_POST) {
  8.                 $this->post();
  9.             } else if ($_GET) {
  10.                 $this->get();
  11.             }
  12.         }      
  13.     }
  14.  
  15.     // Definindo visibilidade para todos os métodos (boa prática)
  16.     public function post() {
  17.         // aqui provavelmente poderíamos trocar esses loops aninhados por algo como um array_map, eliminando o else
  18.         foreach ($_POST as $chave => $valor){
  19.             if(is_array($valor)) {
  20.                 foreach ($valor as $chave2 => $valor2) {
  21.                     $_POST[$chave2] = $this->antiInjection($valor2);
  22.                 }
  23.             } else {
  24.                 $_POST[$chave] = $this->antiInjection($valor);
  25.             }
  26.                
  27.         }
  28.        
  29.         return;
  30.     }
  31.  
  32.     public function get() {
  33.         foreach ($_GET as $chave => $valor){
  34.                
  35.             if(is_array($valor)){
  36.                 foreach ($valor as $chave2 => $valor2){
  37.                     $_POST[$chave2] = $this->antiInjection($valor2);
  38.                 }
  39.             }
  40.             else { $_GET[$chave] = $this->antiInjection($valor);
  41.             }
  42.                
  43.         }
  44.        
  45.         return;
  46.     }
  47.  
  48.     public function antiInjection($valor) {
  49.         /* Algumas colocações:
  50.          * 1 - esqueça a linha do preg_replace. Ela se baseia em blacklist e não é uma boa idéia.
  51.          * 2 - Para prevenir SQL Injection a melhor saída é usar um prepared statemant (via PDO, por exemplo)
  52.          * 3 - Seria nesse método que usaríamos a filter
  53.          */
  54.         $valor = preg_replace("/(from|select|insert|delete|where|drop table|show tables|show databases|describe|left join|right join|inner join|#|\*|--|\\\\)/i", "", $valor);
  55.         $valor = trim($valor);
  56.         $valor = strip_tags($valor);
  57.         $valor = addslashes($valor);
  58.  
  59.         return $valor;
  60.     }
  61. }
  62.  
  63. $fw = new Firewall();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement