diff --git a/lib/punbb/admin_index.php b/lib/punbb/admin_index.php
index a720aecae1a3d11cf20c846c57228bf896f2269b..2c09d63be864219f3fa34fc67a10093073863e9b 100644
--- a/lib/punbb/admin_index.php
+++ b/lib/punbb/admin_index.php
@@ -50,13 +50,10 @@ if ($action == 'check_upgrade')
 	if ($latest_version == '')
 		message('Check for upgrade failed for unknown reasons.');
 
-	$cur_version = str_replace(array('.', 'dev', 'beta', ' '), '', strtolower($pun_config['o_cur_version']));
-	$cur_version = (strlen($cur_version) == 2) ? intval($cur_version) * 10 : intval($cur_version);
+	$latest_version = preg_replace('/(\.0)+(?!\.)|(\.0+$)/', '$2', $latest_version);
+	$cur_version = preg_replace('/(\.0)+(?!\.)|(\.0+$)/', '$2', $cur_version);
 
-	$latest_version = str_replace('.', '', strtolower($latest_version));
-	$latest_version = (strlen($latest_version) == 2) ? intval($latest_version) * 10 : intval($latest_version);
-
-	if ($cur_version >= $latest_version)
+	if (version_compare($cur_version, $latest_version, '>='))
 		message('You are running the latest version of PunBB.');
 	else
 		message('A new version of PunBB has been released. You can download the latest version at <a href="http://punbb.informer.com/">PunBB.Informer.Com</a>.');
