将$ _POST传递给Db类而不进行任何处理

时间:2016-11-08 08:14:32

标签: php

我试图通过$_POSTmysqli_real_escape_string全局变量直接传递给数据库而不进行任何处理......

这是我的代码工作正常。

  1. 由于此类编码而可能出现的问题是什么?
  2. 有哪些安全隐患?
  3. 这是一条好捷径还是还有更多...... ???
  4. class Db{
    ...
    More
    ...
    
        public function insert($args=array()){
            if(!isset($args['table']) || !isset($args['values'])){
                return false;
            }
            $table=$args['table'];
            $values=$this->process_insert($args['values']);
            $query="INSERT INTO {$table} {$values}";
            $result=$this->query2db($query); //method returns mysqli_query()
            if($result){
                return true;
            }else{
                return false;
            }
        }
    
        protected function process_insert($data=array()){
            $values="";
            $fields="";
            $glue=", ";
            if(isset($data)){
                foreach($data as $key=> $value){
                    $key=$this->escape($key);
                    $value=$this->escape($value); //method returns mysqli_real_escape_string
                    $fields .="{$key}".$glue;
                    $values .="'{$value}'".$glue;
                }
                $fields=rtrim($fields, $glue);
                $values=rtrim($values, $glue);
                return "({$fields}) VALUES ({$values})";
            }else{
                return false;
            }
        }
    
    ...
    More
    ...
    }
    
    if(!empty($_POST)){
    
        $query=array(
        'table'=>'users',
        'values'=> $_POST //<=== WHAT COULD BE THE PROBLEM HERE
        );
    
        $dbObj=new Db;
        $dbObj->insert($query);
    
    }
    

    UPDATE -

    • 我可以将它用于与Android的交互......
    • 自动生成具有数组格式值的表单
    • 并使用数组验证

2 个答案:

答案 0 :(得分:0)

我建议使用预准备语句,而不是使用mysql_real_escape_string。我总是说,永远不要相信用户输入。您的数据将被转义,但仍会进入您的数据库,并且不会忘记使用准备语句获得的性能提升!

阅读这篇文章mysql_real_escape_string VS Prepared Statements

答案 1 :(得分:0)

$key=$this->escape($key);

这里存在明显的漏洞。 mysqli_real_escape_string转义 SQL字符串语法 。字段名称不使用字符串语法。简单的字符串转义示例意味着:

$value = "Craig O'Connor";
$query = "INSERT INTO ... VALUES ('$value')";
                                  ^^^^^^^^
                              'Craig O'Connor'  ->  syntax error

逃脱:

$value = "Craig O'Connor";
$value = mysqli_real_escape_string($con, $value);
$query = "INSERT INTO ... VALUES ('$value')";
                                  ^^^^^^^^
                              'Craig O\'Connor'

字符串转义机制转义了'。假设先决条件mysqli_real_escape_string执行任何有用的操作是您将在SQL字符串文字中使用结果。使用字段名称,您不会这样做。因此,字符串转义在那里没有做任何事情。因此,您很容易受到SQL注入的攻击。<​​/ p>

必须将允许的字段列入白名单,并根据该白名单对其进行过滤。您不能盲目接受任何和所有字段名称,只需按原样使用它们即可。不仅因为它介于很难和不可能转义字段名称之间,而且因为使用不存在的字段名称将导致查询错误。您不希望因用户输入拼凑错误而导致查询错误。

这就是说,首先不使用预先准备好的陈述,或者说你在数据库中给予用户或多或少的免费统治......