我正在开发一个使用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;
}
}
答案 0 :(得分:8)
tep_db_input使用mysql_real_escape_string或mysql_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) . "'");