理解PHP中的一些代码

理解PHP中的一些代码,php,ruby,Php,Ruby,我是一个学习Ruby的noob程序员,我决定编写一个SERP检查器。问题是我太笨了,不知道该怎么做,所以我在网上找到了一个脚本,它是用PHP编写的。一位朋友帮助我理解了它的第一部分,在那里他发现剧本有很多问题。然而,由于我的朋友很忙,他不能帮我“破译”剧本的第二部分 在$I=0之前,我都能用Ruby写,现在我被卡住了。我想弄清楚剧本的其余部分是怎么回事。 有这些行,特别是那些让我困惑的行,我想我可以处理其余的行,但是,如果我没有提供足够的信息,我已经把它们全部包括在内了(在底部)

我是一个学习Ruby的noob程序员,我决定编写一个SERP检查器。问题是我太笨了,不知道该怎么做,所以我在网上找到了一个脚本,它是用PHP编写的。一位朋友帮助我理解了它的第一部分,在那里他发现剧本有很多问题。然而,由于我的朋友很忙,他不能帮我“破译”剧本的第二部分

在$I=0之前,我都能用Ruby写,现在我被卡住了。我想弄清楚剧本的其余部分是怎么回事。 有这些行,特别是那些让我困惑的行,我想我可以处理其余的行,但是,如果我没有提供足够的信息,我已经把它们全部包括在内了(在底部)

            $keyword_implode = str_replace(' ','+',$keywords[$i]);
        $fetch_url = "http://www.google.com/search?num=50&q=" . $keyword_implode . "&btnG=Search";
        ob_start();
        include_once($fetch_url);
        $page = ob_get_contents();
        ob_end_clean();  
我在php.net上查找了一些关于str_replace的信息,但没有一个示例与任何示例(对我而言)非常相似,因此我试图找出他试图用what替换什么

以下是整个脚本:

<?php
    if ($_POST['url'] != '') {
        if (strpos($_POST['keyword'],"\n")) {
            $keywords = str_replace("\n",",",$_POST['keyword']);
            $keywords = explode(",",$keywords);
        } else {
            $keywords[0] = $_POST['keyword'];
        }
        $keyword_input = $_POST['keyword'];
        $url = $_POST['url'];
    }

    $i = 0;

    if ($keywords[$i] != '') {
        while ($keywords[$i] != '') {
            $keyword_implode = str_replace(' ','+',$keywords[$i]);
            $fetch_url = "http://www.google.com/search?num=50&q=" . $keyword_implode . "&btnG=Search";
            ob_start();
            include_once($fetch_url);
            $page = ob_get_contents();
            ob_end_clean();  

            $page = str_replace('<b>','',$page);
            $page = str_replace('</b>','',$page);
            //preg_match('/008000\">(.+)<\/font><nobr>/i', $page, $match);
            preg_match_all('/<font color=#008000>(.*)<\/font>/', $page, $match);
            $r = 0;
            $position = '0';
            while ($match[0][$r] != '') {
                if ($position == '0') {
                    if (strpos($match[0][$r],$url)) {
                        $position = $r+1;
                    } 
                }
                $r++;
            } 
            $google_position = $position;

            $keyword_table .= '
                <tr>
                    <td>' . $keywords[$i] . '</td>
                    <td>' . $google_position . '</td>
                </tr>';
            $i++;
        }
        $keyword_table = '
            <table class="result-table" cellspacing="1">
                <tr>
                    <th>Keyword</th>
                    <th>Google</th>
                </tr>' . $keyword_table . '
            </table>';
    }
?>

以下是我迄今为止用Ruby编写的内容:

require 'sinatra'
require 'rspec'
get '/serp_checker' do
  "<form action='/ranked' method='post'>
  <label for='keyword'>Keyword</label>
  <textarea name='keyword' id='keyword' type='text' /></textarea>
  <label for='url'>URL</label>
  <input name='url' id='url' type='text' />
  <input type='submit' value='Go!' />
  </form>"
