提问人:Antonio 提问时间:10/31/2023 最后编辑:Ere MännistöAntonio 更新时间:11/1/2023 访问量:45
在个人资料页面上上传“个人资料图片”
Uploading "Profile Image" on Profile Page
问:
我在网上找到了一些代码来访问我的数据库,以检索带有 mime 扩展名的存储文件,并将该信息读取到我存储实际图像的目录中。链接到代码源
<div id="display-image">
<?php
$query = " select * from image ";
$result = mysqli_query($db, $query);
while ($data = mysqli_fetch_assoc($result)) { ?>
<img src="./image/<?php echo $data['filename']; ?> ">
<?php } ?>
</div>
我喜欢使用或每当我访问我的 .但是,当我将页面与此代码一起使用时,该页面无法正确加载。die
exit(0)
database
这是我编码它的方式:
<?php
// This page uploads the profile pic into the profile page
include("database_connection.php");
$user = $_SESSION['active_user']['username'];
$get_img = "SELECT * FROM test WHERE User='$user' LIMIT 1";
$runit = mysqli_query($db,$get_img);
while($pic = mysqli_fetch_assoc($runit)) { ?>
<img src="img/<?php echo $pic['image_file01']; ?>" ><?php
exit(0);
}
?>
因此,上面的代码位于一个单独的文件中,我将其包含在我的个人资料页面上,如下所示:
<div class="body-align-left">
<br><br>
<!-- Profile Image-->
<?php include('upload.php'); ?>
</div>
尽管代码看起来工作正常,但我不确定使用 while 语句是否是解决此问题的黄金方法。此外,我想知道此代码的安全性如何。有什么更好的方法?正如我所说,如果我尝试使用或在代码块内,则不会完全加载页面。exit(0)
die
答:
1赞
Ere Männistö
10/31/2023
#1
SQL 注入漏洞
您当前的方法使您的应用程序暴露于严重的 SQL 注入。您当前正在将 from 直接插入到查询中,这可以用于任意语句。username
session
SQL
execute
SQL
解决方案:始终使用语句来降低此风险。prepared
$stmt = $db->prepare("SELECT image_file01 FROM test WHERE User=? LIMIT 1");
$stmt->bind_param("s", $user);
在上面的示例中,该字符用作 的占位符,我们使用 的实际值 (from) 使用 .这可确保将该值视为 ,防止任何潜在的注入。?
User
bind
$user
bind_param
string
SQL
改进循环结构
由于已在查询中设置,因此最多只能获得一个结果。因此,在循环内使用是不必要的。此外,由于您只获取一个结果,因此检查比循环更合适。... LIMIT 1
SQL
exit
if
while
下面是一个示例,如何使用语句来简化逻辑:if
// First execute the prepared query
if ($stmt->execute()) {
// Get the results:
$result = $stmt->get_result();
// If a profile image is found, echo the image
if ($row = $result->fetch_assoc()) {
echo '<img src="img/' . $row['image_file01'] . '" >';
}
// No images were found. Here, you do whatever you want.
// For example, display a default profile image.
// If you want nothing to happen, you can remove this
// else statement completely.
else {
echo "No image found.";
}
}
// Prepared query failed
else {
echo "Database error: " . $stmt->error;
}
评论
0赞
Antonio
10/31/2023
很棒的信息!这正是我希望学习的!谢谢!
1赞
Ere Männistö
10/31/2023
欢迎您来到 Stack Overflow!我强烈建议您阅读有关SQL注入的更多信息,因为它们可能会导致严重的问题。我添加了一个指向上一个答案的链接。这篇文章非常适合初学者,易于理解。
0赞
Antonio
11/1/2023
我现在要检查你的链接。我非常感谢您的信息!我认为运行查询的唯一方法是通过 mysqli_query() 函数。我真的很喜欢准备好的语句,所以我根据这些准备好的语句重新编码了我的整个寄存器/登录名。只是额外的信息,我确实对所有传入的查询使用 preg_replace() 函数。我替换了所有粗略的字符,然后将其存储到变量中,并将其传输到我的数据库中。据您所知,这样做是否存在任何重大安全风险?
评论