在个人资料页面上上传“个人资料图片”

Uploading "Profile Image" on Profile Page

提问人:Antonio 提问时间:10/31/2023 最后编辑:Ere MännistöAntonio 更新时间:11/1/2023 访问量:45

问:

我在网上找到了一些代码来访问我的数据库,以检索带有 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>

我喜欢使用或每当我访问我的 .但是,当我将页面与此代码一起使用时,该页面无法正确加载。dieexit(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

PHP MySQL 数据库 安全

评论

0赞 Nico Haase 11/6/2023
这回答了你的问题吗?如何防止PHP中的SQL注入?

答:

1赞 Ere Männistö 10/31/2023 #1

SQL 注入漏洞

您当前的方法使您的应用程序暴露于严重的 SQL 注入。您当前正在将 from 直接插入到查询中,这可以用于任意语句。usernamesessionSQLexecuteSQL

解决方案:始终使用语句来降低此风险。prepared

$stmt = $db->prepare("SELECT image_file01 FROM test WHERE User=? LIMIT 1");
$stmt->bind_param("s", $user);

在上面的示例中,该字符用作 的占位符,我们使用 的实际值 (from) 使用 .这可确保将该值视为 ,防止任何潜在的注入。?Userbind$userbind_paramstringSQL

改进循环结构

由于已在查询中设置,因此最多只能获得一个结果。因此,在循环内使用是不必要的。此外,由于您只获取一个结果,因此检查比循环更合适。... LIMIT 1SQLexitifwhile

下面是一个示例,如何使用语句来简化逻辑: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() 函数。我替换了所有粗略的字符,然后将其存储到变量中,并将其传输到我的数据库中。据您所知,这样做是否存在任何重大安全风险?