首页 > 解决方案 > PHP Prepared Statement vs mysqli_real_escape_string

问题描述

我在下面写了一些代码。我想知道两件事。

1. 我的代码有漏洞吗?

2. 我需要在准备好的语句中使用 mysqli_real_escape_string 吗?它会充当额外的安全层还是多余的?

使用的代码:

if ($_SERVER['REQUEST_METHOD'] == 'POST') 
{
$admin_type = mysqli_real_escape_string($conn, $_POST['admin_type']);
$position = mysqli_real_escape_string($conn, $_POST['position']);
$first_name = mysqli_real_escape_string($conn, $_POST['first_name']);
$last_name = mysqli_real_escape_string($conn, $_POST['last_name']);
$user_name = mysqli_real_escape_string($conn, $_POST['user_name']);
$email = mysqli_real_escape_string($conn, $_POST['email']);
$phone_number = mysqli_real_escape_string($conn, $_POST['phone_number']);
$passwd = mysqli_real_escape_string($conn, $_POST['passwd']);
$created_at = mysqli_real_escape_string($conn, $_POST['created_at']);
$about = mysqli_real_escape_string($conn, $_POST['about']);

$sql = "INSERT INTO admin_accounts (admin_type, position, first_name, last_name, user_name, email, phone_number, passwd, about) VALUES (?,?,?,?,?,?,?,?,?);";

$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)) {
    echo "SQL Error";
} else {
    mysqli_stmt_bind_param($stmt, "sssssssss", $admin_type, $position, $first_name, $last_name, $user_name, $email, $phone_number, $passwd, $about);
    mysqli_stmt_execute($stmt);
  {
    	$_SESSION['success'] = "Admin user added successfully!";
    	header('location: admin_users');
    	exit();
    }     
}
    
}

标签: phpsqlprepared-statementsql-injection

解决方案


一个古老的论点 PHP Prepared Statement 和 PHP mysqli_real_escape_string 不执行相同的功能,尽管两者都有相同的目标,即尝试以may不会对数据库造成损害的格式获取字符串或用户输入我使用该术语may是因为缺乏适当的验证仍然会导致同样的问题。

例如,用户在没有适当验证的情况下删除自己的帖子的删除查询用户可能会删除其他用户的帖子,用户甚至不需要 SQL 注入来存档。

string mysqli_real_escape_string ( mysqli $link , string $escapestr )

此函数用于创建可以在 SQL 语句中使用的合法 SQL 字符串。给定的字符串被编码为转义的 SQL 字符串,考虑到current character set of the connection现在这意味着 mysqli_real_escape_string 取决于您当前的字符集。

而准备好的语句将您的值/用户输入绑定到特定的Data type并指示您的 sql 将其视为此类,但这也取决于您指定数据类型。

基本上 mysqli_real_escape_string 将根据定义的字符集取出用户输入中的垃圾,而准备好的语句将确保用户输入中是否有任何垃圾,它只会被解释为您希望它被解释为通常作为用户垃圾:)

我想说的是,同时使用这两者并不是一个坏主意,但是保护您的数据库的责任落在了您的身上,开发人员采取一切必要和合乎逻辑的步骤来存档最大的安全性没有人关心被黑客入侵的网站有多快!!


推荐阅读