跳到主要内容

PHP在将数据存储到数据库之前如何转义数据?

参考答案:

在PHP中,当你要将数据存储到数据库时,为了防止SQL注入攻击,你应该始终转义或清理数据。有几种方法可以实现这一点,但最常见和推荐的方法是使用预处理语句(prepared statements)和参数化查询。

然而,如果你正在使用较旧的数据库扩展或出于某种原因不能使用预处理语句,你还可以使用以下函数来转义数据:

  1. mysqli_real_escape_string():这个函数用于转义在mysqli扩展中使用的字符串。
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");

if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    exit();
}

$data = $_POST['user_input'];
$escaped_data = $mysqli->real_escape_string($data);

$sql = "INSERT INTO my_table (column_name) VALUES ('$escaped_data')";

if ($mysqli->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $mysqli->error;
}

$mysqli->close();
  1. addslashes():这个函数用于返回在预定义字符前添加反斜杠的字符串。但请注意,addslashes()并不总是安全的,因为它不会考虑到所有的SQL注入场景。因此,更推荐使用mysqli_real_escape_string()或预处理语句。
$data = $_POST['user_input'];
$escaped_data = addslashes($data);
  1. PDO的预处理语句:如果你使用的是PDO(PHP Data Objects)扩展,你应该使用预处理语句和参数绑定来确保数据的安全性。
try {
    $pdo = new PDO("mysql:host=localhost;dbname=my_db", "my_user", "my_password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $data = $_POST['user_input'];
    $stmt = $pdo->prepare("INSERT INTO my_table (column_name) VALUES (:data)");
    $stmt->bindParam(':data', $data);
    $stmt->execute();

    echo "New record created successfully";
} catch(PDOException $e) {
    echo "Error: " . $e->getMessage();
}

$pdo = null;

在上面的PDO示例中,我们使用了:data作为占位符,并使用bindParam()方法将变量绑定到该占位符。这样,PDO会自动处理数据的转义和清理,从而防止SQL注入攻击。

总之,为了确保数据的安全性并防止SQL注入攻击,你应该始终使用预处理语句或适当的转义函数来处理用户输入的数据。