总的来说, 这个系统关于安全性的问题做得是比较好的。这些安全性的方面比较多,现在就特别介绍这个 。那什么叫SQL注入呢?我摘一段来自百度百科的介绍。
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令--百度百科
所以一般发生sql注入的问题都是通过表单提交数据,而这个提交的数据又没有做特殊判断处理的话,就很容易发生SQL注入漏洞了。zencart发展到现在,这个问题自然是不会存在的,除非经过第三方二次开发,而又没有很好的做好这方面的处理,才有可能发生。下面就简单的介绍zencart是怎么对这个做的处理。
在zencart里面有可能发生这个问题的就是在用户登录和注册的时候提交的表单数据,这里就以登录页面做介绍。
首先获取用户提交的email和密码。
$email_address = zen_db_prepare_input($_POST['email_address']);
$password = zen_db_prepare_input($_POST['password']);
这里不是直接获取$_POST数据,而是经过了zen_db_prepare_input这个函数处理,这个函数是zencart专门用来处理表单提交的数据,所以二次开发的时候涉及到表单提交的数据,最好按照这个方式来做第一步处理。
这个zen_db_prepare_input函数 的定义如下,
function zen_db_prepare_input($string) {
if (is_string($string)) {
return trim(zen_sanitize_string(stripslashes($string)));
} elseif (is_array($string)) {
reset($string);
while (list($key, $value) = each($string)) {
$string[$key] = zen_db_prepare_input($value);
}
return $string;
} else {
return $string;
}
}
function zen_sanitize_string($string) {
$string = preg_replace('/ +/', ' ', $string);
return preg_replace("/[<>]/", '_', $string);
}
看这个函数的定义就知道这个处理是把html标签替换。做了这一步简单的处理还不可以,接下来还有做第二步处理
第二步就是校验用户是否存在
$check_customer_query = "SELECT customers_id, customers_firstname, customers_lastname, customers_password,
customers_email_address, customers_default_address_id,
customers_authorization, customers_referral
FROM " . TABLE_CUSTOMERS . "
WHERE customers_email_address = :emailAddress";
这个SQL语句并没有直接做密码 的对比,如果简单的做帐号和密码的对比就很容易发生sql注入的危险了。而zencart显然没有这样做,它使用了一个占位符:emailAddress,这个也是很多人觉得奇怪的问题,为什么要这样做呢?还是为了防止sql注入的漏洞。zencart做了如下的处理
$check_customer_query =$db->bindVars($check_customer_query, ':emailAddress', $email_address, 'string');
这个数据库的函数就是对输入的数据做类型的检测和SQL语句安全性的检测,它有两个主要的步骤要处理,首先检查提交的数据的类型是否跟这个函数指定的类型一样,如果不一样,程序就停止运行。其次要检测的就是获取的字符串是否是安全的SQL语言,如果类型检查通过了就调用$this->prepare_input($value);这个函数 ,对SQL语言安全性检查,这个函数 的定义:
function prepare_input($zp_string) {
if (function_exists('mysql_real_escape_string')) {
return mysql_real_escape_string($zp_string, $this->link);
} elseif (function_exists('mysql_escape_string')) {
return mysql_escape_string($zp_string, $this->link);
} else {
return addslashes($zp_string);
}
}
这个函数里面调用的mysql的函数才是最关键的,这里就是把有害的SQL字符去掉,比如把'单引号注释\',这样对SQL语句就没有影响了。
所以如果是做zencart二次开发涉及到表单提交数据的时候,必须要按照这两步来处理才能保证数据的安全,这样就可以防止第三方开发引入的系统漏洞了。
文章来自zencart论坛,转载是为了学习 http://www.zencart-bbs.com/read-htm-tid-4211.html