OSCommerce tep_db_input vs tep_db_prepare_input

时间:2013-05-16 22:13:38

标签: php mysql oscommerce

我正在开发一个使用OSCommerce和MySQL的项目,我很困惑何时应该使用tep_db_input()或tep_db_prepare_input()。我假设我应该在插入/更新的任何字符串周围使用tep_db_input(),但是何时应该使用其他函数?

例如,如果我要从数据库中 SELECT 一些数据,并使用结果然后 INSERT 一行到另一个表中,我是否需要准备在某些时候输入?或者再次使用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;
    }
}

2 个答案:

答案 0 :(得分:8)

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

使用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。

答案 1 :(得分:1)

这有点奇怪,但你同时使用它们。这样做可以防止恶意用户的攻击,以及异常输入带来的意外问题。

对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) . "'");