2011-05-05 71 views
1

我是一位正在学习Ruby的noob程序员,我决定编写一个SERP检查器。事情是,我很小心,我不知道如何去做,所以我发现了一个脚本在线,但它是用PHP编写的。一位朋友帮我理解了它的第一部分,在那里他发现了剧本的很多问题。但是,由于我的朋友很忙,他无法帮助我“破译”脚本的第二部分。了解PHP中的一些代码

我能够在Ruby中编写直到$ i = 0,现在我卡住了。我试图弄清楚脚本其余部分发生了什么。 有这些线路,特别是挡板我,我认为我可以处理其余的,,但已包括它所有(底部),在这种情况下,我没有给予足够的信息

  $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函数上的一些信息,并没有真正像(我)任何的例子,所以我想他正试图用什么来代替弄清楚。

这里是整个脚本:

<?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 

对不起这个被这么久了,我只是想描述整个问题,以便我不会忘记提供有关问题的重要信息。

+4

您的PHP脚本会打开**巨大的安全漏洞**。如果谷歌输出包含PHP标签,它将在您的服务器上执行。使用'$ data = file_get_contents($ url);'来检索远程数据而不是'include'! – ThiefMaster 2011-05-05 08:28:15

+1

使用str_replace,他用+符号替换空格,这样字符串变成URL兼容,如果这是您唯一的问题。 – 2011-05-05 08:30:09

+0

@ThiefMaster是的,这是帮助我删除了很多其他东西的人的脚本。那里还有其他一些疯狂的东西。我的朋友没有仔细检查代码,因为他有事要做。但是,我从来不知道有关安全漏洞,所以感谢您的分享。告诉我关于blip的+1。 – 2011-05-05 08:42:13

回答

1

只是看着你在你的岗位的顶部已经表示部分代码:第一行用+符号无论是阵列的一部分内更换任何空间

  • $ fetch_url使用第一行中更改的字符串构建一个url。
  • ob_start激活输出缓冲区,防止任何东西输出到页面。
  • include_once包含上面构建的URL(如果尚未包含)。
  • $ page = ob_get_contents正在将输出缓冲区的内容分配给$ page变量。
  • ob_end_clean擦除输出缓冲区。
+0

什么是输出缓冲区?对不起,新问题。如果我不使用它会发生什么? “包括网址”是什么意思?您提到的代码的其他元素,我不确定我是否理解......因为我从来没有听说过输出缓冲区。 :S很好的答案,但。感谢你们对我的帮助。 – 2011-05-10 08:30:48

+1

这里有一些关于PHP输出控制的信息:http://php.net/manual/en/book.outcontrol.php。如果你不使用它,那么PHP输出将在执行时(通过你的代码运行)发送到浏览器。你不必使用它。 – 2011-05-10 12:33:14