diff --git a/include/admin/Layout/Text.php b/include/admin/Layout/Text.php
index 7d8ceba..8d29042 100644
--- a/include/admin/Layout/Text.php
+++ b/include/admin/Layout/Text.php
@@ -37,7 +37,7 @@ class Text extends \gp\admin\Layout{
 		echo '<div class="inline_box" style="text-align:right">';
 		echo '<form action="'.\gp\tool::GetUrl('Admin_Theme_Content/Text').'" method="post">';
 		echo '<input type="hidden" name="cmd" value="SaveAddonText" />';
-		echo '<input type="hidden" name="addon" value="'.htmlspecialchars($addon).'" />'; //will be populated by javascript
+		echo '<input type="hidden" name="addon" value="'.htmlspecialchars($addon, ENT_QUOTES).'" />'; //will be populated by javascript
 
 
 		$this->AddonTextFields($texts);
@@ -58,7 +58,7 @@ class Text extends \gp\admin\Layout{
 		echo '</th><th>';
 		echo '</th></tr>';
 
-		$key =& $_GET['key'];
+		$key = isset($_GET['key']) ? $this->sanitizeKey($_GET['key']) : '';  // Sanitize first
 		foreach($array as $text){
 
 			$value = $text;
@@ -75,9 +75,9 @@ class Text extends \gp\admin\Layout{
 			}
 
 			echo '<tr'.$style.'><td>';
-			echo $text;
+			echo htmlspecialchars($text, ENT_QUOTES);
 			echo '</td><td>';
-			echo '<input type="text" name="values['.htmlspecialchars($text).']" value="'.htmlspecialchars($value).'" class="gpinput"/>';
+			echo '<input type="text" name="values['.htmlspecialchars($text, ENT_QUOTES).']" value="'.htmlspecialchars($value, ENT_QUOTES).'" class="gpinput"/>';
 			//value has already been escaped with htmlspecialchars()
 			echo '</td></tr>';
 
@@ -94,14 +94,14 @@ class Text extends \gp\admin\Layout{
 			return;
 		}
 
-		$key = $_GET['key'];
-        $default = isset($langmessage[$key]) ? $langmessage[$key] : htmlspecialchars($key);
-        $value = isset($config['customlang'][$key]) ? $config['customlang'][$key] : htmlspecialchars($key);
+        $key = $this->sanitizeKey($_GET['key']); // Sanitize input
+        $default = isset($langmessage[$key]) ? $langmessage[$key] : htmlspecialchars($key, ENT_QUOTES);
+        $value = isset($config['customlang'][$key]) ? $config['customlang'][$key] : htmlspecialchars($key, ENT_QUOTES);
 
        	echo '<div class="inline_box">';
 		echo '<form action="'.\gp\tool::GetUrl('Admin_Theme_Content/Text').'" method="post">';
 		echo '<input type="hidden" name="cmd" value="savetext" />';
-		echo '<input type="hidden" name="key" value="'.htmlspecialchars($key).'" />';
+		echo '<input type="hidden" name="key" value="'.htmlspecialchars($key, ENT_QUOTES).'" />';
 
 		echo '<table class="bordered full_width">';
 		echo '<tr><th>';
@@ -110,10 +110,10 @@ class Text extends \gp\admin\Layout{
 		echo $langmessage['edit'];
 		echo '</th></tr>';
 		echo '<tr><td>';
-		echo $default;
+		echo htmlspecialchars($default, ENT_QUOTES);
 		echo '</td><td>';
 		//$value is already escaped using htmlspecialchars()
-		echo '<input type="text" name="value" value="'.htmlspecialchars($value).'" class="gpinput full_width"/>';
+		echo '<input type="text" name="value" value="'.htmlspecialchars($value, ENT_QUOTES).'" class="gpinput full_width"/>';
 	  	echo '</td></tr>';
 		echo '</table>';
 		echo '<p>';
@@ -139,13 +139,14 @@ class Text extends \gp\admin\Layout{
 			return;
 		}
 
-		$default = $key = $_POST['key'];
+        $key = $this->sanitizeKey($_POST['key']);
+		$default = $key;
 		if( isset($langmessage[$key]) ){
 			$default = $langmessage[$key];
 		}
 
-		$config['customlang'][$key] = $value = htmlspecialchars($_POST['value']);
-		if( ($value === $default) || (htmlspecialchars($default) == $value) ){
+		$config['customlang'][$key] = $value = htmlspecialchars($_POST['value'], ENT_QUOTES);
+		if( ($value === $default) || (htmlspecialchars($default, ENT_QUOTES) == $value) ){
 			unset($config['customlang'][$key]);
 		}
 
@@ -170,15 +171,15 @@ class Text extends \gp\admin\Layout{
 				continue;
 			}
 
-
+            $text = $this->sanitizeKey($text);  // Sanitize text key as well
 			$default = $text;
 			if( isset($langmessage[$text]) ){
 				$default = $langmessage[$text];
 			}
 
-			$value = htmlspecialchars($_POST['values'][$text]);
+			$value = htmlspecialchars($_POST['values'][$text], ENT_QUOTES);
 
-			if( ($value === $default) || (htmlspecialchars($default) == $value) ){
+			if( ($value === $default) || (htmlspecialchars($default, ENT_QUOTES) == $value) ){
 				unset($config['customlang'][$text]);
 			}else{
 				$config['customlang'][$text] = $value;
@@ -236,4 +237,14 @@ class Text extends \gp\admin\Layout{
 		return $texts;
 	}
 
-}
+    /**
+     * Sanitize the key parameter.  Allow only alphanumeric characters, underscores, and hyphens.
+     *
+     * @param string $key The key to sanitize.
+     * @return string The sanitized key.
+     */
+    private function sanitizeKey(string $key): string
+    {
+        return preg_replace('/[^a-zA-Z0-9_\-]/', '', $key);
+    }
+}
\ No newline at end of file