如何从SQL注入中保护MySQL


How to secure MySQL from SQL Injection?

可能重复:
防止PHP 中SQL注入的最佳方法

这是我的SQL查询,我想让它成为无SQL注入的

 $q1="insert into ecat_user(login_id,password,fullname,gender,disp_name,dob,";
 $q1.="street_addr,city,country,zip,email,aol,msn,icq,yahoo,homepg_link,homepg_caption,description,";
 $q1.="legal_guardian,phoneno,promotioncode,user_type,height,weight,chest,waist,inseam,eyecolor,haircolor,";
 $q1.="shoesize,biceps,collar,experience,travel,notes,added_on,updated_on) values('$modelName','$password','$firstName',";
 $q1.="'$gender','$description','$dob','$streetAddress','$city','$country','$zipCode','$emailAddress',";
 $q1.="'$aolID','$msnID','$icqID','$msnID','$homePage','$homePageCaption','$description','$legalGuardian',";
 $q1.="'$phoneNumber','$promotionalCode','','','','','','','','','','','','','','','','')";
 mysql_query($q1, $Conn);
 $id = mysql_insert_id();

请提出建议。

停止使用即将弃用的古老mysql_*函数,转而使用PDO。请查看PDO::prepare()的文档以查看示例。

还可以看看关于选择API的手册页面,其中指出:

建议使用mysqliPDO_MySQL扩展名。不建议使用旧的mysql扩展进行新的开发。

这实际上取决于如何获取变量。

最好和最安全的方法是使用事先准备好的语句。可以使用mysql_*语句执行这些操作,但再次使用PDO可能是更好的选择。

这是在PDO:中使用准备好的语句的示例

<?php
/* Execute a prepared statement by passing an array of values */
$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();
?>

其思想是准备语句-告诉数据库应该期望什么,然后在执行语句期间将参数与数组一起传递给它。任何有趣的事情都会被排除在等式之外。

将所有值替换为占位符,并在发送之前准备语句。例如,使用PDO。

您有两个选项-转义unsafe变量中的特殊字符,或者使用参数化查询。两者都可以保护您免受SQL注入的影响。参数化查询被认为是更好的做法,但对变量中的字符进行转义所需的更改较少。

这在上面的文章中有明确的描述和澄清,请仔细阅读。

如何防止PHP中的SQL注入?