【问题标题】:How do I sanitize data from users before sending it to mySQL?如何在将用户数据发送到 mySQL 之前对其进行清理?
【发布时间】:2012-06-13 17:34:03
【问题描述】:

我正在做一个论坛。

我想在将输入数据(即来自用户的帖子)发送到 MySQL 数据库之前对其进行清理。

我已经在搜索一些功能来做到这一点,但我不确定我是否使用了足够多的功能以及它们是否都足够安全。欢迎提出任何建议。

这是我的代码:

$message=$_POST['answer'];
$message=nl2br($message); //adds breaks to my text
$message=stripslashes($message); //removes backslahes (needed for links and images)
$message=strip_tags($message, '<p><a><b><i><strong><em><code><sub><sup><img>'); //people can only use tags inside 2nd param
$message = mysql_real_escape_string($message); //removes mysql statements i think (not sure)

编辑:请告诉我是否应该向 strip_tags 函数添加一些标签。也许我忘记了一些。

【问题讨论】:

  • &lt;img onerror="…"&gt;等属性中仍然允许XSS
  • 既然你的评论说你不确定mysql_real_escape_string() 做了什么,你应该read its documentation 并且当你在它的时候,read about SQL injection 来理解为什么这很重要。
  • @jannesbraet 刚刚阅读了我发布的链接
  • nl2br() 用于帮助控制输出到 HTML 块。 stripslashes() 基本上没有真正的价值,它有助于“撤消”(坏的)输出转义,以前可能已经应用过(对 Javascript 块中的字符串最有用)。 strip_tags() 是一种试图避免跨站点脚本的穷人方式,它只在一个特定的 HTML 输出上下文中有效。这三个功能都与数据库无关,只会破坏您的数据。

标签: php mysql security sanitization


【解决方案1】:

尝试改用 PDO。它具有强大的绑定功能,真正提高了安全性。以下是一些示例:http://php.net/manual/pl/pdostatement.bindvalue.php

PDO 在 PHP5 中是默认的,现在几乎无处不在。

【讨论】:

  • 如果您编写自己的应用程序,请使用 php5.3+。
  • 我正在使用主机服务器,但它来自我朋友的父亲,所以我无法联系他们
  • 就像 NomikOS 所说,你真的应该切换到 PHP5(切换主机?),尤其是考虑到安全问题。
  • mysql_real_escape_string() 那么不安全吗?我只是想知道
  • 如果你有 PHP 4.4.9,你可能会遇到更大的问题。它有许多安全漏洞,不再接收任何上游安全更新。检查您的发行版是否仍受支持,并且您正在接收和应用来自操作系统提供商的常规补丁。如果没有,你真的需要升级你的操作系统
【解决方案2】:

如果您想允许在论坛中使用有限的 HTML(如您使用 strip_tags() 的方式所见),请使用 HTMLPurifier;否则你很容易在这些标签的属性中受到 javascript 的攻击。

顺便说一句,现在你正在剥离你添加的&lt;br&gt;标签

【讨论】:

    【解决方案3】:

    当您保存到数据库时:

    $message=strip_tags($message, '<p><a><b><i><strong><em><code><sub><sup><img>'); //people can only use tags inside 2nd param
    $message = mysql_real_escape_string($message); //removes mysql statements i think (not sure)
    

    当你输出时:

    $message=nl2br($message); //adds breaks to my text
    $message=stripslashes($message); //removes backslahes (needed for links and images)
    

    此外,当您写入 html 输入元素(如 texttextarea)时,请使用 htmlspecialchars

    OBS:不要重新发明轮子。学习一些 PHP 框架,例如 codeigniter,它提供了非常安全的数据管理方式。 .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2021-03-27
      相关资源
      最近更新 更多