How do I provide one-time access to a downloads page to anonymous users?
You need write a module to do this job, 
I wrote a module that do something like this ( count download times )

&lt;?php

/**
* Implements hook_menu();
*/
function bicuk_downloadounter_menu() {

    $items=array();
    $items['download/%']=array(
        'title' =&gt; 'increase Download counter ',
        'description' =&gt; t('callback url for increse Downloading count'),
        'page callback' =&gt; 'downloadcounter_tickup',
        'page arguments' =&gt;array(1),
        'type' =&gt; MENU_CALLBACK,
        'access callback' =&gt;true,

    );
    return $items;
}

/* call back function to increase counter
 * @param $fid , file id 
 */
function downloadcounter_tickup($fid){

   if(!is_numeric($fid)) 
              drupal_goto();
   $file=file_load($fid);
   if(!isset($file-&gt;fid))
            drupal_goto();
   $acceptable_ext=unserialize(variable_get('bicuk_downloadounter_valid_extensions'));
   $file_path=file_create_url($file-&gt;uri);
   $pathinfo=  pathinfo($file_path);
   $extension=$pathinfo['extension'];
 if(!in_array(strtolower($extension), $acceptable_ext))
             drupal_goto();
   $query=  db_select('bicuk_downloadcounter_counter','bdc')-&gt;fields('bdc',array('count'));
   $query-&gt;condition('fid',$fid, '=');
   $count=$query-&gt;execute()-&gt;fetchField();
if($count)
{
    $query=  db_update('bicuk_downloadcounter_counter')-&gt;fields(array('count'=&gt;$count+1));
    $query-&gt;condition('fid',$fid, '=');
    $query-&gt;execute(); 
}
else
  {
    $query=  db_insert('bicuk_downloadcounter_counter')-&gt;fields(array('name','count','fid'),array($file-&gt;filename,1,$fid));
    $query-&gt;execute();
  }
   drupal_goto($file_path);
}

/**
 *
 * @param type $fid fid
 * @return type int count
 */

function downloadcounter_get($fid){
   $query=  db_select('bicuk_downloadcounter_counter','bdc')-&gt;fields('bdc',array('count'));
   $query-&gt;condition('fid',$fid, '=');
   $count=$query-&gt;execute()-&gt;fetchField();
   return $count;
}


you can  get idea from this code to achieve your job,instead of counting download time try to check downlading time by IP and do your limitation