我在网上找到了一些代码来实现访问我的数据库,以检索带有MIME扩展名的存储文件,并将该信息读取到我存储实际图像的目录中.Link to the code source

<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).然而,当我try 在此代码中使用它时,页面无法正确加载.以下是我的编码方式:

<?php
// This page uploads to 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,它不会完全加载页面.

推荐答案

SQL注入漏洞

您当前的方法将您的应用程序公开给serious SQL injections.您目前正在将session中的username直接插入到SQL查询中,这可以用于execute条任意SQL语句.

Solution:总是使用prepared个语句来减轻这种风险.

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

在上面的示例中,?字符用作User的占位符,而we bind使用bind_param作为实际值(来自$user).这确保该值被视为string,从而防止任何潜在的SQL注入.

改进的环路 struct

由于您在SQL查询中设置了... LIMIT 1,因此最多只能得到一个结果.因此,在循环内使用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;
}

Php相关问答推荐

调用woocommerce_customer_Save_add动作挂钩时发生致命错误

为WooCommerce中的特定用户角色指定促销价格

有条件的运费率基于购物车小计与WooPayments货币转换

使用正则表达式搜索两个子字符串(没有重叠/共享字符)

根据未用于变体的产品属性隐藏WooCommerce发货方式

使用PHP curl的Amazon SP API批处理调用

PHP MySQL求和子树并与父树累加

PHP从响应应用程序json获取文件代码和URL

WooCommerce中基于用户角色的不同产品差价

即使在WooCommerce购物车中添加了两次产品,也要将所有项目设置为空白行

我不明白为什么我收到未定义的数组键异常错误 - Laravel 9 PHP 8

如何正确判断 PHP 是否已正确配置为使用 DOMDocument?

尽管有use指令,PHP 类在其他文件中仍处于可见状态

WooCommerce订单支付页面上的附加支付订单按钮

设置GA4 PHP API的setSubject以允许访问所有管理员账户属性

优化后的标题:如何在WooCommerce我的帐户编辑表单中添加账单字段

如何在 laravel 中的同一个 slug 上显示不同的内容?

Laravel 10 单元测试看不到来自 Artisan Command 的数据库更改

无法在 Laravel 10 中安装 jenssegers/mongodb

fopen 功能不断向我发送我重新加载网页时已发布的重复版本的表单