diff --git a/CRM/Contact/Page/AJAX.php b/CRM/Contact/Page/AJAX.php
index 7da94ba7776e02619df90a7dc5bedec4baf5d62e..e55004fc78af0a3ea369e08132b4d96a27ecd7c8 100644
--- a/CRM/Contact/Page/AJAX.php
+++ b/CRM/Contact/Page/AJAX.php
@@ -44,17 +44,22 @@ class CRM_Contact_Page_AJAX {
 
     $params = array('version' => 3, 'check_permissions' => TRUE);
 
-    if ($context = CRM_Utils_Array::value('context', $_GET)) {
-      $params['context'] = CRM_Utils_Type::escape($_GET['context'], 'String');
-    }
-
-    if ($name = CRM_Utils_Array::value('s', $_GET)) {
-      $params['name'] = CRM_Utils_Type::escape($name, 'String');
+    // String params
+    // FIXME: param keys don't match input keys, using this array to translate
+    $whitelist = array(
+      's' => 'name',
+      'fieldName' => 'field_name',
+      'tableName' => 'table_name',
+      'context' => 'context',
+    );
+    foreach ($whitelist as $key => $param) {
+      if (!empty($_GET[$key])) {
+        $params[$param] = $_GET[$key];
+      }
     }
 
     //CRM-10687: Allow quicksearch by multiple fields
-    if (!empty($_GET['fieldName'])) {
-      $params['field_name'] = CRM_Utils_Type::escape($_GET['fieldName'], 'String');
+    if (!empty($params['field_name'])) {
       if ($params['field_name'] == 'phone_numeric') {
         $params['name'] = preg_replace('/[^\d]/', '', $params['name']);
       }
@@ -63,39 +68,19 @@ class CRM_Contact_Page_AJAX {
       }
     }
 
-    if (!empty($_GET['tableName'])) {
-      $params['table_name'] = CRM_Utils_Type::escape($_GET['tableName'], 'String');
-    }
-
-    $params['limit'] = 10;
-    if (CRM_Utils_Array::value('limit', $_GET)) {
-      $params['limit'] = CRM_Utils_Type::escape($_GET['limit'], 'Positive');
-    }
-
-    $orgId = $employee_id = $cid = $id = $context = $rel = NULL;
-    $params['org'] = CRM_Utils_Array::value('org', $_GET);
-    if (CRM_Utils_Array::value('id', $_GET)) {
-      $params['orgId'] = CRM_Utils_Type::escape($_GET['id'], 'Positive');
-    }
-
-    if (CRM_Utils_Array::value('employee_id', $_GET)) {
-      $params['employee_id'] = CRM_Utils_Type::escape($_GET['employee_id'], 'Positive');
-    }
-
-    if (CRM_Utils_Array::value('cid', $_GET)) {
-      $params['cid'] = CRM_Utils_Type::escape($_GET['cid'], 'Positive');
-    }
-
-    if (CRM_Utils_Array::value('id', $_GET)) {
-      $params['id'] = CRM_Utils_Type::escape($_GET['id'], 'Positive');
-    }
-
-    if (isset($_GET['rel'])) {
-      $params['rel'] = $_GET['rel'];
-    }
-
-    if (CRM_Utils_Array::value('cmsuser', $_GET)) {
-      $params['cmsuser'] = CRM_Utils_Type::escape($_GET['cmsuser'], 'Boolean');
+    // Numeric params
+    $whitelist = array(
+      'limit',
+      'org',
+      'employee_id',
+      'cid',
+      'id',
+      'cmsuser',
+    );
+    foreach ($whitelist as $key) {
+      if (!empty($_GET[$key]) && is_numeric($_GET[$key])) {
+        $params[$key] = $_GET[$key];
+      }
     }
 
     $result = civicrm_api('Contact', 'getquick', $params);
diff --git a/api/v3/Contact.php b/api/v3/Contact.php
index b42f968bde4a1861db7188563b097cf7d1b8e0ed..0a51db98651da740491201e055e3d489c4c1db4a 100644
--- a/api/v3/Contact.php
+++ b/api/v3/Contact.php
@@ -540,7 +540,7 @@ function civicrm_api3_contact_quicksearch($params) {
 
 function civicrm_api3_contact_getquick($params) {
   civicrm_api3_verify_mandatory($params, NULL, array('name'));
-  $name = CRM_Utils_Array::value('name', $params);
+  $name = CRM_Utils_Type::escape($params['name'], 'String');
 
   // get the autocomplete options from settings
   $acpref = explode(CRM_Core_DAO::VALUE_SEPARATOR,
@@ -560,12 +560,13 @@ function civicrm_api3_contact_getquick($params) {
   }
   // If we are doing quicksearch by a field other than name, make sure that field is added to results
   if (!empty($params['field_name'])) {
+    $field_name = CRM_Utils_String::munge($params['field_name']);
     // Unique name contact_id = id
-    if ($params['field_name'] == 'contact_id') {
-      $params['field_name'] = 'id';
+    if ($field_name == 'contact_id') {
+      $field_name = 'id';
     }
     // phone_numeric should be phone
-    $searchField = str_replace('_numeric', '', $params['field_name']);
+    $searchField = str_replace('_numeric', '', $field_name);
     if(!in_array($searchField, $list)) {
       $list[] = $searchField;
     }
@@ -603,7 +604,7 @@ function civicrm_api3_contact_getquick($params) {
         if ($value != 'id') {
           $suffix = 'cc';
           if (!empty($params['field_name']) && $params['field_name'] == 'value') {
-            $suffix = CRM_Utils_Array::value('table_name', $params, 'cc');
+            $suffix = CRM_Utils_String::munge(CRM_Utils_Array::value('table_name', $params, 'cc'));
           }
           $actualSelectElements[] = $select[] = $suffix . '.' . $value;
         }
@@ -625,7 +626,8 @@ function civicrm_api3_contact_getquick($params) {
     $selectAliases = ", $selectAliases";
   }
   $from = implode(' ', $from);
-  $limit = CRM_Utils_Array::value('limit', $params, 10);
+  $limit = (int) CRM_Utils_Array::value('limit', $params);
+  $limit = $limit > 0 ? $limit : 10;
 
   // add acl clause here
   list($aclFrom, $aclWhere) = CRM_Contact_BAO_Contact_Permission::cacheClause('cc');
@@ -642,7 +644,7 @@ function civicrm_api3_contact_getquick($params) {
     $currEmpDetails = array();
     if (CRM_Utils_Array::value('employee_id', $params)) {
       if ($currentEmployer = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact',
-          CRM_Utils_Array::value('employee_id', $params),
+          (int) $params['employee_id'],
           'employer_id'
         )) {
         if ($config->includeWildCardInName) {
@@ -667,11 +669,11 @@ function civicrm_api3_contact_getquick($params) {
 
   //set default for current_employer or return contact with particular id
   if (CRM_Utils_Array::value('id', $params)) {
-    $where .= " AND cc.id = " .$params['id'];
+    $where .= " AND cc.id = " . (int) $params['id'];
   }
 
   if (CRM_Utils_Array::value('cid', $params)) {
-    $where .= " AND cc.id <> {$params['cid']}";
+    $where .= " AND cc.id <> " . (int) $params['cid'];
   }
 
   //contact's based of relationhip type
@@ -696,8 +698,7 @@ function civicrm_api3_contact_getquick($params) {
 
   //CRM-10687
   if (!empty($params['field_name']) && !empty($params['table_name'])) {
-    $field_name = $params['field_name'];
-    $table_name = $params['table_name'];
+    $table_name = CRM_Utils_String::munge($params['table_name']);
     $whereClause = " WHERE ( $table_name.$field_name LIKE '$strSearch')";
     $exactWhereClause = " WHERE ( $table_name.$field_name = '$name')";
     // Search by id should be exact
@@ -768,8 +769,8 @@ LIMIT    0, {$limit}
   // send query to hook to be modified if needed
   CRM_Utils_Hook::contactListQuery($query,
     $name,
-    CRM_Utils_Array::value('context', $params),
-    CRM_Utils_Array::value('id', $params)
+    empty($params['context']) ? NULL : CRM_Utils_Type::escape($params['context'], 'String'),
+    empty($params['id']) ? NULL : $params['id']
   );
 
   $dao = CRM_Core_DAO::executeQuery($query);