我想检测/阻止/转发外部访问者的直接请求。某些脚本只应显示在jQuery对话框中。
我目前的代码:
<script>
$(".dialog").click(function() {
// some code for validation
// ...
$("#dialog").load(this.href).dialog();
});
</script>
<a href="http://domain.de/path/to/form/" class="dialog">Open me in a dialog</a>
工作正常但是如果我在新的标签/窗口中打开此链接(例如,通过单击鼠标中键),表单将显示为“裸体”。
在这种情况下,我想将用户转发到提到的页面,例如:
if ($requester != $server) {
header ("Location: " . $_SERVER["HTTP_REFERER"];
}
如何检测$ requester和$ server?我不想阻止每个脚本或整个目录!
提前致谢!
答案 0 :(得分:3)
添加@Dharman建议的内容
jQuery为其所有名为HTTP_X_REQUESTED_WITH的ajax请求添加了一个标头,因此您可以在$_SERVER
全局数组中对此标头进行简单检查。
示例:
if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]) { // check if the request is ajax if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ){ // ajax content loading } header ("Location: index.php"); }
答案 1 :(得分:2)
if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"])
{
header ("Location: index.php");
}
答案 2 :(得分:1)
我在外部请求中输入了这些值:
[HTTP_HOST] => 104.219.42.237
[HTTP_REFERER] => http:// someurl.com
所以,我的解决方法是:
if (strpos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) !== FALSE) {
echo 'same origin/request';
} else {
echo 'different origin/request';
}
...
...
...
以前的解决方案不起作用的原因!
就我而言: $ _SERVER ['HTTP_REFERER'] =='http:// someurl.com'
同时 $ _SERVER [“ HTTP_HOST”]不包含“ http”或“ https”
所以
if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"])
不匹配
另一个答案
if( $_SERVER['REMOTE_ADDR'] == $your_Server_IP_Address)
不适用于本地主机
答案 3 :(得分:0)
是的,您可以使用$ _SERVER ['REMOTE_ADDR']检查请求发件人IP地址的远程地址。这样做:
if( $_SERVER['REMOTE_ADDR'] == $your_Server_IP_Address)
echo 'From same server';
else
echo 'from different server';
另一种可能的想法解决方案可能是使用nonce:
显示表单时,在其中放入一个隐藏的输入字段,其中包含 随机值
同时,将该随机值存储到会话中 对应用户。
提交表单时,请检查隐藏字段是否相同 值作为存储在会话中的值。
如果这两个值不相同,请拒绝使用提交的数据。
注意:这个想法通常用于帮助对抗CSRF - 并集成在某些框架的“表单”组件中(例如,Zend框架)。