如何安全地使用MySQLi?

时间:2013-02-25 07:49:22

标签: php mysql mysqli

所以我最近改用MySQLi。我有几个问题。

我目前获取数据的代码是

$current = "SELECT * FROM hi where username='me'";
$result = $connect->query($current) or die($mysqli->error.__LINE__);
$row = $result->fetch_assoc();

我执行的查询是

$ current =“SELECT * FROM hi where username ='me'”; $ result = $ connect->查询($ current)或死亡($ mysqli->错误。 LINE );

第一个问题,这是正确的方法吗?

它比mysql_方法更安全吗? (我听说它可以防止注射或其他事情)

最后,除了现在使用MySQLi之外,我还应该做些什么?我的代码是否足够安全?

我以前在mysql查询中使用的任何数据上使用了mysql_real_escape_string(htmlspecialchars($ string),我还需要使用它吗?因为我现在正在使用MySQLi。

我应该注意哪些其他事项才能确保我的网站安全? htmlspecialchars任何用户输入?

谢谢!

1 个答案:

答案 0 :(得分:2)

关于mysqli_query使用:

  

它比mysql_方法更安全吗? (我听说它可以防止注射或其他事情)

此处您没有注射问题,因为您不使用任何用户输入。所以mysql_或mysqli_似乎是等价的。

关于注射问题:

但是,如果必须使用用户输入(例如$_POST$_GET变量),最好使用预准备语句。他们的语法就是这个:

$query = SELECT * FROM mytable WHERE col1=? AND col2=?;
$stmt = $db->prepare($query);
$stmt->bind_param('ss',$_POST['col1'],$_POST['col2']);//I put 2 s because I want 2 params. s stands for strings, i for integer. For that part PHP and mysqli extension offers you two alternative syntaxes. They give the same result but it depends on what you understand the best.
  • 首先:使用bind_result。必须在执行前调用此函数。它会将结果绑定到您在参数中提供的变量。第一列将填充第一个变量,第二列将填充第二个参数...主要问题是它会使您从包含fetch_allfetch_assocfectch_object的整个mysqli_result API中删除。

    $stmt->bindResult($array['col1'], $array['col2'], $array['col3']);
    $stmt->execute();
    while($stmt->fetch_assoc()){
       var_dump($array);
    }
    
  • 第二名:使用get_result。它允许您在使用mysqli_result时使用已经使用的$db->query() API。它仅在您使用mysqlnd作为驱动程序时可用。如果你在php 5.3+以下,这是默认的驱动程序,但是使用php 5.1或5.2(基本上,1& 1主机是在5.2之下),这并不总是那样。

    $stmt->execute();
    $result = $stmt->get_result()->fetch_all();
    foreach($result as $row){
       //handle your rows
    }
    

关于逃避:

  

mysql_real_escape_string(用htmlspecialchars($字符串))

在mysqli中,您可以使用mysqli_real_escape_string。关于数据库,htmlspecialchars函数是无用的。它仅用于显示。