summaryrefslogtreecommitdiffstats
path: root/post_bug.cgi
diff options
context:
space:
mode:
authorDave Lawrence <dlawrence@mozilla.com>2011-11-28 17:38:31 +0100
committerDave Lawrence <dlawrence@mozilla.com>2011-11-28 17:38:31 +0100
commitfaac5e70ce92133773a2043619f9f23870beb14b (patch)
tree6f7a03e9e4c14cfa2ee701622f79af9a449ad97e /post_bug.cgi
parent4e01a91159acec1075c5d156e2e9c956167696c0 (diff)
downloadbugzilla-faac5e70ce92133773a2043619f9f23870beb14b.tar.gz
bugzilla-faac5e70ce92133773a2043619f9f23870beb14b.tar.xz
Bug 704308 - CSRF vulnerability in post_bug.cgi allows possible unauthorized bug creation
Diffstat (limited to 'post_bug.cgi')
-rwxr-xr-xpost_bug.cgi35
1 files changed, 4 insertions, 31 deletions
diff --git a/post_bug.cgi b/post_bug.cgi
index d4b679692..af8c2cd2e 100755
--- a/post_bug.cgi
+++ b/post_bug.cgi
@@ -68,30 +68,7 @@ if (Bugzilla->params->{disable_bug_updates}) {
# Detect if the user already used the same form to submit a bug
my $token = trim($cgi->param('token'));
-if ($token) {
- my ($creator_id, $date, $old_bug_id) = Bugzilla::Token::GetTokenData($token);
- unless ($creator_id
- && ($creator_id == $user->id)
- && ($old_bug_id =~ "^createbug:"))
- {
- # The token is invalid.
- ThrowUserError('token_does_not_exist');
- }
-
- $old_bug_id =~ s/^createbug://;
-
- if ($old_bug_id && (!$cgi->param('ignore_token')
- || ($cgi->param('ignore_token') != $old_bug_id)))
- {
- $vars->{'bugid'} = $old_bug_id;
- $vars->{'allow_override'} = defined $cgi->param('ignore_token') ? 0 : 1;
-
- print $cgi->header();
- $template->process("bug/create/confirm-create-dupe.html.tmpl", $vars)
- || ThrowTemplateError($template->error());
- exit;
- }
-}
+check_token_data($token, 'create_bug', 'index.cgi');
# do a match on the fields if applicable
Bugzilla::User::match_field ({
@@ -175,8 +152,10 @@ foreach my $field (@multi_selects) {
my $bug = Bugzilla::Bug->create(\%bug_params);
-# Get the bug ID back.
+# Get the bug ID back and delete the token used to create this bug.
my $id = $bug->bug_id;
+delete_token($token);
+
# We do this directly from the DB because $bug->creation_ts has the seconds
# formatted out of it (which should be fixed some day).
my $timestamp = $dbh->selectrow_array(
@@ -249,12 +228,6 @@ Bugzilla::Hook::process('post_bug_after_creation', { vars => $vars });
ThrowCodeError("bug_error", { bug => $bug }) if $bug->error;
-if ($token) {
- trick_taint($token);
- $dbh->do('UPDATE tokens SET eventdata = ? WHERE token = ?', undef,
- ("createbug:$id", $token));
-}
-
my $recipients = { changer => $user };
my $bug_sent = Bugzilla::BugMail::Send($id, $recipients);
$bug_sent->{type} = 'created';