2012-08-23 53 views
-3

可能重复:
Best way to prevent SQL Injection in PHP如何从SQL注入安全MySQL?

这是我的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(); 

请建议。

+0

[http://php.net/mysqli](http://php.net/mysqli)特异性[准备的语句(http://www.php.net/manual/en/ mysqli.quickstart.prepared-statements.php)开始。 –

+2

请不要在新代码中使用'mysql_ *'函数。他们不再被维护,社区已经开始[弃用流程](http://goo.gl/KJveJ)。请参阅[**红框**](http://goo.gl/GPmFd)?相反,您应该了解[准备好的语句](http://goo.gl/vn8zQ)并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。如果你不能决定,[本文](http://goo.gl/3gqF9)将有助于选择。如果你关心学习,[这是一本很好的PDO教程](http://goo.gl/vFWnC)。 – PeeHaa

+0

请参阅http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php –

回答

6

停止使用古代,即将弃用mysql_*功能,并开始使用PDO代替。查看PDO::prepare()的文档以查看示例。

而且看看手册页约choosing an API,其中规定:

建议请使用mysqliPDO_MySQL扩展。不建议在新的开发中使用旧的mysql扩展。

0

这真的取决于你如何得到你的变量。

最好和最安全的方法是使用准备好的语句。你可以做这些与mysql_*声明,但使用PDO可能是一个更好的选择了。

这是PDO使用预处理语句的esample:

<?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(); 
?> 

的想法是你准备的声明 - 告诉应该期待什么,那么你传递参数给它与数据库数组在执行语句中。任何有趣的事情都是从等式中取出来的。

0

用占位符替换所有值并在发送之前准备好陈述。例如与PDO。

0

您有两个选择 - 转义unsafe_variable中的特殊字符或使用参数化查询。两者都可以保护你免受SQL注入。参数化查询被认为是更好的做法,但在变量中转义字符将需要更少的更改。

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

How can I prevent SQL injection in PHP?