我正在提供一個非常簡單的測試數據集和我的代碼來嘗試解決這個問題,如果在我沒有找到它之前,我希望我能提供足夠的信息
該數據集由一個表'註釋'與字段id(自動增量),名稱(文本),評論(文本區域),日期顯示(ENUM) MySQL連接整理和所有文本和文本區域字段設置爲utf8_general_ci
The <head> includes
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8" />
所有發佈和獲取報表正在通過電郵scaped如下
$fieldname = mysqli_real_escape_string($dbc, $_POST['fieldname']);
我的代碼成功地進入問題的字符到數據庫中,他們成功地檢索,如果我只是想顯示他們,但在現實世界中,我需要獸醫用戶條目,以確保它們適合於公衆查看,我也需要能夠編輯它們。當我打開我的意見編輯頁面,一個&後在任何一個字段消失,如果有#或「在任何領域沒有被檢索的所有
首先評論-admin.php的網頁:
<?php
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
or die('Error connecting to MySQL server.');
?>
<table width="100%"><tr><td>
<b>ID:</b></td><td>
<b>Name:</b></td><td align="left">
<b>Comments:</b></td><td>
<b>Date Posted:</b></td><td>
<b>Display:</b></td></tr><tr><td>
<?php
$query = "SELECT * FROM comments ORDER BY date DESC";
$result = mysqli_query($dbc,$query);
while ($row=mysqli_fetch_array($result)){
echo '<tr valign="top" ><td>';
echo $row['id'] . '</td><td>';
echo $row['name'] . '</td><td>';
echo $row['comments'] . '</td><td>';
echo $row['date'] . '</td><td>';
echo $row['display'] . '</td><td>';
echo '<td><a href="comments-edit.php?id=' . $row['id'] .
'&name=' . $row['name'] .
'&comments=' . $row['comments'] .
'&date=' . $row['date'] .
'&display=' . $row['display'] .
'">Edit</a></td></tr>';
}
?>
</table>
這使得它看起來像這樣(不含裝修)的表。
ID: Name: Comments: Date Posted: Display:
12 Fred Just wanted to say "Thank You" 2015-11-04 No Edit
11 Ricky I live at #2, Anywhere Street. 2015-11-04 No Edit
9 Ethel Why can't I make this work! 2015-10-24 Yes Edit
4 Lucy Went to A&W today 2015-04-23 Yes Edit
「編輯打開我的意見,edit.php形式。在這個例子中,唯一可以正確打開的是#9。 #的11 & 12將不會檢索任何東西,並且#4在&之後將不會有任何東西。
徵求意見,修改代碼如下:
<?php
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
or die('Error connecting to MySQL server.');
if (isset($_GET['id']) &&
isset($_GET['name']) &&
isset($_GET['comments']) &&
isset($_GET['date']))
{
// Grab the data from the GET
$id = ($_GET['id']);
$name = mysqli_real_escape_string($dbc, $_GET['name']);
$comments = mysqli_real_escape_string($dbc, $_GET['comments']);
$date = ($_GET['date']);
}
else if (isset($_POST['id']) &&
isset($_POST['name']) &&
isset($_POST['comments']) &&
isset($_POST['date']) &&
isset($_POST['display']))
{
// Grab the data from the POST
$id = ($_POST['id']);
$name = mysqli_real_escape_string($dbc, $_POST['name']);
$comments = mysqli_real_escape_string($dbc, $_POST['comments']);
$date = ($_POST['date']);
$display = ($_POST['display']);
}
<form class="gap" method="post" action="comments-update.php">
<input type="hidden" name="ud_id" value="<?php echo "$id;" ?>" />
<p class="gap"><b>Select "Yes" before clicking "Edit Data" to confirm any changes</b></p>
<input type="radio" name="confirm" value="Yes" /> Yes
<input type="radio" name="confirm" value="No" checked="checked" /> No
<input type="submit" value="Edit Data" name="update" /><br />
<label class="appsm">Comment Date:</label>
<input type="text" size="30" name="ud_date" value="<?php echo $date; ?>"
<label class="appsm">ID:</label>
<input type="text" size="5" name="ud_id" value="<?php echo $id; ?>" />
<label class="appsm">Display:</label>
<select id="ud_display" name="ud_display">
<option value="yes" <?php if (!empty($display) && $display == 'yes') echo 'selected = "selected"'; ?>>Yes</option>
<option value="no" <?php if (!empty($display) && $display == 'no') echo 'selected = "selected"'; ?>>No</option>
</select><br />
<label class="appsm">Name:</label>
<input type="text" size="50" name="ud_name" value="<?php echo $name; ?>" />
<br />
<label class="appsm">comments:</label>
<textarea name="ud_comments" wrap="physical" class="left" cols="105" rows="2">
<?php echo stripslashes($comments); ?></textarea>
</form>
我敢肯定,我已經錯過了一些東西很簡單,我搜索我的書和網絡,但我還沒有找到一個答案具體問題。我真的希望能夠刪除所有警告,不要從我的真實網站使用這些字符,特別是因爲用戶很少閱讀說明。
您需要對註釋進行URL編碼。註釋中的「&」使其成爲獲取請求中的新參數。你也應該看看XSS注射並防止它們。 https://www.owasp.org/index.php/Cross-site_Scripting_(XSS) – chris85