我创建了一个简单的函数,使用函数和数组将数据发布到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注入,但它告诉我,该数组实际上阻止了任何有害的语法运行。谢谢!
答案 0 :(得分:5)
不安全。不要将$_POST
中的数据直接插入MySQL。请阅读SQL injection。
答案 1 :(得分:5)
在问题的sql中 - 没有清理或转义。考虑一下这样的单个表单输入会发生什么:
在第一个中,会出现某种语法错误,也会出现在第二种语法错误中。
第三只是暗示你正在进行的那种注射的冰山一角。在这里,我们将另一个表的值注入到这个insert语句中,如果该字段对最终用户可见,他们可以做这样的事情来探索你的数据库并获得他们不应该看到的信息。只需google sql injection,您就会找到无数的例子。
你真的应该使用PDO,最好是prepared statements而不是旧的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
是什么并不重要 - 它们将被适当地转义。
答案 2 :(得分: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";
}
}
答案 3 :(得分:0)
我看到3个问题:
通过这种方式插入数据(函数,包含数组中的所有数据),您距离使用参数绑定只有几步之遥,解决了SQL注入问题。对于跨站点脚本,必须使用验证机制。