如何转义URL参数以防止HTML注入

时间:2018-01-05 21:35:05

标签: php html code-injection

在代码的最后一行中转义URL参数的好方法是什么,以防止通过参数化的href url注入HTML?我的意思是: editform.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);

2 个答案:

答案 0 :(得分:3)

我会将urlencode用于链接,将htmlspecialchars用于文字。

def content_from_params
  case params[:shout][:content_type]
  when "TextShout" then TextShout.create(text_shout_content_params)
  when "PhotoShout" then PhotoShout.create(photo_shout_content_params)
  end
end

答案 1 :(得分:1)

对于网址的任何组件,您需要对其进行网址编码(使用urlencode)。这样可以避免URL本身出现问题,包括空格,特殊字符和&

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