【问题标题】:How to escape URL-parameter to prevent HTML injection如何转义 URL 参数以防止 HTML 注入
【发布时间】:2018-01-05 21:35:05
【问题描述】:

在代码的最后一行中转义 URL 参数以防止通过参数化的 href url 注入 HTML 的好方法是什么?我的意思是: 编辑form.php?id=' 。 $row["CustomerID"] 。 '">' 部分。

require_once 'common.php';

$stmt = $db->query("SELECT * FROM customers ORDER BY CustomerID DESC");
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

if ($results && $stmt->rowCount() > 0) 
{ 

echo '<h2>Results</h2>';

//Here comes some plain HTML for table design.

//Then a FOR loop.
foreach ($results as $row) 
{ 
echo '<tr>';
echo '<td><a href="editform.php?id=' . $row["CustomerID"] . '">' . $row["CustomerID"] . '</a></td>';

我正在考虑在 common.php 中编写一个函数。比如:

function escape($html)
{
    return htmlspecialchars($html, ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8");
}

这将是决定性的吗?或者我应该使用类似的东西: filter_var($url, FILTER_SANITIZE_URL);

【问题讨论】:

  • 只使用htmlspecialchars ($row["CustomerID"]) php.net/manual/en/function.htmlspecialchars.php
  • 这里不需要转义,因为用户可以在地址栏中取消转义。在使用其值之前,请在 editform.php 页面上转义 $_GET['id']
  • 好的,这对我来说很有意义,但是我认为验证传入的数据是一种很好的做法,并且只有在将其作为输出发送或在另一个字符串中使用时才进行转义或编码.
  • @Bret 是的,这通常适用于您无法控制的值。 ID 是你应该控制的东西。但是,如果用户能够自己输入用户名并且您不确定在保存之前是否对其进行了适当的清理,那么您应该在显示用户名之前对其进行转义。 htmlspecialchars() 是实现 HTML 输出的好方法。如果您想在 URL 中使用他们的名字,请使用 urlencode()

标签: php html code-injection


【解决方案1】:

我会使用urlencode 链接和htmlspecialchars 文本。

echo '<td><a href="editform.php?id=' .  urlencode($row["CustomerID"]) . '">' . htmlspecialchars($row["CustomerID"], ENT_QUOTES | ENT_SUBSTITUTE, "UTF-8") . '</a></td>';

【讨论】:

    【解决方案2】:

    对于 URL 的任何组成部分,您都需要对其进行 URL 编码(使用 urlencode)。这将避免 URL 本身出现空格、特殊字符和 &amp; 的问题。

    然后您需要使用htmlspecialchars 转义完整的属性值。这同样适用于您在 HTML 中包含的任何文本。

    【讨论】:

    • 感谢大家的快速回答和建议。这将暂时让我感到满意。我将密切关注该主题以获取其他建议。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2010-12-21
    • 2021-09-10
    • 2013-04-14
    • 2012-02-13
    相关资源
    最近更新 更多