【问题标题】:Safe string output安全字符串输出
【发布时间】:2011-12-03 16:06:45
【问题描述】:

我明白了

$id = (int) $_POST['id']
$content = filter_input(INPUT_POST, 'post_content', FILTER_SANITIZE_STRING);

当我将 $content 字符串发布到数据库时,上述内容使我的 $content 字符串得到保护:

$conn->new->query("UPDATE `posts` SET `content` = " . $conn->escape_string($content) . " where `id` = {$id};");

但同时,它确实删除了一些特殊字符,例如标签,例如我不能在我的帖子中使用<,因为它会被删除。

我怎样才能修改它,以获得足够的安全性,同时防止我的代码被黑客入侵?

【问题讨论】:

  • FILTER_SANITIZE_STRINGstrip_tagshtmlspecialchars 的组合。你必须决定你想要/保留什么。如果允许使用标签,则使用真正的过滤器,如 HTMLPurifier。

标签: php security post filtering


【解决方案1】:

只需使用real_escape_string() 就已经必须良好且安全^_^

【讨论】:

  • 我使用的是:$conn->escape_stringreal_escape_string 一样,所以你说这样就足够安全了吗?不需要逃避特殊字符?
  • @Rym “转义”在很大程度上取决于目标媒体。如果您想在 INSERTING INTO DATABASE 之前转义,请使用 m_r_e_s 作为Suggestend,或者您的 db 函数执行相同的操作。如果您想转义 HTML,则需要在输出到页面之前执行此操作。为此使用 htmlentities()
  • 所以,要明确一点:在向数据库更新/插入字符串之前,我应该使用escape_string,当我不想在页面上显示它时,我应该使用htmlspecialchars()htmlentities() ?
  • m_r_e_s 是mysql_real_escape_string的简写
【解决方案2】:

转义是允许某些可能对目标系统产生不利影响的字符的过程。例如,MySQL 使用引号和括号等字符。 mysql_real_escape_string 会转义此类字符,以免它们污染查询。

在将数据存储到数据库之前,您不一定需要从数据中清除 HTML,但您必须转义有害字符。正如@Damien 在评论中指出的那样,您可以在 output 之前转义 HTML(这可能对您的 HTML 产生不利影响)。

【讨论】:

  • 那么如何在查询前转义那些“有害”字符呢?当我从数据库中读取数据时,我使用htmlspecialchars() 显示。
  • 更好的是,使用 PDO 与您的数据库进行交互。 PDO 很好地解释了here
  • 我正在使用 PDO,$conn->escape_string($content)$sql->quote
  • 啊!我知道了。那你就准备好了。你不需要使用filter_input()。只需在使用数据之前使用htmlspecialchars()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 2016-03-04
相关资源
最近更新 更多