Php 转义多个字符串的良好实践

Php 转义多个字符串的良好实践,php,mysql,string,escaping,Php,Mysql,String,Escaping,当同时转义来自POST或GET的多个字符串时,这是一种好的做法吗 还有什么我应该考虑或做的不同吗?我现在有PDO,但在这段代码中我不想使用它 class Bo extends Db { function clean($cThis) { $res = array(); foreach (array_keys($cThis) as $key) { $res[$key] = mysql_real_escape_string(add

当同时转义来自POST或GET的多个字符串时,这是一种好的做法吗

还有什么我应该考虑或做的不同吗?我现在有PDO,但在这段代码中我不想使用它

class Bo extends Db
{
    function clean($cThis)
    {
        $res = array();
        foreach (array_keys($cThis) as $key) {
            $res[$key] = mysql_real_escape_string(addslashes($cThis[$key]));
        }
        return $res;
    }

    function add($info)
    {
        $this->dbConnect();
        $cInfo = $this->clean($info);

        mysql_query("INSERT INTO table (b, c) VALUES ('".$cInfo['b']."', '".$cInfo['c']."')");
        $this->dbDisconnect();
    }
}
好的做法是使用and,而不是手动转义字符串并将其连接到查询中,例如:

$db = DB::connect($dsn);
$sth = $db->prepare("INSERT INTO table (b, c) VALUES (?, ?)");
$res = $sth->execute(array($info['b'], $info['c']));
$db->disconnect()
哦,还要确保
gpc\u magic\u quotes
也被禁用

好的做法是使用and,而不是手动转义字符串并将其连接到查询中,例如:

$db = DB::connect($dsn);
$sth = $db->prepare("INSERT INTO table (b, c) VALUES (?, ?)");
$res = $sth->execute(array($info['b'], $info['c']));
$db->disconnect()

哦,还要确保
gpc\u magic\u quotes
也被禁用

PDO是最好的选择,但如果你没有它的话。有一些方法模仿mysql的
pg_query_params
。它是作为类的方法编写的,
$this->dbconn
是由
mysqli\u init
返回的连接资源。当然,您可以使用适当的
mysql
类比来更改
mysqli
方法

/**
 * Returns the single value of the array mysqli_query_params__parameters
 *
 * @param $at the position of the parameter inside the array mysqli_query_params__parameters
 * @return mixed
 */
public function mysqli_query_params__callback( $at )
{
    return $this->mysqli_query_params__parameters[ $at[1]-1 ];
}

/**
 * Parameterised query implementation for MySQL (similar PostgreSQL's PHP function pg_query_params)
 * Example: mysqli_query_params( "SELECT * FROM my_table WHERE col1=$1 AND col2=$2", array( 42, "It's ok" ), $dbconn );
 *
 * @param $query, $parameters, $datadase
 * @return mixed(resorce, false)
 * @access public
 */
public function mysqli_query_params( $query, $parameters=array(), $database=false )
{
    if( !is_array($parameters) ){
        return false;
    } else {
        if($this->is_assoc($parameters)){
            $parameters = array_values($parameters);
        }
    }

    // Escape parameters as required & build parameters for callback function
    foreach( $parameters as $k=>$v )
    {
        $parameters[$k] = ( is_int( $v ) ? $v : ( NULL===$v ? 'NULL' : "'".mysqli_real_escape_string( $this->dbconn, $v )."'" ) );
    }
    $this->mysqli_query_params__parameters = $parameters;

    // Call using mysqli_query
    if( false === $database )
    {
        $query = preg_replace_callback( '/\$([0-9]+)/', array($this, 'mysqli_query_params__callback'), $query );
        $result = mysqli_query( $this->dbconn, $query );

        if( false === $result )
        {
            $err_msg = mysqli_error($this->dbconn);
            return false;
        } else {
            return $result;
        }
    }
    else
    {
        $query = preg_replace_callback( '/\$([0-9]+)/', array($this, 'mysqli_query_params__callback'), $query );
        $result = mysqli_query( $this->dbconn, $query, $database );

        if( false === $result )
        {
            $err_msg = mysqli_error($this->dbconn);

            return false;
        } else {
            return $result;
        }
    }

    return false;
}

PDO将是最好的选择,但万一你没有它。有一些方法模仿mysql的
pg_query_params
。它是作为类的方法编写的,
$this->dbconn
是由
mysqli\u init
返回的连接资源。当然,您可以使用适当的
mysql
类比来更改
mysqli
方法

/**
 * Returns the single value of the array mysqli_query_params__parameters
 *
 * @param $at the position of the parameter inside the array mysqli_query_params__parameters
 * @return mixed
 */
public function mysqli_query_params__callback( $at )
{
    return $this->mysqli_query_params__parameters[ $at[1]-1 ];
}

/**
 * Parameterised query implementation for MySQL (similar PostgreSQL's PHP function pg_query_params)
 * Example: mysqli_query_params( "SELECT * FROM my_table WHERE col1=$1 AND col2=$2", array( 42, "It's ok" ), $dbconn );
 *
 * @param $query, $parameters, $datadase
 * @return mixed(resorce, false)
 * @access public
 */
public function mysqli_query_params( $query, $parameters=array(), $database=false )
{
    if( !is_array($parameters) ){
        return false;
    } else {
        if($this->is_assoc($parameters)){
            $parameters = array_values($parameters);
        }
    }

    // Escape parameters as required & build parameters for callback function
    foreach( $parameters as $k=>$v )
    {
        $parameters[$k] = ( is_int( $v ) ? $v : ( NULL===$v ? 'NULL' : "'".mysqli_real_escape_string( $this->dbconn, $v )."'" ) );
    }
    $this->mysqli_query_params__parameters = $parameters;

    // Call using mysqli_query
    if( false === $database )
    {
        $query = preg_replace_callback( '/\$([0-9]+)/', array($this, 'mysqli_query_params__callback'), $query );
        $result = mysqli_query( $this->dbconn, $query );

        if( false === $result )
        {
            $err_msg = mysqli_error($this->dbconn);
            return false;
        } else {
            return $result;
        }
    }
    else
    {
        $query = preg_replace_callback( '/\$([0-9]+)/', array($this, 'mysqli_query_params__callback'), $query );
        $result = mysqli_query( $this->dbconn, $query, $database );

        if( false === $result )
        {
            $err_msg = mysqli_error($this->dbconn);

            return false;
        } else {
            return $result;
        }
    }

    return false;
}


是的,PDO总是好的。但如果我们认为PDO不存在。或者这样看。有什么东西可以从我的支票中漏掉吗?就像我忘记了什么(关于clean函数)?@Robert不,直接去监狱,不要通过,等等,或者,换句话说,永远不要使用原始的
mysql.*
函数。你应该假设这些都不存在,因为痛苦和痛苦,SQL注入攻击也会随之而来。谢谢你的回答。如果我这样说的话。我将要工作的公司想知道我如何不用PDO,只用mysql来转义字符串。它们当然不是高科技。这是他们想要的方式,我对此无话可说。尽管如此。这是一种很好的处理方法吗(在没有PDO的情况下也一样好)?Robert告诉他们mysql_uu函数不再是最佳实践,你会使用预先准备好的语句。@Robert我担心优秀的程序员不会帮助你开发糟糕的代码。是的,PDO总是很好的。但如果我们认为PDO不存在。或者这样看。有什么东西可以从我的支票中漏掉吗?就像我忘记了什么(关于clean函数)?@Robert不,直接去监狱,不要通过,等等,或者,换句话说,永远不要使用原始的
mysql.*
函数。你应该假设这些都不存在,因为痛苦和痛苦,SQL注入攻击也会随之而来。谢谢你的回答。如果我这样说的话。我将要工作的公司想知道我如何不用PDO,只用mysql来转义字符串。它们当然不是高科技。这是他们想要的方式,我对此无话可说。尽管如此。这是一种很好的处理方法吗(在没有PDO的情况下也一样好)?Robert告诉他们mysql函数不再是最佳实践,你会使用预先准备好的语句。@Robert恐怕优秀的程序员不会帮助你开发糟糕的代码。请停止使用古老的
mysql.*
函数编写新代码。它们不再得到维护,社区已开始恢复。相反,你应该学习并使用或。如果你不能决定,将帮助你做出选择。如果你想学习+1到@alnitak获取答案。您不想使用
addslashes()
mysql\u real\u escape\u string()
。删除
addslashes()
。另外,请确保
magic\u quotes\u gpc
未启用。@vascowhite FWIW,我总是选择PDO而不是MySQLi,这样我就不必在后端使用MySQL了。@Alnitak我同意,但我不想对此过于虔诚:)@MarcusAdams谢谢你的回答!好的,但是当查看删除addslashes()后插入到数据库中的内容时,这个字符串“bobo”是按所述('bobo')输出的,而不是“bobo\”。但这没关系,不要弄乱mysql\u查询语句?(只是重复检查)请停止使用古老的
mysql.*
函数编写新代码。它们不再得到维护,社区已开始恢复。相反,你应该学习并使用或。如果你不能决定,将帮助你做出选择。如果你想学习+1到@alnitak获取答案。您不想使用
addslashes()
mysql\u real\u escape\u string()
。删除
addslashes()
。另外,请确保
magic\u quotes\u gpc
未启用。@vascowhite FWIW,我总是选择PDO而不是MySQLi,这样我就不必在后端使用MySQL了。@Alnitak我同意,但我不想对此过于虔诚:)@MarcusAdams谢谢你的回答!好的,但是当查看删除addslashes()后插入到数据库中的内容时,这个字符串“bobo”是按所述('bobo')输出的,而不是“bobo\”。但这没关系,不要弄乱mysql\u查询语句?(只是重复检查)