我了解cookie httpOnly的目标,因为我们无法使用document.cookie来获取cookie信息(例如XSS攻击),因此该系统仍然可以防止cookie攻击。
我用flask和PHP制作了一个POC来实践这个概念。
@app.route('/api/connexion', methods=['POST'])
def conn():
login = request.form["login"]
password = request.form["password"]
response = make_response(jsonify({
'login':login,
'password': password
}))
response.set_cookie('token', 't1',httponly=True)
return response
php代码:
myForm = document.getElementById("myForm")
myForm.addEventListener('submit', (e) => {
console.log("in event");
e.preventDefault();
let form = new FormData(myForm);
fetch("http://127.0.0.1:8000/api/connexion",{
method:'POST',
body:form
}).then((response) => {
return response.json();
}).then((text)=> {
console.log(text);
})
})
问题是:我是否需要获取cookie并手动保存它,否则cookie将在每个请求中自动发送,我想了解如何。
非常感谢您。
答案 0 :(得分:0)
只要日期是将来的日期,浏览器就会自动保存cookie。日期过后,浏览器将“抛出” cookie,并将停止使用它。 add expiration date to your cookie
是好的做法浏览器保存cookie后,它将在请求的最个请求中将其发送到cookie中指定的域。
在您的示例中-浏览器不会发送您刚刚定义的新令牌Cookie。这是因为有fetch specification,您可以在凭据下查看。
在创建新的提取请求时,请确保init对象中包含{"credentials":"same-origin"}
。
myForm = document.getElementById("myForm")
myForm.addEventListener('submit', (e)=>{
console.log("in event");
e.preventDefault();
let form = new FormData(myForm);
let fetchInitObject = {
method: 'POST',
body: form,
/*
The following line will tell the browser
to send all the cookies of the site in the URL, as long as
the url and the site that runs the Javascript code are from the same origin
In your example - the side that runs the javascript code, should be 127.0.0.1 in port 8000, without http
*/
credentials: 'same-origin'
};
fetch("http://127.0.0.1:8000/api/connexion", fetchInitObject).then((response)=>{
return response.json();
}
).then((text)=>{
console.log(text);
}
)
}
)