PHP sql Инъекция и пользовательские номера параметров в функции - PullRequest
0 голосов
/ 04 июня 2018

Всем доброго времени суток: я бы хотел параметризовать свои запросы, создав функцию, которая получает мой запрос, соединение и массив с параметрами, выраженными как "?".Моя функция:

receiveQuery($query, $mysqli1, $array1)

Я читал о внедрении SQL, я хотел бы знать, что если это правильный способ избежать этого.Я планирую использовать эту функцию для INSERT, DELETE, UPDATE и SELECT.Также я хотел бы, чтобы вы рассказали мне, как я могу создать лучшую обработку для более чем одного параметра, потому что в настоящее время я использую переключатель.Но каждый раз, когда мне требуются дополнительные параметры, я увеличиваю значение параметра и хочу создать его динамически.

SWITCH ($array1Length)

Любые комментарии полезны, с уважением.Фелипе

<?php
    $mysqli1 = openConn();
    $query = "INSERT INTO tblTest (field1 , field2 ) VALUES (?,?)";
    $array1 =                array($value1, $value2);
    $result = receiveQuery($query, $mysqli1, $array1);
    if($stmt->affected_rows == 1)
    {
        $success = "Success.";
    }
    if($stmt->affected_rows == -1)
    {
        $error = "Error.";
    }
    closeConn($stmt);
    closeConn($mysqli1);

    function openConn()
    {
        $mysqli1 = new mysqli('localhost', 'userTest', '123', 'dbTest');
        if ($mysqli1->connect_error) {
            die('Connect Error (' . $mysqli1->connect_errno . ') '
                    . $mysqli1->connect_error);
        }
        return $mysqli1;
    }

    function receiveQuery($query, $mysqli1, $array1)
    {
        global $stmt;
        $stmt = $mysqli1->prepare($query);
        if (false===$stmt)
        {
            echo $mysqli1->error;
            die('Error');
        }
        $array1Length = count($array1);
        SWITCH ($array1Length)
        {
            CASE   0: break;
            CASE   1: $stmt->bind_param("s"   , $array1[0])                                 ;break;
            CASE   2: $stmt->bind_param("ss"  , $array1[0],$array1[1])                      ;break;
            CASE   3: $stmt->bind_param("sss" , $array1[0],$array1[1],$array1[2])           ;break;
            CASE   4: $stmt->bind_param("ssss", $array1[0],$array1[1],$array1[2],$array1[3]);break;
            DEFAULT : echo "Error";
        }
        $stmt->execute();
        $result = $stmt->get_result();

        return $result;
    }

    function closeConn($mysqli1)
    {
        $mysqli1->close();
    }

?>

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вы должны иметь возможность использовать оператор splat в вашем массиве.

$s = '';
for ($x = 0; $x < count($params); $x ++) {
    $s .= 's';
}

$stmt->bind_param($s, ...$params);

https://secure.php.net/manual/en/migration56.new-features.php

0 голосов
/ 04 июня 2018

Я хотел бы параметризовать свои запросы, создав функцию, которая получает мой запрос, соединение и массив с параметрами, выраженными как "?"

Я предлагаю вам использовать PDOчем текущий mysqli, который вы используете в данный момент.PDO проще в изучении и может легко работать с вашими текущими требованиями.

Вот как вы можете это сделать с PDO.

page.php

<?php

define('DB_HOST', 'localhost');
define('DB_NAME', 'dbTest');
define('DB_USER', 'userTest');
define('DB_PASS', '123');
define('DB_CHAR', 'utf8');

class conn
{
    protected static $instance = null;

    protected function __construct() {}
    protected function __clone() {}

    public static function instance()
    {
        if (self::$instance === null)
        {
            $opt  = array(
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES   => FALSE,
            );
            $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
            self::$instance = new PDO($dsn, DB_USER, DB_PASS, $opt);
        }
        return self::$instance;
    }

    public static function __callStatic($method, $args)
    {
        return call_user_func_array(array(self::instance(), $method), $args);
    }

    public static function receiveQuery($sql, $args = [])
    {
        if (!$args)
        {
             return self::instance()->query($sql);
        }
        $stmt = self::instance()->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}

anotherpage.php

<?php

require 'page.php';

$params = array($value1, $value2);
$sql = "INSERT INTO tblTest (field1 , field2 ) VALUES (?,?)";

$stmt  = conn::receiveQuery($sql, $params);

if($stmt->rowCount() > 0){

     $success = "Success.";
}else{

     $error = "Error.";
}
?>

Чтобы узнать больше о PDO, вы можете перейти на этот сайт: https://phpdelusions.net/pdo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...