4

我现在很困惑,想知道,如果你能帮我解决问题。

在最近的 Anon/Lulsec 攻击之后,我质疑我的 php/mysql 安全性。

所以,我想,我怎么能同时保护 PHP 和 Mysql。

问题:谁能解释一下,当涉及到引号时,处理 PHP 和 Mysql的最佳实践是什么?

  • 特别是在表单中,我需要某种 htmlspecialchars 来保护 html,对吗?
  • PHP 是否可以通过表单完全被利用?是否需要任何类型的保护?
  • 我应该在查询之前使用 real_escape_string?已经在 PHP 中使用它会不会是错误的/不好的(参见 sanitize_post 函数)?

目前我正在使用以下功能。该函数“清理”所有 $_POST 和 $_GET 变量。这“安全”吗?

function sanitize_post($array) {
    global $db;
    if(is_array($array)) {
        foreach($array as $key=>$value) {
            if(is_array($array[$key])) {
                $array[$key] = sanitize_post($array[$key]);
            } elseif(is_string($array[$key])) {
                $array[$key] = $db->real_escape_string(strtr(stripslashes(trim($array[$key])), array("'" => '', '"' => '')));
            }
        }            
    } elseif(is_string($array)) {
        $array = $db->real_escape_string(strtr(stripslashes(trim($array)), array("'" => '', '"' => '')));
    }
    return $array;
}

我将 PHP 5.3.5 与 Mysql 5.1.54 一起使用。

谢谢。

4

7 回答 7

6

mysql_real_escape_string值得您关注。

然而,直接查询是一个泥潭,不再被认为是安全的做法。您应该阅读PDO 准备好的语句和绑定参数,它们具有内置的引用、转义等好处。

于 2011-08-11T17:47:55.460 回答
6

最佳做法是始终使用准备好的语句。这使得 SQL 注入成为不可能。这是通过 PDO 或 mysqli 完成的。忘记所有 mysql_* 函数。它们陈旧而过时。

于 2011-08-11T17:49:44.020 回答
3

问题:谁能解释一下,当涉及到引号时,处理 PHP 和 Mysql 的最佳实践是什么?

这很简单:使用准备好的语句,例如使用PDO::preparemysqli_prepare

于 2011-08-11T17:49:54.940 回答
2

不要使用 mysql_real_escape_string() 或类似的东西浪费精力。仅使用PDO和 SQL 注入的预准备语句是不可能的。

于 2011-08-11T17:50:08.170 回答
2

没有什么能比得上“普遍消毒”。让我们称之为引用,因为这就是它的全部内容。

引用时,您总是引用某些特定输出的文本,例如:

  1. mysql查询的字符串值
  2. likemysql查询表达式
  3. html代码
  4. json
  5. mysql正则表达式
  6. php正则表达式

对于每种情况,您需要不同的引用,因为每种用法都存在于不同的语法上下文中。这也意味着不应该在 PHP 的输入端进行引用,而应该在特定的输出端进行引用!这就是为什么像这样的功能magic_quotes_gpc被破坏的原因(总是确保它被关闭!!!)。

那么,在这些特定情况下引用什么方法?(请随时纠正我,可能有更现代的方法,但这些对我有用)

  1. mysql_real_escape_string($str)
  2. mysql_real_escape_string(addcslashes($str, "%_"))
  3. htmlspecialchars($str)
  4. json_encode()- 仅适用于 utf8!我将我的功能用于 iso-8859-2
  5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}'))- 在这种情况下你不能使用 preg_quote 因为反斜杠会被转义两次!
  6. preg_quote()
于 2011-08-11T18:02:19.620 回答
0

我通常使用 PHP 函数stripslashesstrip_tags变量,因为它们通过 $_POST(或 $_GET,取决于您使用的内容)和mysql_real_escape_string查询期间进入。(我不确定这是否“正确”,但到目前为止它对我有用。)您还可以使用 PHP 的内置验证过滤器来检查电子邮件地址、url、数据类型等内容。据说PDO在防止SQL注入,但我还没有任何经验。

于 2011-08-11T17:46:23.117 回答
0

基本工作流程应该是

$data = $_POST['somefield which will go into the database'];

... do data validation ...

if (everything ok) {
    $escaped_data = escape_function($data);
    $sql = " ... query here with $escaped_data ... ";
    do_query($sql);
}

基本上,为数据库插入而转义的数据应该只用于数据库插入。当 50 个(比如说)值中只有 2 个或 3 个实际上位于 db 附近时,预处理所有内容并用 db 转义值覆盖所有数据是没有意义的。

同样适用于 htmlspecialchars。不要通过 htmlspecialchars 发送数据,除非它是用于 HTML 类型的显示。

不要将数据存储在为特定目的格式化的数据库中,因为如果您出于其他目的需要不同形式的数据,则必须撤消转义。始终将原始/未格式化的数据存储在数据库中。请注意:使用 mysql_real_escape_string() 和 company 完成的转义实际上并没有存储在数据库中。它只是为了确保数据安全地进入数据库。数据库中实际存储的是未转义/未引用的原始数据。一旦它在数据库中,它就是“安全的”。

例如,将逃脱功能视为对被转移囚犯的手铐。当囚犯在任一监狱内时,不需要铐上手铐。

于 2011-08-11T17:47:21.537 回答