2016-01-11 3 views
0

Я работаю на классе DB, в то время как тестирование, я обнаружил, что код введен, я добавил небольшой JS скрипт в field1, и это результат:SQL впрыскивается

enter image description here

<?php 


final class crud { 

private $connexionName, $sql = ''; 

public function __construct($connexionName) { 

    $this->connexionName = $connexionName; 
} 


public final function insert($tableName, $fields=array()){ 

     $this->tableName = $tableName; 
     $this->fields = $fields; 


     foreach ($this->fields as $vf) { 

      $inKeys[]  = $vf; 
      $inKeysDotted[] = ':' . $vf; 


      $insImKeys  = implode(', ', $inKeys); 
      $insImKeysDotted = implode(', ', $inKeysDotted); 


      $this->insImKeys   = $insImKeys; 
      $this->insImKeysDotted = $insImKeysDotted; 

     } 

      $this->insertedKeys   = $inKeys; 
      $this->insertedKeysDotted = $inKeysDotted; 


     $sql = "INSERT INTO `$this->tableName` ($this->insImKeys) VALUES ($this->insImKeysDotted);"; 
     //echo $sql.'<br />'; 

     $insertItems = $this->connexionName->prepare($sql); 

     $this->insertItems = $insertItems; 

     echo '<pre>'; 
     print_r($insertItems).'<br />'; 
     echo '</pre>'; 

} // end prepareStm() 

public final function checkValType($valToCheck){ 

    $this->valToCheck  = $valToCheck; 

    // http://php.net/manual/en/function.gettype.php 
    $valType = gettype($this->valToCheck); 

    $this->valType = $valType; 

    switch ($this->valType) { 
     case 'boolean': 
      $PDOType = PDO::PARAM_BOOL; 
      break; 

     case 'integer': 
      $PDOType = PDO::PARAM_INT; 
      break; 

     case 'NULL': 
      $PDOType = PDO::PARAM_NULL; 
      break; 

     default: // string 
      $PDOType = PDO::PARAM_STR; 
      break; 
    } 

    //echo $PDOType.'<br />'; 

    $this->PDOType = $PDOType; 
    //return $this->valType; 
    return $this->PDOType; 

} // end checkValType() 


public final function bindParams($setValues=array()){ 


    $combine = array_combine($this->insertedKeys, $setValues); 

    foreach ($combine as $getKey => $getVal) { 

     $setType = $this->checkValType($getVal); 


    echo "this->insertItems->bindValue($getKey, $getVal, $setType)<br />"; 
    $this->insertItems->bindValue($getKey, $getVal, $setType); 


    } 


} // end bindParams() 


public final function executeQuery(){ 
    return $this->insertItems->execute(); 
} 



} 

require_once '../Included_Files/Connect.php'; 



$con = new crud($connexion); 

echo '<br />'; 

$con->insert('test', array('field1', 'field2', 'field3')); 
//$con->checkValType(19); 
$con->bindParams(array('<script>alert(\'hello\');</script>', 'pour field2', 'pour field3')); 
$con->executeQuery(); 

?>

Как я могу избежать таких инъекций?

Спасибо за вашу помощь

+0

Что вы ожидали? –

+0

ну, в основном, я использовал bindParam, и при вставке он удаляет теги скриптов –

+1

Имейте в виду, что по пути в базу данных вы занимаетесь внедрением SQL (при этом это не является SQL). Именно на выходе вы затем отфильтровываете это, чтобы остановить XSS (это правило называется «вход фильтра», выход выхода ». Это не инъекция. Если вы хотите очистить его по пути использования php striptags(). – Ukuser32

ответ

3

хорошо, в основном, я использовал bindParam, и при вставке, то удалите скрипты теги

Ваше предположение неверно. У вас есть JavaScript, встроенный в HTML, который, в свою очередь, встроен в SQL. Каждый из этих языков имеет разные схемы экранирования и представляет разные риски. bindParam касается только инъекции SQL, то есть самого внешнего слоя. Это не касается ускорения HTML, удаление <script> тегов, и это хорошо.

Итак, нижняя строка: в вашем коде отсутствует уязвимость SQL-инъекции. Приложение может или не может быть уязвимо для XSS или других эксплойтов, но это выходит за рамки SQL-инъекций.

+0

Это правильно, это XSS-атака, мой код уязвим для SQL-инъекции? –

+1

Нет , ваш код не уязвим для SQL-инъекции. SQL-инъекция происходит, когда пользователь отправляет строки типа 'something ', DROP TABLE \' test \ '; -', которые получают интерполяцию в SQL-запросе. –

Смежные вопросы