diff --git a/lib/punbb/admin_prune.php b/lib/punbb/admin_prune.php
index 578b50149a11fd6e5fe96582ea1cc2060fd6e29f..d5ae2eb537df356718966e744d03d9dbe4c5d146 100644
--- a/lib/punbb/admin_prune.php
+++ b/lib/punbb/admin_prune.php
@@ -42,6 +42,7 @@ if (isset($_GET['action']) || isset($_POST['prune']) || isset($_POST['prune_comp
 		confirm_referrer('admin_prune.php');
 
 		$prune_from = $_POST['prune_from'];
+		$prune_sticky = isset($_POST['prune_sticky']) ? '1' : '0';
 		$prune_days = intval($_POST['prune_days']);
 		$prune_date = ($prune_days) ? time() - ($prune_days*86400) : -1;
 
@@ -56,14 +57,14 @@ if (isset($_GET['action']) || isset($_POST['prune']) || isset($_POST['prune_comp
 			{
 				$fid = $db->result($result, $i);
 
-				prune($fid, $_POST['prune_sticky'], $prune_date);
+				prune($fid, $prune_sticky, $prune_date);
 				update_forum($fid);
 			}
 		}
 		else
 		{
 			$prune_from = intval($prune_from);
-			prune($prune_from, $_POST['prune_sticky'], $prune_date);
+			prune($prune_from, $prune_sticky, $prune_date);
 			update_forum($prune_from);
 		}
 
@@ -93,7 +94,7 @@ if (isset($_GET['action']) || isset($_POST['prune']) || isset($_POST['prune_comp
 	// Concatenate together the query for counting number or topics to prune
 	$sql = 'SELECT COUNT(id) FROM '.$db->prefix.'topics WHERE last_post<'.$prune_date.' AND moved_to IS NULL';
 
-	if ($_POST['prune_sticky'] == '0')
+	if (!$prune_sticky)
 		$sql .= ' AND sticky=\'0\'';
 
 	if ($prune_from != 'all')
@@ -127,7 +128,7 @@ if (isset($_GET['action']) || isset($_POST['prune']) || isset($_POST['prune_comp
 			<form method="post" action="admin_prune.php?action=foo">
 				<div class="inform">
 					<input type="hidden" name="prune_days" value="<?php echo $prune_days ?>" />
-					<input type="hidden" name="prune_sticky" value="<?php echo $_POST['prune_sticky'] ?>" />
+					<input type="hidden" name="prune_sticky" value="<?php echo $prune_sticky ?>" />
 					<input type="hidden" name="prune_from" value="<?php echo $prune_from ?>" />
 					<fieldset>
 						<legend>Confirm prune posts</legend>
diff --git a/lib/punbb/include/common.php b/lib/punbb/include/common.php
index cb4916e9d6df2a0df2b5818953733760eff10d99..75aaa7ab696aa6643411e473a34c2215a47063aa 100644
--- a/lib/punbb/include/common.php
+++ b/lib/punbb/include/common.php
@@ -55,7 +55,8 @@ $pun_start = ((float)$usec + (float)$sec);
 error_reporting(E_ALL ^ E_NOTICE);
 
 // Turn off magic_quotes_runtime
-set_magic_quotes_runtime(0);
+if (get_magic_quotes_runtime())
+	set_magic_quotes_runtime(0);
 
 // Strip slashes from GET/POST/COOKIE (if magic_quotes_gpc is enabled)
 if (get_magic_quotes_gpc())
diff --git a/lib/punbb/include/functions.php b/lib/punbb/include/functions.php
index ee04d1a80ab34de35addbf7ff81d554407884992..8bb9f1c365be14bf4376a32c5ba097b60e65ee78 100644
--- a/lib/punbb/include/functions.php
+++ b/lib/punbb/include/functions.php
@@ -109,8 +109,8 @@ function check_cookie(&$pun_user)
 	$cookie = array('user_id' => 1, 'password_hash' => 'Guest');
 
 	// If a cookie is set, we get the user_id and password hash from it
-	if (isset($_COOKIE[$cookie_name]))
-		list($cookie['user_id'], $cookie['password_hash']) = @unserialize($_COOKIE[$cookie_name]);
+	if (isset($_COOKIE[$cookie_name]) && preg_match('/a:2:{i:0;s:\d+:"(\d+)";i:1;s:\d+:"([0-9a-f]+)";}/', $_COOKIE[$cookie_name], $matches))
+		list(, $cookie['user_id'], $cookie['password_hash']) = $matches;
 
 	if ($cookie['user_id'] > 1)
 	{
@@ -441,7 +441,7 @@ function update_forum($forum_id)
 	{
 		list($last_post, $last_post_id, $last_poster) = $db->fetch_row($result);
 
-		$db->query('UPDATE '.$db->prefix.'forums SET num_topics='.$num_topics.', num_posts='.$num_posts.', last_post='.$last_post.', last_post_id='.$last_post_id.', last_poster=\''.$db->escape($last_poster).'\' WHERE id='.$forum_id) or error('Unable to update last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'forums SET num_topics='.$num_topics.', num_posts='.$num_posts.', last_post='.$last_post.', last_post_id='.$last_post_id.', last_poster=\''.$db->escape($last_poster).'\' WHERE id='.$forum_id) or error('Unable to update last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
 	}
 	else	// There are no topics
 		$db->query('UPDATE '.$db->prefix.'forums SET num_topics='.$num_topics.', num_posts='.$num_posts.', last_post=NULL, last_post_id=NULL, last_poster=NULL WHERE id='.$forum_id) or error('Unable to update last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
diff --git a/lib/punbb/install.php b/lib/punbb/install.php
index 5adc6153514a08801e40c8247809697c44dac730..00836fcef4e1c9a12c148590a0b11d33783af47e 100644
--- a/lib/punbb/install.php
+++ b/lib/punbb/install.php
@@ -27,7 +27,7 @@ pun_exit();
 
 
 // The PunBB version this script installs
-$punbb_version = '1.2.19';
+$punbb_version = '1.2.23';
 
 
 define('PUN_ROOT', './');
diff --git a/lib/punbb/misc.php b/lib/punbb/misc.php
index 0ae9de3733e7e1fda5ddb3fd21275bfc7ce69f16..f5df5be955f22d1d90932fcbf57306abf93da4f7 100644
--- a/lib/punbb/misc.php
+++ b/lib/punbb/misc.php
@@ -253,7 +253,7 @@ else if (isset($_GET['subscribe']))
 		message($lang_common['Bad request']);
 
 	// Make sure the user can view the topic
-	$result = $db->query('SELECT 1 FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id=1) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$topic_id.' AND t.moved_to IS NULL') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT 1 FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$topic_id.' AND t.moved_to IS NULL') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
 	if (!$db->num_rows($result))
 		message($lang_common['Bad request']);
 
diff --git a/lib/punbb/moderate.php b/lib/punbb/moderate.php
index 2a367f8dbb5fbefa56be3f8a7fc9130fd60f0978..be00499951b550891e859e35acf247811ab732ec 100644
--- a/lib/punbb/moderate.php
+++ b/lib/punbb/moderate.php
@@ -170,7 +170,7 @@ if (isset($_GET['tid']))
 	// Determine the post offset (based on $_GET['p'])
 	$num_pages = ceil(($cur_topic['num_replies'] + 1) / $pun_user['disp_posts']);
 
-	$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
+	$p = (!isset($_GET['p']) || !is_numeric($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
 	$start_from = $pun_user['disp_posts'] * ($p - 1);
 
 	// Generate paging links
@@ -566,7 +566,7 @@ require PUN_ROOT.'header.php';
 // Determine the topic offset (based on $_GET['p'])
 $num_pages = ceil($cur_forum['num_topics'] / $pun_user['disp_topics']);
 
-$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
+$p = (!isset($_GET['p']) || !is_numeric($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
 $start_from = $pun_user['disp_topics'] * ($p - 1);
 
 // Generate paging links
diff --git a/lib/punbb/search.php b/lib/punbb/search.php
index 01ec2e2db43b8acd94cf8c7bcf73603fd02d7ea3..955249552d175924011c173f2c02875a90a09f2c 100644
--- a/lib/punbb/search.php
+++ b/lib/punbb/search.php
@@ -466,7 +466,7 @@ if (isset($_GET['action']) || isset($_GET['search_id']))
 		$per_page = ($show_as == 'posts') ? $pun_user['disp_posts'] : $pun_user['disp_topics'];
 		$num_pages = ceil($num_hits / $per_page);
 
-		$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
+		$p = (!isset($_GET['p']) || !is_numeric($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
 		$start_from = $per_page * ($p - 1);
 
 		// Generate paging links
diff --git a/lib/punbb/userlist.php b/lib/punbb/userlist.php
index ad56a0749964a4ffd226efa9331726a63b620a3b..b667ec9dc1884d8b79237286712209889cb9df6a 100644
--- a/lib/punbb/userlist.php
+++ b/lib/punbb/userlist.php
@@ -125,7 +125,7 @@ $num_users = $db->result($result);
 // Determine the user offset (based on $_GET['p'])
 $num_pages = ceil($num_users / 50);
 
-$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
+$p = (!isset($_GET['p']) || !is_numeric($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
 $start_from = 50 * ($p - 1);
 
 // Generate paging links
diff --git a/lib/punbb/viewforum.php b/lib/punbb/viewforum.php
index 6e3f3e733448bbf454ebe92a6337f7d858367814..5ec8674ca513a04a25ba5f4168d704c342c77136 100644
--- a/lib/punbb/viewforum.php
+++ b/lib/punbb/viewforum.php
@@ -69,7 +69,7 @@ else
 // Determine the topic offset (based on $_GET['p'])
 $num_pages = ceil($cur_forum['num_topics'] / $pun_user['disp_topics']);
 
-$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
+$p = (!isset($_GET['p']) || !is_numeric($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
 $start_from = $pun_user['disp_topics'] * ($p - 1);
 
 // Generate paging links
@@ -253,4 +253,3 @@ else
 $forum_id = $id;
 $footer_style = 'viewforum';
 require PUN_ROOT.'footer.php';
-
diff --git a/lib/punbb/viewtopic.php b/lib/punbb/viewtopic.php
index 5f1c3c986cf73c4ec2ef009afe78068167378468..584906e593a3b4c7377ff5a3206b672e9df9b8bf 100644
--- a/lib/punbb/viewtopic.php
+++ b/lib/punbb/viewtopic.php
@@ -128,7 +128,8 @@ else
 // Determine the post offset (based on $_GET['p'])
 $num_pages = ceil(($cur_topic['num_replies'] + 1) / $pun_user['disp_posts']);
 
-$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
+$p = (!isset($_GET['p']) || !is_numeric($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
+
 $start_from = $pun_user['disp_posts'] * ($p - 1);
 
 // Generate paging links