难点就在于最后输出来的原码是
<script>
var xmlhttp;
if (window.ActiveXObject){
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}else{
  xmlhttp = new XMLHttpRequest();
}
xmlhttp.open("POST", "./test3.php", true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send("data="+document.referrer);
console.log(document.referrer);
xmlhttp.onreadystatechange = function(){
  if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
  }
};</script>success
那么有人可能会有方法,用php缓存,其实我也试过了
<?php
session_start();
class B{
function judge()
{
               ob_start();//比如加在这里
echo '<script>
var xmlhttp;
if (window.ActiveXObject){
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}else{
  xmlhttp = new XMLHttpRequest();
}
xmlhttp.open("POST", "./test3.php", true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send("data="+document.referrer);
console.log(document.referrer);
xmlhttp.onreadystatechange = function(){
  if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
  }
};</script>';
              ob_clean()();//比如加在这里
}
}
?>
输出的结果的确是去掉了<script>脚本,但同时里面的语句如,console.log(document.referrer);也不会执行了

解决方案 »

  1.   

    因为头部多了那一段javascript文件,我这里只是简单的输出了字符串,
    如果调用html模版,
    就会变成
    <script>*********</script>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html 
    w3c声明头部有js代码会影响样式表现的
      

  2.   

    这段函数的作用就是当执行一个类中方法的时候,先判断这个请求是不是来自于当前站点,如果是就执行,不是就不执行,
    用来防止跨站请求攻击的。
    本来打算使用$_SERVER['HTTP_REFERER']来做,但是这个服务端的参数是可以人为伪造的,只有本地的js代码里的
    document.referrer才是安全的,所以用这个来判断
      

  3.   

    看不明白需求,
    你都是PHP文件,如果要知道前一页面来源,用$_SERVER['HTTP_REFERER']就可以了,有必要这么麻烦搞JS吗
      

  4.   

    可以算是技术研究,防止CSRF攻击,就是跨站请求伪造
      

  5.   

    而且我对调用AJAX执行的那段代码也没信心,正确的做法是ajax返回成功后才继续操作,
    而我那样做可行性有待研究,
    其实也可以不用按我的思路,
    有什么好的方法来说说吧
      

  6.   

    可以变通一下,用cookie/session得到用户,得不到就报错。
    如果用户请求太频繁就屏蔽请求。然后用缓存实现的话性能应该还可以。