thinkphp 需要注意的一些漏洞(可能已经修复,此处仅是学习)
部分内容摘自网络。看完之后受益匪浅,和大家分享
之前发过关于thinkphp的一个ip获取漏洞,官方木有反应
http://www.thinkphp.cn/bug/2756.html
于是就考虑到官方的关于web中的sql注入过滤的问题是否也是非常马虎。
看来几篇文章,发现确实这个thinkphp 框架写的不怎么样。对于安全问题视而不见。以下部分内容摘自网络以及本人测试
测试:下载thinkphp的当前最新版本ThinkPHP_3.2,我们来看看代码,用事实说话,在sql注入防止上。thinkphp的处理方式
ThinkPHPLibraryThinkModel.class.php里面有如下的代码
关键是调用了对应的数据库类型里面的escapeString进行处理。因为php通常和mysql作为搭配,我就看了一下mysql的处理。里面包括了mysql和mysqli的处理代码
mysql版本的处理
http://blog.csdn.net/felio/article/details/1226569
按照文章的说明,测试代码test.php,文件保存为gbk格式测试一下就明白addslashes安全性了
http://blog.csdn.net/zhuizhuziwo/article/details/8525789
最后说一句,按照php官方说法,最好用pdo的预处理,看看thinkphp的封装,完全是误人子弟
ThinkPHPLibraryThinkDbDriverPdo.class.php
不多吐槽了。按照php官方说法,大家还是老老实实用pdo的参数绑定方式吧。
下面是参考文章对于pdo有详细说明
http://zhangxugg-163-com.iteye.com/blog/1835721
http://zhangxugg-163-com.iteye.com/blog/1850461
之前发过关于thinkphp的一个ip获取漏洞,官方木有反应
http://www.thinkphp.cn/bug/2756.html
于是就考虑到官方的关于web中的sql注入过滤的问题是否也是非常马虎。
看来几篇文章,发现确实这个thinkphp 框架写的不怎么样。对于安全问题视而不见。以下部分内容摘自网络以及本人测试
测试:下载thinkphp的当前最新版本ThinkPHP_3.2,我们来看看代码,用事实说话,在sql注入防止上。thinkphp的处理方式
ThinkPHPLibraryThinkModel.class.php里面有如下的代码
- protected function parseSql($sql,$parse) {
- // 分析表达式
- if(true === $parse) {
- $options = $this->_parseOptions();
- $sql = $this->db->parseSql($sql,$options);
- }elseif(is_array($parse)){ // SQL预处理
- $parse = array_map(array($this->db,"escapeString"),$parse);
- $sql = vsprintf($sql,$parse);
- }else{
- $sql = strtr($sql,array("__TABLE__"=>$this->getTableName(),"__PREFIX__"=>C("DB_PREFIX")));
- }
- $this->db->setModel($this->name);
- return $sql;
- }
关键是调用了对应的数据库类型里面的escapeString进行处理。因为php通常和mysql作为搭配,我就看了一下mysql的处理。里面包括了mysql和mysqli的处理代码
mysql版本的处理
- public function escapeString($str) {
- if($this->_linkID) {
- return mysql_real_escape_string($str,$this->_linkID);
- }else{
- return mysql_escape_string($str);
- }
- }
- public function escapeString($str) {
- if($this->_linkID) {
- return $this->_linkID->real_escape_string($str);
- }else{
- return addslashes($str);
- }
- }
http://blog.csdn.net/felio/article/details/1226569
按照文章的说明,测试代码test.php,文件保存为gbk格式测试一下就明白addslashes安全性了
- <?php
- error_reporting(0);
- header("Content-Type: text/html; charset=gbk");
- $username = $_POST["username"];
- $sqlx="select id,isDisplay from user where usname="".addslashes($username)."" and passwd="$password"";
- echo $sqlx;
- echo "<br>";
- echo addslashes($username);
- echo 444;
- ?>
- <form action="" method=post>
- <input type=text name="username" value="">
- <input type=submit>
- </form>
http://blog.csdn.net/zhuizhuziwo/article/details/8525789
最后说一句,按照php官方说法,最好用pdo的预处理,看看thinkphp的封装,完全是误人子弟
ThinkPHPLibraryThinkDbDriverPdo.class.php
- protected function parseValue($value) {
- if(is_string($value)) {
- $value = strpos($value,":") === 0 ? $this->escapeString($value) : """.$this->escapeString($value).""";
- }elseif(isset($value[0]) && is_string($value[0]) && strtolower($value[0]) == "exp"){
- $value = $this->escapeString($value[1]);
- }elseif(is_array($value)) {
- $value = array_map(array($this, "parseValue"),$value);
- }elseif(is_bool($value)){
- $value = $value ? "1" : "0";
- }elseif(is_null($value)){
- $value = "null";
- }
- return $value;
- }
- public function escapeString($str) {
- switch($this->dbType) {
- case "PGSQL":
- case "MSSQL":
- case "SQLSRV":
- case "MYSQL":
- return addslashes($str);
- case "IBASE":
- case "SQLITE":
- case "ORACLE":
- case "OCI":
- return str_ireplace(""", """", $str);
- }
- }
不多吐槽了。按照php官方说法,大家还是老老实实用pdo的参数绑定方式吧。
下面是参考文章对于pdo有详细说明
http://zhangxugg-163-com.iteye.com/blog/1835721
http://zhangxugg-163-com.iteye.com/blog/1850461
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。