【问题标题】:How to use MySQLi securely?如何安全地使用 MySQLi?
【发布时间】:2013-02-25 07:49:21
【问题描述】:

所以我最近转而使用 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->query($current) or die($mysqli->error.LINE);

第一个问题,这样的方式正确吗?

它如何比 mysql_ 方法更安全? (听说可以防止打针什么的)

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

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

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

谢谢!

【问题讨论】:

标签: php mysql mysqli


【解决方案1】:

关于你的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。它允许您使用在使用$db->query() 时已经在使用的mysqli_result API。它仅在您使用 mysqlnd 作为驱动程序时可用。如果您使用的是 php 5.3+,这是默认驱动程序,但使用 php 5.1 或 5.2(基本上,1&1 hoster 低于 5.2)并不总是这样。

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

关于转义:

mysql_real_escape_string(htmlspecialchars($string))

在 mysqli 中,你可以使用mysqli_real_escape_stringhtmlspecialchars 函数在涉及数据库时毫无用处。仅供展示。

【讨论】:

  • 这里的mysql库不等价,因为mysqli使用连接转义
  • 在他的查询中,他没有使用 mysql_real_escape_string。此外,从 php 5.3 开始,可以(并且可能是强制性的)在 mysql_real_escape_string 函数中提供连接参数。 mysqli 的优势在于持久连接、prepared statement 和 MYSQL 5.1+ 功能支持。
  • 啊,我的错。 mysqli > mysql,但我从来没有对 ext/mysql 中的连接转义感到陌生
  • 嘿!我很难理解准备好的语句部分:(如果我只是 mysql 转义我的 POST 或 GET,它会不会起作用? $current = "UPDATE hi set user=$user"; $exec = $connect->query($current ) 或 die($mysqli->error.LINE); $user 将被 mysql 真正转义。
  • @Jason No. 阅读我在您的问题下链接到的大量信息。学习准备好的陈述。它们并不难。
猜你喜欢
  • 1970-01-01
  • 2011-06-29
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多