Skip to content

Commit

Permalink
feature 1915: add protection on user registration against robots
Browse files Browse the repository at this point in the history
git-svn-id: http://piwigo.org/svn/trunk@7495 68402e56-0260-453c-a942-63ccdbb3a9ee
  • Loading branch information
rvelices committed Oct 30, 2010
1 parent 6f84101 commit d8ec9b9
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 40 deletions.
2 changes: 1 addition & 1 deletion comments.php
Expand Up @@ -504,7 +504,7 @@
if (isset($edit_comment) and ($comment['comment_id'] == $edit_comment))
{
$tpl_comment['IN_EDIT'] = true;
$key = get_comment_post_key($comment['image_id']);
$key = get_ephemeral_key(2, $comment['image_id']);
$tpl_comment['KEY'] = $key;
$tpl_comment['IMAGE_ID'] = $comment['image_id'];
$tpl_comment['CONTENT'] = $comment['content'];
Expand Down
42 changes: 27 additions & 15 deletions include/functions.inc.php
Expand Up @@ -1333,25 +1333,37 @@ function secure_directory($dir)
}

/**
* returns a "secret key" that is to be sent back when a user enters a comment
* returns a "secret key" that is to be sent back when a user posts a form
*
* @param int image_id
* @param int valid_after_seconds - key validity start time from now
*/
function get_comment_post_key($image_id)
function get_ephemeral_key($valid_after_seconds, $aditionnal_data_to_hash = '')
{
global $conf;

$time = time();
global $conf;
$time = round(microtime(true), 1);
return $time.':'.$valid_after_seconds.':'
.hash_hmac(
'md5',
$time.substr($_SERVER['REMOTE_ADDR'],0,5).$valid_after_seconds.$aditionnal_data_to_hash,
$conf['secret_key']);
}

return sprintf(
'%s:%s',
$time,
hash_hmac(
'md5',
$time.':'.$image_id,
$conf['secret_key']
)
);
function verify_ephemeral_key($key, $aditionnal_data_to_hash = '')
{
global $conf;
$time = microtime(true);
$key = explode( ':', @$key );
if ( count($key)!=3
or $key[0]>$time-(float)$key[1] // page must have been retrieved more than X sec ago
or $key[0]<$time-3600 // 60 minutes expiration
or hash_hmac(
'md5', $key[0].substr($_SERVER['REMOTE_ADDR'],0,5).$key[1].$aditionnal_data_to_hash, $conf['secret_key']
) != $key[2]
)
{
return false;
}
return true;
}

/**
Expand Down
17 changes: 2 additions & 15 deletions include/functions_comment.inc.php
Expand Up @@ -119,14 +119,7 @@ function insert_user_comment( &$comm, $key, &$infos )
$comment_action='reject';
}

$key = explode( ':', @$key );
if ( count($key)!=2
or $key[0]>time()-2 // page must have been retrieved more than 2 sec ago
or $key[0]<time()-3600 // 60 minutes expiration
or hash_hmac(
'md5', $key[0].':'.$comm['image_id'], $conf['secret_key']
) != $key[1]
)
if ( !verify_ephemeral_key(@$key, $comm['image_id']) )
{
$comment_action='reject';
}
Expand Down Expand Up @@ -248,13 +241,7 @@ function update_user_comment($comment, $post_key)

$comment_action = 'validate';

$key = explode( ':', $post_key );
if ( count($key)!=2
or $key[0]>time()-2 // page must have been retrieved more than 2 sec ago
or $key[0]<time()-3600 // 60 minutes expiration
or hash_hmac('md5', $key[0].':'.$comment['image_id'], $conf['secret_key']
) != $key[1]
)
if ( !verify_ephemeral_key($post_key, $comment['image_id']) )
{
$comment_action='reject';
}
Expand Down
4 changes: 2 additions & 2 deletions include/picture_comment.inc.php
Expand Up @@ -198,7 +198,7 @@
if (isset($edit_comment) and ($row['id'] == $edit_comment))
{
$tpl_comment['IN_EDIT'] = true;
$key = get_comment_post_key($page['image_id']);
$key = get_comment_post_key(2, $page['image_id']);
$tpl_comment['KEY'] = $key;
$tpl_comment['CONTENT'] = $row['content'];
}
Expand Down Expand Up @@ -233,7 +233,7 @@

if ($show_add_comment_form)
{
$key = get_comment_post_key($page['image_id']);
$key = get_ephemeral_key(3, $page['image_id']);
$content = '';
if ('reject'===@$comment_action)
{
Expand Down
2 changes: 1 addition & 1 deletion include/ws_functions.inc.php
Expand Up @@ -725,7 +725,7 @@ function ws_images_getInfo($params, &$service)
)
{
$comment_post_data['author'] = stripslashes($user['username']);
$comment_post_data['key'] = get_comment_post_key($params['image_id']);
$comment_post_data['key'] = get_ephemeral_key(2, $params['image_id']);
}

$ret = $image_row;
Expand Down
23 changes: 17 additions & 6 deletions register.php
Expand Up @@ -40,13 +40,19 @@
$errors = array();
if (isset($_POST['submit']))
{
if (!verify_ephemeral_key(@$_POST['key']))
{
set_status_header(403);
array_push($errors, 'Invalid/expired form key');
}

if ($_POST['password'] != $_POST['password_conf'])
{
array_push($errors, l10n('please enter your password again'));
}

$errors =
register_user(htmlspecialchars($_POST['login'],ENT_COMPAT,'utf-8'),
register_user($_POST['login'],
$_POST['password'],
$_POST['mail_address'],
true,
Expand All @@ -58,10 +64,15 @@
log_user($user_id, false);
redirect(make_index_url());
}
$registration_post_key = get_ephemeral_key(2);
}
else
{
$registration_post_key = get_ephemeral_key(6);
}

$login = !empty($_POST['login'])?$_POST['login']:'';
$email = !empty($_POST['mail_address'])?$_POST['mail_address']:'';
$login = !empty($_POST['login'])?htmlspecialchars(stripslashes($_POST['login'])):'';
$email = !empty($_POST['mail_address'])?htmlspecialchars(stripslashes($_POST['mail_address'])):'';

//----------------------------------------------------- template initialization
//
Expand All @@ -74,10 +85,10 @@
$template->set_filenames( array('register'=>'register.tpl') );
$template->assign(array(
'U_HOME' => make_index_url(),

'F_KEY' => $registration_post_key,
'F_ACTION' => 'register.php',
'F_LOGIN' => htmlspecialchars($login, ENT_QUOTES, 'utf-8'),
'F_EMAIL' => htmlspecialchars($email, ENT_QUOTES, 'utf-8')
'F_LOGIN' => $login,
'F_EMAIL' => $email
));

//-------------------------------------------------------------- errors display
Expand Down
1 change: 1 addition & 0 deletions themes/default/template/register.tpl
Expand Up @@ -54,6 +54,7 @@
</fieldset>

<p class="bottomButtons">
<input type="hidden" name="key" value="{$F_KEY}" >
<input class="submit" type="submit" name="submit" value="{'Register'|@translate}">
<input class="submit" type="reset" value="{'Reset'|@translate}">
</p>
Expand Down

0 comments on commit d8ec9b9

Please sign in to comment.