end

def clean_up_keywords(str)
  str.gsub("\n", ",").delete("\r").split(',')
end

def clean_up_list(arr)
  arr.reject(&:empty?).each(&:lstrip!)
end

post '/ranked' do
  dirty_list = clean_up_keywords(params[:keyword])
  clean_list = clean_up_list(dirty_list)
  return clean_list.to_s
end
需要“sinatra”
需要“rspec”
获取“/serp\u checker”do
"
关键词
统一资源定位地址
"
结束
def清除关键字(str)
str.gsub(“\n”,“,”)。删除(“\r”)。拆分(“,”)
结束
def清理清单(arr)
arr.reject(&:empty?)每个(&:lstrip!)
结束
发布“/排名”do
脏列表=清理关键字(参数[:关键字])
清理清单=清理清单(脏清单)
将清洁列表返回给
结束

很抱歉这么长时间,我只想描述整个问题,这样我就不会忘记给出有关问题的重要信息。

只需查看您在文章顶部指出的代码部分:

  • 第一行是用+符号替换数组中该部分中的任何空格
  • $fetch_url使用第一行中修改过的字符串构建url
  • ob_start激活输出缓冲区,防止任何内容输出到页面
  • include_once包含上面构建的URL(如果尚未包含)
  • $page=ob_get_contents将输出缓冲区的内容分配给$page变量
  • ob_end_clean擦拭输出缓冲区

只需查看您在帖子顶部指出的代码部分:

  • 第一行是用+符号替换数组中该部分中的任何空格
  • $fetch_url使用第一行中修改过的字符串构建url
  • ob_start激活输出缓冲区,防止任何内容输出到页面
  • include_once包含上面构建的URL(如果尚未包含)
  • $page=ob_get_contents将输出缓冲区的内容分配给$page变量
  • ob_end_clean擦拭输出缓冲区

您的PHP脚本打开了一个巨大的安全漏洞。如果google输出包含PHP标记,它将在您的服务器上执行。使用
$data=file\u get\u contents($url)
检索远程数据而不是
包括
!使用str_replace,他将空格替换为+符号,这样字符串就可以与URL兼容,如果这是你唯一的问题的话。@ThiefMaster是的,这是帮助我删除很多其他东西后的脚本。里面还有其他一些疯狂的东西。我的朋友没有更仔细地检查代码,因为他有事情要做。然而,我永远不会知道安全漏洞,所以谢谢分享+谢谢你告诉我这个漏洞。你的PHP脚本打开了一个巨大的安全漏洞。如果google输出包含PHP标记,它将在您的服务器上执行。使用
$data=file\u get\u contents($url)
检索远程数据而不是
包括
!使用str_replace,他将空格替换为+符号,这样字符串就可以与URL兼容,如果这是你唯一的问题的话。@ThiefMaster是的,这是帮助我删除很多其他东西后的脚本。里面还有其他一些疯狂的东西。我的朋友没有更仔细地检查代码,因为他有事情要做。然而,我永远不会知道安全漏洞,所以谢谢分享+谢谢你告诉我关于光点的事。什么是输出缓冲区?对不起,新来的问题。如果我不使用,会发生什么?“包括url”是什么意思?你提到的代码的其他元素,我不确定我是否理解。。。因为我从未听说过输出缓冲区不过,答案很好。谢谢您的帮助。这里有一些关于PHP输出控件的信息:。如果您没有使用它,那么PHP输出将在执行时发送到浏览器(在代码中运行)。您不必使用它。什么是输出缓冲区?对不起,新来的问题。如果我不使用,会发生什么?“包括url”是什么意思?你提到的代码的其他元素,我不确定我是否理解。。。因为我从未听说过输出缓冲区不过,答案很好。谢谢您的帮助。这里有一些关于PHP输出控件的信息:。如果您没有使用它,那么PHP输出将在执行时发送到浏览器(在代码中运行)。你不必使用它。