【问题标题】:Decode signs when comparing two strings比较两个字符串时解码符号
【发布时间】:2018-04-16 02:23:26
【问题描述】:

我有一个表格。

我使用htmlspecialchars,所以当用户提交表单时,

// $_POST['test']; equals to "> 5"
$test = htmlspecialchars($_POST['test'], ENT_QUOTES);
...
$stmt->bindParam(':test', $test);
...

当我从数据库中拉出来的时候是这样的:

不起作用

if($row['test'] == '> 5') {
    echo $row['test']; // "< 5"
}

这行得通:

if($row['test'] == '&gt; 5') {
    echo $row['test']; // "< 5"
}

我怎样才能让它工作:if($row['test'] == '&lt; 5') 而不是&amp;gt; 5?我还是想用htmlspecialchars

【问题讨论】:

  • htmlspecialchars只用于输出,不用于存储。
  • 你使用的一件事比另一件事少,而比另一件事多。
  • 不要使用htmlspecialchars。您不知道是否会使用 HTML 上下文,因为您的示例在这里清楚地表明它通常不会。
  • @chris85 那么插入时我应该使用什么来进行 XSS 保护?
  • @JasonBale 准备好的语句对于 SQL 是正确的。 XSS 和 SQL 注入是分开的问题,应该分开处理。为了防止 XSS,您需要转义会影响浏览器渲染的字符。

标签: php mysql database escaping decode


【解决方案1】:

使用htmlspecialchars_decode(),即:

$test = htmlspecialchars_decode($row['test']);
if($test == '< 5') {
    echo $test; // "< 5"
}

【讨论】:

  • 问题在于它首先被错误地编码,现在数据库中充满了损坏的数据。这只会使问题加倍并僵化。
  • @tadman 我的回答 fixes OP 的问题,但我同意你关于 mangled DB 的观点,它不应该发生在第一位。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多