我在下面写了一些代码。我想知道两件事。
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();
}
}
}
答案 0 :(得分:1)
转义相对于使用查询参数是多余的。如果您还使用绑定的查询参数,请不要使用转义。您最终将获得数据库中包含文字反斜杠的数据。
只需使用查询参数。与所有对mysqli_real_escape_string()
的调用相比,绑定参数更容易,更简单。
使用PDO更容易,因为您甚至不需要进行绑定。
示例:
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$param_keys = ['admin_type'=>null, 'position'=>null, 'first_name'=>null,
'last_name'=>null, 'user_name'=>null, 'email'=>null, 'phone_number'=>null,
'passwd'=>null, 'created_at'=>null, 'about'=>null];
// make sure the params include all keys in $param_keys,
// but no keys that aren't in $param_keys
$params = array_merge($param_keys, array_intersect_key($_POST, $param_keys));
$sql = "
INSERT INTO admin_accounts
SET admin_type = :admin_type,
position = :position,
first_name = :first_name,
last_name = :last_name,
user_name = :user_name,
email = :email,
phone_number = :phone_number,
passwd = :passwd,
about = :about";
$stmt = $pdoConn->prepare($sql);
$stmt->execute($params);
$_SESSION['success'] = "Admin user added successfully!";
header('location: admin_users');
}
答案 1 :(得分:1)
一个古老的参数PHP预处理语句和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取决于您当前的字符集。
while预准备语句将您的值/用户输入绑定到特定的Data type
,并指示您的sql对其进行此类处理,但这也取决于您指定数据类型。
基本上,mysqli_real_escape_string将根据定义的字符集清除用户输入中的垃圾,而准备好的语句将确保用户输入中是否有任何垃圾将仅按您希望的方式进行解释,通常作为用户垃圾:)
我想说的是同时使用这不是一个坏主意,但是保护数据库却落在了您身上,开发人员必须采取一切必要和合乎逻辑的步骤来归档最大的安全性,没人在乎被黑客入侵的网站有多快!! < / p>