0

我正在尝试从同一目录中的外部 php 文件将新的元标记写入 html 文件。我将使用 jQuery 测试我的元标记是否存在,然后如果元不存在,则通过 ajax 调用 php 函数。所以在随后的页面加载中我很好。

我正在尝试构建一个函数来执行此操作,但可以在其中一个方面使用一些帮助。我无法保证包含开头标签的行将如何编写,所以我想这需要是某种形式的正则表达式。请看下面的代码:

// So the line with the opening head tag may for arguments sake look like this one below :
// <!DOCTYPE html><html lang="en" data-cast-api-enabled="true"><head>  <link id="css-680430062" rel="stylesheet" href="http://s.ytimg.com/yts/cssbin/www-core-vfl8iz0yT.css">

function insert_into_file($file_path, $text, $after = true) {
    $contents = file_get_contents($file_path);
    $insert_marker = ""; // this should be the line containing the opening head tag saved to the variable as a string
    $new_contents = preg_replace($insert_marker, ($after) ? '$0' . $text : $text . '$0', $contents);
return file_put_contents($file_path, $new_contents);

}

4

1 回答 1

0

为了向普通路人隐藏路径,我们将对它进行 base64 编码。任何知道这是什么的人都可能会尝试对它进行base64解码并注入.htaccess之类的东西,如果他们试图破解您的处理页面,这至少会让他们为之工作。对于此示例,您需要将var pathname = window.location.pathname;通过 ajax 编码的 base64 传递给处理器。

查看jquery base64

注意 这未经测试,取决于多种因素,包括系统上 Apache 用户对目录的写入权限。(我还假设您在检查 .htaccess 时使用的是 apache)。如果我在实时网站上运行它,我还会进行某种检查以确保运行它的 IP 是我自己的并将我自己列入白名单,这样如果 Googlebot 或 Yandex 访问您的网站,您就不会启动对你的服务器征税。

你也可以让它更新一个日志,所以如果页面已经改变,让它检查日志看它是否在那里,这样你就不会运行脚本两次。(不过这有点挑剔。)

处理器

<?php
//this assumes the page is base64 encoded in javascript or jquery.
if(!empty($_GET['p'])){
    $path_to_page = base64_decode($_GET['p']);
    if(preg_match('!\.(php|htm[l]?)$!',$path_to_page)){
        $path_to_file = $_SERVER['DOCUMENT_ROOT']."/$path_to_page";
        if(!is_file($path_to_file)){
            //if they passed something else, then 
            exit();
        } else {

            //we're trying to prevent injection
            if(!empty($_GET['id'])&&preg_match('!^\d+$!',$_GET['id'])){
                $user_id = $_GET['id'];
            } else {
                exit(); 
            }
            //open the file in read/write mode
            if($fp = fopen($path_to_file, 'w+')){

            //pull the page into a var for checking
            $page = fread($fp, filesize($path_to_file));

            if(!preg_match('!property\s*=\s*["\']fb:admins!is',$page)){
            //if it doesn't exist, then add it.
                $page = preg_replace('!</head>!i',"<meta property=\"fb:admins\" content=\"$user_id\">\n\n</head>",$page);
                if(fwrite($fp, $page))
                {
                    echo 'success';
                } else {
                    echo 'failure';}
                }

            fclose($fp);
           } else {
             echo 'failure';
           }
        }
    }
}
?>

要将其直接放在 head 标签之后,您将使用:

$page = preg_replace('!(<head[^>]+>)!i',"$1\n\n<meta property=\"fb:admins\" content=\"$user_id\">\n",$page);
于 2013-04-27T19:19:04.257 回答