2015-11-04 106 views
0

我正在提供一個非常簡單的測試數據集和我的代碼來嘗試解決這個問題,如果在我沒有找到它之前,我希望我能提供足夠的信息

該數據集由一個表'註釋'與字段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'] . 
       '&amp;name=' . $row['name'] . 
       '&amp;comments=' . $row['comments'] . 
       '&amp;date=' . $row['date'] . 
       '&amp;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> 

我敢肯定,我已經錯過了一些東西很簡單,我搜索我的書和網絡,但我還沒有找到一個答案具體問題。我真的希望能夠刪除所有警告,不要從我的真實網站使用這些字符,特別是因爲用戶很少閱讀說明。

+0

您需要對註釋進行URL編碼。註釋中的「&」使其成爲獲取請求中的新參數。你也應該看看XSS注射並防止它們。 https://www.owasp.org/index.php/Cross-site_Scripting_(XSS) – chris85

回答

0

正如上面評論中提到的那樣,您需要對在URL中傳遞的內容進行編碼。

但我的問題是,爲什麼你可以將所有信息傳遞到第二頁,當你可以從數據庫中取出它?還將您的代碼更改爲使用heredoc block而不是所有echo()語句。這是使代碼更易讀的便捷方式。最後,將數據輸出到HTML需要您使用htmlspecialchars()轉義數據。我用array_map()來快速轉義整個數據庫記錄。

<?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)){ 
     $row = array_map('htmlspecialchars', $row); 
     echo <<< HTML 
<tr valign="top"> 
    <td>$row[id]</td> 
    <td>$row[name]</td> 
    <td>$row[comments]</td> 
    <td>$row[date]</td> 
    <td>$row[display]</td> 
    <td><a href="comments-edit.php?id=$row[id]">Edit</a></td> 
</tr> 

HTML; 
     } 
     ?> 
     </table> 

您的第二個文件。請注意,$ _POST和$ _GET都合併到超全局$ _REQUEST中,但您應該知道自己的頁面將如何發送數據。 HTML輸出再次被轉義。

<?php 
$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Error connecting to MySQL server.'); 

if (isset($_REQUEST['id'])) { 
    $id = (int)$_REQUEST['id']; 
    $query = "SELECT * FROM comments WHERE id=$id"; 
    $result = mysqli_query($dbc,$query); 
    $row=mysqli_fetch_array($result); 
} 
if (!isset($_REQUEST['id']) || !$row) { 
    // you should do something in this case 
    return false; 
} 
$id = htmlspecialchars($row['id']); 
$name = htmlspecialchars($row['name']); 
$comments = htmlspecialchars($row['comments']); 
$date = htmlspecialchars($row['date']); 
$display = htmlspecialchars($row['display']); 
?> 

<form class="gap" method="post" action="comments-update.php"> 
<input type="hidden" name="ud_id" value="<?php echo $id ?>" /> 
... 
+0

謝謝你miken32。將信息傳遞到編輯頁面的原因是幾個不同的人管理網站的不同方面,並且他們沒有直接訪問數據庫的權限。 –

+0

但是你的網頁訪問數據庫... – miken32

+0

我想我誤解了你的評論。我這樣做是因爲這是我使用的第一本書,它對我和其他用戶來說都比我更少了解這些東西。另外,我真正的表格有許多文本字段,這些字段更容易以新形式處理。除(int)$ _ REQUEST ['id']之外是否還有其他可以使用字母數字主鍵的東西?我嘗試用varchar替換int,但只是得到一個錯誤消息...否則我可以添加一個整數主要到這些表。 –