使用会话禁用网站外部的post请求(php安全)

使用会话禁用网站外部的post请求(php安全),php,security,Php,Security,我想禁用从其他url或软件发送的post请求(CSRF攻击) 请注意:(我不想为我的表单设置csrf令牌input) 如果用户登录后我在会话中设置csrf令牌,是否接受? 谢谢如果你想避免CRSF,你没有任何好的选择。$\u SERVER['HTTP\u REFERER']变量经常被设置,并且通常与请求来自的网站相对应,因此您可以使用它来阻止一些外部请求。但是,与来自浏览器的所有数据一样,未经验证,您无法信任它,因此不应将其视为安全数据: 这是由用户代理设置的。并非所有用户代理都将设置此项,并且

我想禁用从其他url或软件发送的post请求(CSRF攻击) 请注意:(我不想为我的表单设置csrf令牌input

如果用户登录后我在会话中设置csrf令牌,是否接受?
谢谢

如果你想避免CRSF,你没有任何好的选择。
$\u SERVER['HTTP\u REFERER']
变量经常被设置,并且通常与请求来自的网站相对应,因此您可以使用它来阻止一些外部请求。但是,与来自浏览器的所有数据一样,未经验证,您无法信任它,因此不应将其视为安全数据:

这是由用户代理设置的。并非所有用户代理都将设置此项,并且 有些提供了修改HTTP_REFERER的功能。在里面 简言之,它真的不可信

CSRF检查是防止外部域发出请求的最佳选择。如果你不想的话,你不必把它作为输入加入你的表格中;您可以改为使用cookie和标题:

1。当用户登录时,使用PHP的
setcookie
在cookie中存储令牌。在用户会话中存储匹配的令牌以及过期日期

$token = '...'; //<- look up how to generate a good random token
$expire = time()+1800; //expire in 30 minutes
setcookie("XSRF-TOKEN", $token, $expire);  /* expire in 1 hour */
$_SESSION['XSRF-TOKEN'] = ['token'=>$token, 'exp'=>$expire];
如果你担心必须更新一个大网站,这是你最好的选择。您可以指示浏览器在任何时候发出HTTP请求时运行Javascript函数。此函数可以读取cookie并设置标头。许多框架都会为您这样做,但对于香草JS,请看

3.每当PHP脚本收到请求时,首先查找此头的值,然后将其与您在用户会话中保存的值进行比较。记得检查过期时间

$request_token = apache_request_headers()['X-XSRF-TOKEN']? : null;
$session_token = $_SESSION['XSRF-TOKEN'];
if($request_token===null) die('Token is missing');
if($session_token['exp'] < time()) die('Token has expired');
if($session_token['token']!==$request_token) die('Token is invalid');
//safe to continue. Repeat step 1 to set a fresh token
$request\u token=apache\u request\u headers()['X-XSRF-token']?:无效的
$session_token=$_session['XSRF-token'];
如果($request_token==null)死亡('token丢失');
如果($session_token['exp']

只有能够读取
XSRF-TOKEN
cookie的域才知道要在头中设置什么值。由于浏览器不允许一个域从另一个域读取cookie,因此此机制将保护您免受来自错误源的请求的影响。而且它可以按照您的要求将csrf位保留在表单之外。

不在表单中使用csrf令牌的原因是什么?什么都比不上it@ClaudioPinto因为我有很多表格没有这个!!那你的系统就不安全了。进行这种重构并不困难,如果使用某种框架和MVC方法,您可以在一个小时左右的时间内完成100个表单。CSRF是暂时的代币,这就是it@ClaudioPinto但是如果我在我的页面顶部(在我的配置文件中)写入。。。这将是安全的。不会吗?不太可能,尽管CSRF可以存储在临时会话中,并为在该会话之后立即过期的唯一请求生成。您所建议的只是一个会话变量,正是如此,谢谢。但是它能安全地抵御XSS攻击吗?比如:警报(document.cookie);对于黑客?不。
XSS
是一种不同的攻击类型,与您所问的主题完全不同。“禁用来自国外网站和应用程序的post请求”是关于CSRF的
。在表单中放置令牌也不会保护您免受
XSS
攻击。我的意思是我想在javascript for XSS中禁用访问cookie。但是你说(当你的站点发出请求时,使用Javascript从document.cookie中读取令牌,并将下面的标题设置为完全相同的值:)对不起,如果我junior@belletJuice要让上面的CSRF方案工作,Javascript必须能够读取cookie。如果您不希望表单中出现csrf,也不希望JS看到令牌,则无法保护自己不受csrf的影响。保护您的站点免受
XSS
攻击是另一个问题。要了解如何处理它,请阅读并
$request_token = apache_request_headers()['X-XSRF-TOKEN']? : null;
$session_token = $_SESSION['XSRF-TOKEN'];
if($request_token===null) die('Token is missing');
if($session_token['exp'] < time()) die('Token has expired');
if($session_token['token']!==$request_token) die('Token is invalid');
//safe to continue. Repeat step 1 to set a fresh token