簡體   English   中英

如何使用帶有 SSL 的 mysqli 連接

[英]How to use mysqli connection with SSL

我正在嘗試與我的數據庫建立安全連接

我寫了以下代碼:

<?php

// form filled?
if (isset($_POST['submit'])) {
    $user = 'gebruiker';
    $pass = 'gebruiker';
    $db = new mysqli('localhost', $user, $pass, 'forum');
    if (mysqli_connect_errno()) {
        echo 'database doesnt work';
        file_put_contents('MySQLiErrors.txt', date('[Y-m-d H:i:s]') .          mysqli_connect_error() . "\r\n", FILE_APPEND);
        exit();
    } else {
        $username = $_POST['username'];
        $userspassword = $_POST['password'];
        $salt = strrev($userspassword . substr(0, 4));
        $password = hash('sha512', $userspassword . $salt);
        $statement = $db->prepare("SELECT id,username FROM user WHERE username = ? AND password = ?");
        $statement->bind_param("ss", $username, $password);
        $statement->execute();
        $result = $statement->get_result();
        $statement->close();
        $count = $result->num_rows;
        if ($count > 0) {
            session_start();
            $_SESSION["username"] = $username;
            header("Location: forum.php");
        } else {
            $_SESSION['Error'] = "Invalid username or password";
        }
    }
    $db->close();
}

我還在 php.net 上閱讀了一些關於 SSL 連接的內容,但我不知道如何在這種情況下實現這一點。

http://php.net/manual/en/mysqli.ssl-set.php

我的代碼在 fedora 21 上運行並且運行良好,但接下來我想要的是使用 SSL 的安全連接。

您不需要客戶端證書和私鑰,並且在大多數情況下,您不希望 MySQL 服務器驗證客戶端證書。

然而,客戶端必須使用 CA 證書驗證服務器證書以防止 MITM。

<?php
$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
$mysqli->ssl_set(NULL, NULL, "/etc/ssl/certs/ca-bundle.crt", NULL, NULL);
$mysqli->real_connect('hostname', 'user', 'password', 'database');
$mysqli->close();
?>
<?php
$con=mysqli_init();
if (!$con)
  {
  die("mysqli_init failed");
  }

mysqli_ssl_set($con,"key.pem","cert.pem","cacert.pem",NULL,NULL); 

if (!mysqli_real_connect($con,"localhost","my_user","my_password","my_db"))
  {
  die("Connect Error: " . mysqli_connect_error());
  }

// Some queries...

mysqli_close($con);
?>

連接 - 必需。 指定要使用的 MySQL 連接


鍵 - 必需。 指定密鑰文件的路徑名
證書 - 必需。 指定證書文件的路徑名
ca - 必需。 指定證書頒發機構文件的路徑名
資本 - 必需的。 指定包含 PEM 格式的可信 SSL CA 證書的目錄的路徑名
密碼 - 必需。 指定用於 SSL 加密的允許密碼列表


來源在這里

對於 mysql_real_connect 使用

<?php ini_set ('error_reporting', E_ALL); ini_set ('display_errors', '1'); error_reporting (E_ALL|E_STRICT); $db = mysqli_init(); mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true); $db->ssl_set('/etc/mysql/ssl/client-key.pem', '/etc/mysql/ssl/client-cert.pem', '/etc/mysql/ssl/ca-cert.pem', NULL, NULL); $link = mysqli_real_connect ($db, 'ip', 'user', 'pass', 'db', 3306, NULL, MYSQLI_CLIENT_SSL); if (!$link) { die ('Connect error (' . mysqli_connect_errno() . '): ' . mysqli_connect_error() . "\\n"); } else { $res = $db->query('SHOW TABLES;'); print_r ($res); $db->close(); } ?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM