Я работаю на классе DB, в то время как тестирование, я обнаружил, что код введен, я добавил небольшой JS скрипт в field1, и это результат:SQL впрыскивается
<?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();
?>
Как я могу избежать таких инъекций?
Спасибо за вашу помощь
Что вы ожидали? –
ну, в основном, я использовал bindParam, и при вставке он удаляет теги скриптов –
Имейте в виду, что по пути в базу данных вы занимаетесь внедрением SQL (при этом это не является SQL). Именно на выходе вы затем отфильтровываете это, чтобы остановить XSS (это правило называется «вход фильтра», выход выхода ». Это не инъекция. Если вы хотите очистить его по пути использования php striptags(). – Ukuser32