我是否正确插入数据(php+ MySQLi)


Do I insert data right (php+ MySQLi)?

我用来使用 MySQLi 插入数据的方法对吗?它有效,但它足够安全吗?

    $login = stripslashes($login);
    $login = htmlspecialchars($login);
    $password = stripslashes($password);
    $password = htmlspecialchars($password);
    $login = trim($login);
    $password = trim($password);

 $result2=mysqli_query($db,"INSERT INTO users (login,password) VALUES('$login','$password')");

每当您与php中的数据库进行交互时,您都需要记住一个清单:

  1. 正确设置连接,例如,确保在使用 pdo 时,将错误模式设置为 异常,并告诉它不要模拟预准备语句。使用以下代码设置连接属性:

    $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
  2. 获取数据时使用预准备语句和参数化查询。

使用 mysqli

    $stment = $dbConnection->prepare('SELECT * FROM users WHERE name = ?');
    $stment->bind_param('s', $name);
    $stment->execute();
    $result = $stment->get_result();
    while ($row = $result->fetch_assoc()) {
        // do something with $row
    }

使用 PDO

    $stment = $pdo->prepare('SELECT * FROM users WHERE name = :name');
    $stment->execute(array('name' => $name));
    foreach ($stment as $row) {
        // do something with $row
    }

准备好的查询背后的想法非常简单 - 查询和数据分别发送到SQL服务器。当我们随数据一起发送数据库查询时,数据可用于执行潜在的恶意查询。有关更多信息,请参阅此答案。

如果要动态添加标识符和语法关键字,请使用白名单。它基本上涉及检查用户输入是否是预期的输入,如下所示:

$orders  = array("name","price","qty"); //field names
$key     = array_search($_GET['sort'],$orders)); // see if we have such a name
$orderby = $orders[$key]; //if not, first one will be set automatically. smart enuf :)
$query   = "SELECT * FROM `table` ORDER BY $orderby"; //value is safe
  1. 如果您由于某种原因未使用预准备语句,则在使用 mysqli_real_escape_string 等函数插入/搜索数据库之前清理用户的输入
  2. 确保很好地处理异常和错误

使用 PDO .被认为比过时的MySqli更安全。

您也可以将以下函数用于同一事物。您可以使用以下函数准备直接在数据库查询中使用的最终字符串。此函数将处理几乎所有阻止SQL注入的事情,并从输入中清除有害或不需要的内容。

function cleanInputs($data) {
    $clean_input = array();
    if (is_array($data)) {
        foreach($data as $k = > $v) {
            $clean_input[$k] = cleanInputs($v);
        }
    } else {
        if (get_magic_quotes_gpc()) {
            $data = trim(stripslashes($data));
        }
        $data = strip_tags($data);
        $clean_input = trim($data);
    }
    return $clean_input;
}

事情取决于要求,您甚至可以相应地修改定义或逻辑。