2012-08-23 88 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?