这些MYSQL / SQL语句是否可以安全地从SQL注入?

时间:2013-03-27 14:05:47

标签: php mysql sql sql-server sql-injection

////MYSQL Statement////
$sql = $mysql_conn->prepare("UPDATE table SET columnname = ? WHERE id = ?";
$sql->execute(array($new_value,$id));


////SQL Statment////
$client_select = array($select);
$tsql1 = "SELECT * FROM customertable where id = ?";
$result1 = sqlsrv_query($conn, $tsql1,$client_select);
$row1 = sqlsrv_fetch_array($result1, SQLSRV_FETCH_ASSOC);

如果是的话,有人可以告诉我为什么MYSQL比以下更安全吗?

$sql = mysql_query("select * from customers where id='$id'");
$sql = mysql_fetch_assoc($sql);

3 个答案:

答案 0 :(得分:2)

第二个选项

$sql = mysql_query("select * from customers where id='$id'");

不安全,因为$id可能类似' OR 1=1 OR id=',查询类似

"select * from customers where id='' OR 1=1 OR id=''

答案 1 :(得分:0)

第一套是安全的。第二组不是。例如,如果用户要在$ id字段中提供数据,例如:'1;从表1'

中删除

然后你的SQL语句将变成:

“从id = 1的客户中选择*;从表1中删除”

如果你的SQL引擎可以执行多个语句,那么你就会遇到麻烦。

答案 2 :(得分:0)

与您更安全的查询类似,以下是我在类中使用的代码示例,但您应该明白这一点:

$strSQL = "UPDATE user_table SET pname = ".$this->dbParam('a').", pname2 = ".$this->dbParam('b')."
            WHERE id = ".$this->pid;

$rs = parent::prepSQL($strSQL);
parent::doSQL($rs,array($a, $b));

这是课外的一个例子

$strSQL = "SELECT COUNT(*) FROM table_of_users WHERE login = ".$dbconn->Param('a')." AND guest_user = 0";
$rs = $dbconn->Prepare($strSQL);
$rs = $dbconn->Execute($rs,array($_POST["persnum_".$j]));

它更安全,因为它阻止人们注入自己的答案;其他人回答。它也更容易阅读,因为你不必单引号。