关于find()方法的BUG

浏览:936 发布日期:2011/08/20
- 普通 - 未处理
看到手册上:
[quote]5.9.1
防止SQL注入

对于WEB应用来说,SQL注入攻击无疑是首要防范的安全问题,系统底层对于数据安全方面本身进行了很多的处理和相应的防范机制,例如:
$User = M("User"); // 实例化User对象
$User->find($_GET["id"]);
即便用户输入了一些恶意的id参数,系统也会自动加上引号避免恶意注入。事实上,ThinkPHP对所有的数据库CURD的数据都会进行escape_string处理。
……[/quote]

说是可以防止SQL注入,我就拿来使用了。但是在使用过程中遇到了问题:public function read() {
    $Article = M('Article');
    $rs = $Article->find($_GET['id']);
    if (!$rs) {
        $this->error('该篇目不存在');
    }
    $this->assign($rs);
    $this->display();
}
像上面这段代码,当浏览器输入的地址是http://127.0.0.1/index.php/Article/read/http://127.0.0.1/ddown/Article/read/id/,这时候执行的SQL变成了“SELECT * FROM `tb_article` LIMIT 1”。
不是说find()方法可以自动寻找主键吗,这时候由于$_GET['id']没有赋值,find()方法就不找主键了(我的想法是至少也应该给个条件 id=0id=null ),但是执行结果却不会为空!

又或者输入地址是http://127.0.0.1/index.php/Article/read/id/0,这时候直接报错:
[quote]Fatal error: Cannot use assign-op operators with overloaded objects nor string offsets in D:\APMServ5.2.6\www\htdocs\ThinkPHP\Lib\Think\Core\Model.class.php on line 572
[/quote]

如果上面的查询代码改成:
$rs = $Article->find(intval($_GET['id']));
加了强制类型转换,输入地址http://127.0.0.1/index.php/Article/read/http://127.0.0.1/index.php/Article/read/id/abc,这时候执行的SQL变成“SELECT * FROM”,不完整了,连表的名字都没接上。输入地址http://127.0.0.1/index.php/Article/read/id/1倒是正常的。


鉴于find()方法有点问题,我只好将原来的代码改成:
$rs = $Article->getById(intval($_GET['id']));
这样才没有出错。

注:我的TP版本是2.1,用SVN获取。
评论(
后面还有条评论,点击查看>>