cookie和session
http是一种无状态的协议,所以客户端每次发出请求时,下一次请求无法得知上一次请求所包含的状态数据,也就是说影响我们浏览资源的交互性体验变差。
比如我们登录后台管理页面,当我们已经在登录状态下,每次在更换功能点就不用在每次都要进行登录。从而大大提升我们使用体验
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议: 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在COOKIE中
session和cookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。
Token
token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查。
XSS跨站脚本攻击
反射型XSS攻击
反射型XSS通过将恶意脚本注入到应用程序中的输入数据中,然后将该数据“反射”回给用户,从而使用户的浏览器执行恶意脚本。这种漏洞通常发生在应用程序未正确过滤或转义输入数据的情况下。
要防止反射性XSS漏洞,你可以采取以下措施:
-
对输入数据进行严格的验证和过滤,确保不允许插入恶意脚本。
-
使用合适的编码来转义输出数据,如HTML编码、JavaScript编码等。
-
在开发过程中,避免直接将用户提供的数据插入到页面内容中,而是通过模板引擎或专门的输出函数进行输出。
-
使用HTTP标头中的内容安全策略(CSP)来帮助减少XSS攻击的风险。
反射型:与服务端交互,但是交互的数据一般不会被存在数据中,是一次性,所见即所得一般出现在查询类页面
存储型:与数据库交互,永久性的,一般出现在留言板,注册等页面
DOM型:不与后台服务器数据交互,是一种通过DOM操作前端代码输出的时候产生的漏洞,大部分属于反射型,少部分属于存储型
举例
执行恶意脚本
<script>alert(document.cookie)</script>
获取用户名密码脚本
将xss程序放到网站根目录并命名为auth.php:
<?php
// check if the form was submitted
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// get the username and password from the form
$username = isset($_POST['username']) ? $_POST['username'] : "";
$password = isset($_POST['password']) ? $_POST['password'] : "";
// check if the credentials are valid
if ($username === 'jksdyf7y3748723@#@%' && $password === 'jksdyf7y3748723@#@%') {
// redirect to the dashboard or homepage
header('Location: dashboard.php');
exit;
} else {
// redirect back to the login page with an error message
$error_message = 'Invalid username or password. Please try again.';
header('Location: auth.php?error=' . urlencode($error_message));
exit;
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Login</title>
<style>
body {
font-family: sans-serif;
background-color: #f1f1f1;
padding: 20px;
}
form {
background-color: #fff;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
padding: 20px;
max-width: 400px;
margin: 0 auto;
}
label {
display: block;
font-weight: bold;
margin-bottom: 5px;
}
input[type="text"],
input[type="password"] {
border: 1px solid #ccc;
border-radius: 3px;
padding: 5px;
width: 100%;
margin-bottom: 10px;
box-sizing: border-box;
}
button[type="submit"] {
background-color: #007bff;
color: #fff;
border: none;
border-radius: 3px;
padding: 10px 20px;
cursor: pointer;
}
button[type="submit"]:hover {
background-color: #0069d9;
}
.error {
color: #f44336;
margin-top: 10px;
}
</style>
</head>
<body>
<form action="auth.php" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required>
<button type="submit">Login</button>
<?php
// check if an error message was passed in the URL
if (isset($_GET['error'])) {
$error_message = $_GET['error'];
echo '<p class="error">' . $error_message . '</p>';
}
?>
</form>
</body>
</html>
存储型
评论,注册,登录等,以上是用户交互进行输入输出的地方
过滤:
大小写转换
<img ONerror = 'alert(document.cookie)' src = "#">
<script>document.body.innerHTML=''<div style=visibility:visible;><h1>THIS WEBSITE IS UNDER ATTACK</h1></div>";</script>
DOM 型号:
ll' onclick="alert(document.cookie)">
XSS -payload
bp+XSSValidator
工具:xsstrike
地址:GitHub - s0md3v/XSStrike: Most advanced XSS scanner.
XSS绕过
XSS防止手段
使用 HttpOnly 属性
服务器对输入脚本进行过滤或转码
CSRF
拿到A的客户端cookie信息,然后在B的客户端输入cookie,从而实现客户端请求伪造,拿到A的信息
所以就像pikachu说的:和XSS的区别,CSRF是借助用户权限进行攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取用户的权限,进而实施破环。
所以防范措施就是对敏感信息进行操作:比如增加更加安全的token。对敏感信息的操作增加安全的验证码;对敏感信息的操作实施安全的逻辑程序,比如修改密码时,需要先校验旧密码等
CSRF防止手段
验证请求的来源站点Referer
CSRF Token
XSS和CSRF的区别
CSRF需要用户先登录网站,获取cookie,XSS不需要登录则直接可以攻击。 XSS更像漏洞,CSRF更像攻击,xss是一种存在在网站的中的漏洞,攻击者可以利用这些漏洞进行攻击,而CSRF则是一种黑客的攻击手段。 只要有XSS,就可以发起CSRF类似攻击。
CSRF、SSRF的区别
CSRF:是服务器端没有对用户提交的数据进行随机值校验,且对http请求包内的refer字段校验不严,导致攻击者可以利用用户的Cookie信息伪造用户请求发送至服务器。 SSRF:是服务器对用户提供的可控URL过于信任,没有对攻击者提供的RUL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或其他服务器。