9

我正在开发一个将 OSCommerce 与 MySQL 结合使用的项目,但我对何时应该使用 tep_db_input() 或 tep_db_prepare_input() 感到困惑。我假设我应该在任何正在插入/更新的字符串周围使用 tep_db_input() ,但是什么时候应该使用其他函数?

例如,如果我要从数据库中选择一些数据,然后使用结果将一行插入另一个表,我是否需要在某个时候准备输入?或者只是再次使用 tep_db_input ?

$width = '3"'; // 3 inches
$new_height = '3\' 5"'; // 3 feet 5 inches

$result = tep_db_query(
    "SELECT height 
     FROM measurements 
     WHERE width = '".tep_db_input($width)."'"
);

while ($row = tep_db_fetch_array($result)) {
    tep_db_query(
        "INSERT INTO measurement_history (
            field, 
            old_value, 
            new_value
        ) VALUES (
            'height',
            '".tep_db_input($row['height'])."',
            '".tep_db_input($new_height)."'
        )"
    );
}

这个对吗?

编辑::如果有人不熟悉这些功能,这里是他们的定义:

function tep_sanitize_string($string) {
    $patterns = array ('/ +/','/[<>]/');
    $replace = array (' ', '_');
    return preg_replace($patterns, $replace, trim($string));
}

function tep_db_input($string, $link = 'db_link') {
    global $$link;

    if (function_exists('mysql_real_escape_string')) {
        return mysql_real_escape_string($string, $$link);
    } elseif (function_exists('mysql_escape_string')) {
        return mysql_escape_string($string);
    }

    return addslashes($string);
}

function tep_db_prepare_input($string) {
    if (is_string($string)) {
        return trim(tep_sanitize_string(stripslashes($string)));
    } elseif (is_array($string)) {
        reset($string);
        while (list($key, $value) = each($string)) {
            $string[$key] = tep_db_prepare_input($value);
        }
        return $string;
    } else {
        return $string;
    }
}
4

2 回答 2

8

tep_db_input 使用mysql_real_escape_stringmysql_escape_string,这是准备数据库输入的推荐方法。(我猜这个函数将在以后的版本中使用 mysqli_real_escape_string() 或类似函数,因为 mysql_real_escape_string 从 PHP 5.5.0 开始将被弃用。)

带有 mysql_real_escape_string 的 tep_db_input 只是转义:

mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, 
which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a.

tep_db_prepare_input 通过调用 stripslashes 执行不同的操作,例如修剪空格和替换括号和取消引用(!)。

所以我的建议是:总是使用 tep_db_input。如果您使用 tep_db_prepare_input 来消除空格等,那么之后也使用 tep_db_input。

于 2013-05-17T08:16:08.513 回答
2

这有点奇怪,但你两者都用。这样做可以防止来自恶意用户的攻击,以及来自异常输入的意外问题。

对来自 HTML 表单的任何输入数据使用 tep_db_prepare 输入。这清除了 HTML、魔术引号和脚本注入的问题。不要在从数据库检索到的文本上使用它。

然后在将其写入数据库之前使用 tep_db_input。这将转义 MySQL 字符以防止 SQL 注入攻击和其他此类问题。

这是一个显示它的代码示例:

$clean = tep_db_prepare_input($_POST['name']);
$query_text = tep_db_query("select * from " . TABLE_NAME . " where name='" . tep_db_input($clean) . "'");
于 2014-06-29T21:18:04.213 回答