【问题标题】:Have I successfully prevented an XSS attack with this code?我是否使用此代码成功阻止了 XSS 攻击?
【发布时间】:2016-07-23 08:17:42
【问题描述】:

所以基本上有人告诉我我的网站容易受到 XSS 攻击,所以我正在努力解决这个问题。有人告诉我 htmlspecialchars 方法是防止这种情况的好方法。

我做了这个功能

function _e($string){
    return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

我正在使用它,如下所示

$userName = _e($_POST['userName']);
$Pass = _e($_POST['password']);

问题:

1) XSS 攻击是否仅基于输入,还是我需要对警报和回显语句执行此操作?

2) 我是否成功阻止了以下页面中的 XSS 攻击?**

    <?php

    session_start();

    if(isset($_SESSION['user_id'])){
        header("Location: index.php");
    }

    function _e($string){
        return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
    }

    include '../includes/connection.php';
    $userName = _e($_POST['userName']);
    $Pass = _e($_POST['password']);



    if(!empty($userName) && !empty($Pass)){

        $sql = "SELECT * FROM Admins WHERE Username='$userName'";
        $sqlr = mysqli_query($connect,$sql);
        $sqlrow = $sqlr->fetch_assoc();
        $dbPass = $sqlrow['Password'];
        $hash = password_verify($Pass, $dbPass);

        if ($hash == 0){
            die("There was no password found matching what you have entered.");
        }else{
            $records = "SELECT * FROM Admins WHERE Username='$userName' AND Password='$dbPass' AND AdminLevel >=1";
            $results = mysqli_query($connect,$records);
            if ($results->num_rows == 1){
                $row = $results->fetch_assoc();
                $_SESSION['user_id'] = $row['ID'];
                $_SESSION['admin_level'] = $row['AdminLevel'];
                $_SESSION['user_name'] = $row['Username'];
                $easyName = $_SESSION['user_name'];
                $recordsS = "UPDATE `Admins` SET Status='1' WHERE Username='$userName'";
                $resultsS = mysqli_query($connect,$recordsS);
                header("Location: index.php");
            }else{
                $message = "Either you have entered the incorrect login information, or you account has not been approved yet.";
                echo "<script type='text/javascript'>alert('$message');</script>";
            }
        }
    }
?>
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>ServerSide Moderation Services</title>
        <link rel="stylesheet" href="../styles/mainStyles.css" type="text/css" />
        <link rel="stylesheet" href="../styles/loginFormStyle.css" type="text/css" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </head>
    <body class="body">
        <?php include '../includes/header.php'; ?>

        <div class="mainContent">
            <div class="logRegArea">
                <article class="leftContent">
                    <header>
                        <h2 class="loginArea" style="text-align:center">Login Below:</h2>
                    </header>
                    <content>
                        <div id="login">
                            <form action="../pages/login.php" method="POST">
                                <input type="text" placeholder="Enter Your Username" name="userName">
                                <input type="password" placeholder="Enter Your Password" name="password">
                                <input type="submit">
                            </form>
                        </div>
                    </content>
                </article>
            </div>
        </div>
        <footer class="mainFooter">
            <p>This website was developed by ROBLOX user: <a href="https://www.roblox.com/users/8869935/profile" title="Made by: wattleman">wattleman</a></p>
        </footer>
    </body>
</html>

【问题讨论】:

  • 密码请使用 PHP 的散列函数。永远不要存储纯文本密码!

标签: php html security


【解决方案1】:

直接回答你的两个问题:

1) 如果您的消息包含来自您的代码以外的任何来源的数据,请对其进行清理。什么都不相信。

2) 有点。不过,我在任何地方都看不到您的任何数据输出。

您需要在这里考虑两件事。

1) 通过在插入数据库之前将htmlspecialchars 应用于用户提供的数据,您已经修复了XSS 的大部分问题。但是,通常最好插入“原始”数据,并在将其回显到页面时应用htmlspecialchars。那是因为转换 html 实体对于生成 HTML 是有意义的,但仅此而已。如果您需要运行搜索、创建导出等,您可能会发现自己需要再次转换这些实体。

2) 您对 SQL 注入攻击持开放态度。 htmlspecialchars 提供零保护。您需要使用mysqli_real_escape_string 或参数化查询。更多信息here

【讨论】:

  • 感谢您的反馈。我唯一接受的就是原始数据。当我弹出警报时,我还需要使用特殊字符还是因为它是没有输入的回声,可以吗? 2) 我现在正在使用准备好的语句。
  • 如果消息来自 100% 受信任的来源,并且不可能包含未转义的 HTML 实体,例如您的硬编码文本,没有理由尝试对其进行清理
  • 我已经完全改变了这个问题。您介意检查一下并帮我找出问题吗?
  • 您应该创建一个新问题,而不是更改现有问题。
  • 嗯,我有一个计时器,我试图快速回答问题
猜你喜欢
  • 1970-01-01
  • 2015-11-10
  • 2019-12-11
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
相关资源
最近更新 更多