如何从SQL注入中保护MySQL?

时间:2012-08-23 12:17:34

标签: php mysql

  

可能重复:
  Best way to prevent SQL Injection in PHP

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

请建议。

4 个答案:

答案 0 :(得分:6)

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

另请参阅有关choosing an API的手册页,其中说明:

  

建议使用mysqliPDO_MySQL扩展程序。建议不要将旧的mysql扩展用于新开发。

答案 1 :(得分:0)

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

最好和最安全的方法是使用准备好的陈述。您可以使用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();
?>

您的想法是准备语句 - 告诉数据库它应该期待什么,然后在执行语句期间使用数组将参数传递给它。任何有趣的事情都会被排除在外。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

在上面的文章中清楚地描述和清除了这一点,请完整地完成它。

How can I prevent SQL injection in PHP?