要努力啊啊啊!! 2024-06-24 23:19 采纳率: 50%
浏览 9

安全 开发 自己想搭建一个靶场

有没有人帮忙看看,自己想写一个存储型xss评论区,结果插入JavaScript语句不会被当做JavaScript语句执行,代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="xss.php"  method="post">
        <label>用户名:</label></br>
        <input type="text" name="username"></br>
        <label>评论:</label></br>
        <input type="text" name="message"></br>
        <input type="submit" value="提交">

    </form>
    <div id="container">

    </div>
    
</body>
<script>
    var div = document.getElementById('container');
    window.onload = function showMessageList(){
        fetch('show_message.php')
            .then(response=>response.json())
            .then(data=>{
                data.forEach(message => {
                    var user = message.user;
                    var mes = message.message;
                        var create_div = document.createElement('div');
                        create_div.innerHTML = user + mes;
                        container.appendChild(create_div);
                });
           //     document.getElementById('data_container').innerHTML = 'user:'+data['user']+';'+'message:'+data['message'];

            //     })
             
    })
     }
</script>

</html>

后端


<?PHP

$sql_server='127.0.0.1';
$sql_user = 'root';
$sql_passwd = 'root';
$sql_db = 'test';

$db_con = mysqli_connect($sql_server,$sql_user,$sql_passwd,$sql_db);
if(!$db_con){
    die('连接失败'.mysqli_connect_error());
}

$sql2 = "select username,message from content;";
$query = $db_con->query($sql2);
$row = $query->fetch_all();
$list = [];
foreach($row as $mes){
    $user=$mes[0];
    $message = $mes[1];
    $dir =  ['user'=>$user,'message'=>$message];
    array_push($list,$dir);
}
$json_str = json_encode($list);
header('Content-type:application/json');
echo $json_str;



?>
  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-24 23:19
    关注

    引自免费微信小程序:皆我百晓生

    在您的HTML文件中,您尝试将用户输入的文本作为JavaScript函数调用来运行。这会导致一些潜在的安全风险,因为用户输入可能会包含恶意JavaScript代码。

    要解决这个问题,您可以采取以下几个步骤:

    步骤 1:去除JavaScript函数调用

    首先,删除window.onload中的JavaScript函数调用部分,以免引发安全问题。

    步骤 2:限制脚本类型

    确保仅允许HTML5 script 标签中的脚本加载。通过添加 type="text/javascript" 属性到所有<script>标签,可以防止JavaScript注入攻击。

    步骤 3:验证数据

    对用户的输入进行更严格的验证,例如检查是否包含敏感信息(如密码、信用卡号等),并将其转换为易于理解的数据格式。

    步骤 4:使用安全方法

    考虑使用服务器端的验证技术,而不是客户端验证。这样可以减少跨站请求伪造(CSRF)的风险,并且可以更好地控制数据流。

    步骤 5:清理输出

    确保在处理用户输入时只保留必需的信息,并及时清除不必要的内容,比如日志记录和临时变量。

    HTML 文件修改示例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <form action="xss.php" method="post">
            <label for="username">用户名:</label></br>
            <input type="text" name="username"><br>
            <label for="message">评论:</label><br>
            <textarea name="message" rows="10" cols="30"></textarea><br>
            <input type="submit" value="提交">
        </form>
        <div id="container"></div>
    
        <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
        <script>
            $(document).ready(function () {
                $('#container').load("get_messages.php", function (data) {
                    console.log(data);
                });
            });
        </script>
    </body>
    </html>
    

    后端文件示例:

    <?php
    
    // 这里是后端代码示例,用于获取和显示消息
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "test";
    
    $conn = new mysqli($servername, $username, $password, $dbname);
    
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    
    $sql = "SELECT * FROM messages ORDER BY timestamp DESC LIMIT 10";
    $result = $conn->query($sql);
    
    while ($row = $result->fetch_assoc()) {
        echo "<p>$row[username] - $row[message]</p>";
    }
    
    $conn->close();
    
    ?>
    

    总结:

    确保始终遵循最小权限原则,只提供必要的API给前端应用程序。对于任何可能的输入,都应进行严格的数据验证和过滤。同时,始终谨慎对待浏览器提供的功能,特别是那些涉及到动态网页渲染的功能。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月24日

悬赏问题

  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表