2

我创建了一个简单的函数来使用函数和数组将数据发布到 mysql 表中。该数组是从表单上的 $_POST 项目构建的。我想知道的是:是否存在我没​​有看到的潜在安全漏洞?

这是功能:

            public function add_sql_data($table,$array){
            $tot = count($array);
            $c=0;
            foreach($array as $k => $v){
                $fields = $fields.$k;
                $values = $values."'".$v."'";
                $c++;
                if($c < $tot){
                    $fields = $fields.","; 
                    $values = $values.","; 
                }
            }
            $sql = "INSERT INTO ".$table."(".$fields.") values(".$values.")";
            if (mysql_query($sql)){
                return "succesfull";
            }else{
                return "error";
            }
        }

我曾尝试使用我知道的少量 PHP 来创建 SQL 注入,但在我看来,该数组实际上正在阻止任何有害的语法运行。谢谢!!

4

4 回答 4

5

不安全。不要直接从$_POSTMySQL 中插入数据。请阅读SQL 注入

于 2012-09-22T07:29:59.440 回答
5

一点都不安全

在问题的 sql 中 - 没有清理或转义。考虑像这样的单个表单输入会发生什么:

  • '他说'不可能''
  • '废话')'
  • '"), (从表限制中选择字段 1))--'

在第一个中,会出现某种语法错误,在第二个中也会出现。

第 3 次只是您正在实现的那种注射的冰山一角的暗示。在这里,我们将另一个表的值注入到这个插入语句中,如果该字段对最终用户可见,他们可以执行类似的操作来探索您的数据库并访问他们不应该看到的信息。只需google sql injection,您就会发现无穷无尽的示例列表。

正确的方式

你真的,真的应该使用PDO,最好使用准备好的语句,而不是旧的 mysql_* 函数。

一个类似于你正在做的可以安全注射的事情的例子是:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare("INSERT INTO table (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

$name这样,无论是什么或是什么都无关紧要$value-它们将被适当地转义。

于 2012-09-22T08:41:51.763 回答
0

您可以尝试这样的代码..

public function add_sql_data($table,$array){
        $tot = count($array);
        $c=0;
        foreach($array as $k => $v){
            $fields = $fields.$k;
            $values = $values."'".$v."'";
            $c++;
            if($c < $tot){
                $fields = $fields.","; 
                $values = $values.","; 
            }
        }
    /* To protect MySQL injection you can do like this */
    $values= stripslashes($values);
    $values = mysql_real_escape_string($values);

        $sql = "INSERT INTO ".$table."(".$fields.") values(".$values.")";
        if (mysql_query($sql)){
            return "succesfull";
        }else{
            return "error";
        }
    }
于 2012-09-22T07:43:01.307 回答
0

我看到 3 个问题:

  1. 您正在使用旧的 mysql_* 函数。它们已被弃用,很快就会退出 PHP
  2. 你对SQL 注入持开放态度
  3. 您容易受到跨站脚本攻击

通过以这种方式插入数据(函数,将所有数据放在一个数组中),您离使用参数绑定仅几步之遥,女巫解决了 SQL 注入问题。对于跨站点脚本使用,必须使用验证机制。

于 2012-09-22T08:18:02.883 回答