Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Referer的PHP表单安全性_Php_Security_Xss - Fatal编程技术网

使用Referer的PHP表单安全性

使用Referer的PHP表单安全性,php,security,xss,Php,Security,Xss,我正在建立一个网站,让自己可以供用户输入。我想知道是否要编写一个函数,如: if(getenv("HTTP_REFERER") != 'http://www.myURL.com/submitArea'){ die('don\'t be an jerk, ruin your own site'); }else{ // continue with form processing } 足以防止跨站点表单提交 编辑:如果不是,防止表单从其他

我正在建立一个网站,让自己可以供用户输入。我想知道是否要编写一个函数,如:

if(getenv("HTTP_REFERER") != 'http://www.myURL.com/submitArea'){
        die('don\'t be an jerk, ruin your own site');   
    }else{
        // continue with form processing    
    }
足以防止跨站点表单提交


编辑:如果不是,防止表单从其他主机提交的最佳实践是什么?

否-
HTTP\u REFERER
可以在客户端自由欺骗,并且不是请求来源的可靠指示器

更新:我误读了关于跨站点伪造的部分:因此,检查referer是一种有效的安全措施,因为CSRF依赖指向受保护页面(受攻击用户有权限访问)的被操纵链接。用户@Rook是正确的

唯一的例外是,如果攻击可能发生在被攻击的web应用程序内部,例如通过注入恶意JavaScript代码。在这种情况下,referer检查是无用的,因为攻击来自“安全”URL,,但也可以说是基于会话或一次性令牌的解决方案,,因为恶意JavaScript可以触及该令牌,并且可以轻松检索该令牌


但是,为了防止此类攻击,最好使用一次性令牌,因为HTTP\u REFERER会被一些代理删除。

使用会话很可能是防止跨站点表单提交的更好途径。

实际上是的,根据报告,在大多数情况下,检查referer足以修补CSRF漏洞。虽然在您的浏览器上欺骗推荐人是微不足道的,但在另一个浏览器上欺骗推荐人(通过CSRF)是不可能的,因为它是


事实上,在内存不足的嵌入式网络硬件上,检查referer非常常见。摩托罗拉为他们的冲浪板电缆调制解调器做这件事。我知道这是第一手资料,因为他们用推荐人检查来修补它。该漏洞的严重性指标为13.5,根据国土安全部的数据,这是迄今为止发现的最危险的CSRF漏洞,也是有史以来最危险的1000个软件漏洞中的一个。

是的,它是安全的。

不幸的是,政府鼓励提供一个选项来禁用推荐人(但是你仍然不能发明你自己的推荐人机制);因此,确实有人可以禁用浏览器上的推荐人,从而拒绝自己访问您的网站

您的解决方案是安全的,但是如果您的站点只支持推荐人,用户可以合法地投诉

这是非常可悲的,因为现在这意味着没有理智的方法来确保你的网站不受CSRF的影响

备选方案

您真正可以做的另一件事是在对web服务的每个经过身份验证的请求中添加一个。然而,这有点危险,因为您必须确保web服务上的每个请求点都验证nonce。然而,您可以使用一个框架来为您完成这项工作,从而在某种程度上消除这种烦恼。堆栈溢出本身似乎正在使用nonce

但是

推荐人原则上更安全,因为您可以应用一个全局规则,即除非推荐人在同一个域中,否则不会发生任何请求。如果您愿意删除禁用推荐者的用户,这是可以接受的

与人们在这里所说的胡说八道相反,不能使用来自非特权浏览器代码的伪造头发出HTTP请求。正如预期的那样,我们能够这样做一次,以绕过依赖于推荐人的反csrf,但它被修补了。为什么要打补丁?因为HTTP RFC规定了引用者是什么,因此,不允许在客户端代码中更改它的含义,以免客户端不安全

这里甚至有人声称Java小程序可以通过HTTP向另一个域发出任意头,但事实并非如此,因为沙盒Java小程序不允许向任何对象发出请求,加载它的域除外。在任何人纠正他之前,他很快删除了自己的评论

案例说明

web浏览器是HTTP客户端。HTTP客户端必须符合HTTP RFCs;因此,它必须遵守RFC声明的referer头应该是什么样子。由于web浏览器是HTTP客户端,因此嵌入在web浏览器中的任何应用程序都不能发出违反HTTP协议的请求。事实上,每一次违反标准都是一个潜在的安全漏洞


在任何情况下:没有合适的方法来确定请求是来自您的域还是来自对手的域。这只是web的许多可悲缺陷之一。您必须使用上述解决方法之一。

虽然无法在另一个用户的浏览器中欺骗
引用者,但除了一些用户代理根本不发送引用者之外,欺骗缺少引用者(例如使用元刷新)也很容易

所以,要么你允许缺少推荐人,并提供非防水XSRF保护,要么你需要一个与你的网站匹配的推荐人,在这种情况下,你的可访问性会受到很大影响。如果唯一使用脚本的人是您,并且您知道您将始终使用浏览器/防火墙/代理/etc组合来可靠地传递引用者,那么这种攻击可能是可以接受的。但对于你期望其他人使用的任何东西,这通常都不是一个好主意

Referer
是一种非常弱的抗XSRF机制。最好使用服务器发出的每个用户/事件令牌,该令牌必须返回到服务器以验证提交

$query=“从
用户
中选择*,其中
名称
=“$name”

潜在的SQL注入漏洞。请使用
mysql\u real\u escape\u string
或参数化查询

setAttribute('name','add_bar')

input.setAttribute('值','')

input.name= 'add_bar';
input.value= <?php echo json_encode(generate_session_token(), JSON_HEX_TAG); ?>;