2020年4月

$builder = Yii::app()->db->schema->commandBuilder; // 创建builder对象
$command = $builder->createMultipleInsertCommand('{{umeng_message}}', array( // umeng_message为数据库表
    array(// 格式为:'字段' => '值', 不包括主键ID,一个array为一条记录
        'msg_id' => $android['data']['task_id'],
        'detail' => $android['data']['json'],
        'msg_detail_id_fk' => $detailId
    ),
    array(
        'msg_id' => $android['data']['task_id'],
        'detail' => $android['data']['json'],
        'msg_detail_id_fk' => $detailId
    ),
));
$command->execute(); // 执行成功返回true

一般识别爬虫的方法是通过 UserAgent,这种办法最直接,但也很容易伪造,先不管这个了。

实现在 Nginx 中使用 map 指令来匹配一个变量:

map $http_user_agent $is_bot {
    default 0;
    ~[a-z]bot[^a-z] 1;
    ~[sS]pider[^a-z] 1;
    'Yahoo! Slurp China' 1;
    'Mediapartners-Google' 1;
}

在这里我们生成了一个名为 $is_bot 的变量,该变量默认值是 0 ,如果匹配到上述 4 种正则表达式的情况后,值就变成1。你可以继续往 map 中添加新的表达式规则。
然后在 location 中使用该变量:

location / {
    error_page 418 =200 @bots;
    if ($is_bot) {
       return 418;
    }
    proxy_pass http://tomcat_for_normal_visitors;
}

@bots 的定义:

location @bots {
    proxy_pass http://tomcat_for_bot;
}

当判断当前请求是爬虫的时候,返回 418 错误码。
通过 error_page 将 418 错误码改为 200 (正常请求响应码),然后进入 @bots 这个 location 进行下一步处理。@bots 中将请求反向代理到你指定的后端应用。

如此便可将正常的用户访问和爬虫访问独立开来,使二者不会互相影响。

首页你必需拿到主机(就是在主机上操作,不是远程连接上可以操作的)
很多时候我们都会忘记Linux root 用户的口令,下面就教大家如果忘记root口令怎么办

第1步:开机后在启动菜单上定位到系统所启动的选项上,按“e”进入编辑。
第2步:在linux16这行按END键在后面输入“ rd.break console=tty0”,然后按“ctrl+x“,进入到了系统的紧急求援模式
第3步:依次输入以下命令:

#mount –o remount,rw /sysroot
#chroot /sysroot
#passwd

输入新的root密码,2次确认,然后继续

#touch /.autorelabel
#exit
#exitroot

输完以后,系统会重启,输入我们刚才配置的密码登录就行
至此,密码破解完毕

那么怎么来预防别人通过这种方式来破密呢,就是给系统加上第二首锁:
使用 grub2-mkpasswd-pbkdf2 命令生成hash密码
编辑文件/etc/grub.d/文件夹下任意文件,通常编辑10_linux

在末尾添加如下几行:

cat <<EOF
set superusers="admin"
password_pbkdf2 admin xxxxxxxxxx
EOF

xxxxxx就是hash密码,或者用文明密码就是换成
password admin 123456这样

更新grub配置后并重启

#grub2-mkconfig -o /boot/grub2/grub.cfg
#reboot

当你重启过后想输入e编辑启动脚本时,要求认证输入上方的用户名admin和密码123456,才能进入,没错我们再上一把锁,不过有时候也许会坑自己,除非你的确需要这样做

不过这样做了,也有第三招来破密,这里就不写了

扩展文件名: CDbBICommand.php ,将文件放于 protectedcomponents 目录下,确定项目会自动引入这个目录的文件,然后用法:
StatVisitor 是 CActiveRecord 类的数据表模型

$bi = new CDbBICommand(new StatVisitor());
$bi->batchInsert([['name'=>123],['name'=>234]]);

扩展文件代码如下:

<?php

/**
 * class for sql batch insert
 * eg:
 * $bi = new CDbBICommand(new StatVisitor());
 * $bi->batchInsert([['name'=>123],['name'=>234]]);
 */
class CDbBICommand {

    /**
     * CDbBICommand constructor.
     * @param CActiveRecord $acModel
     */
    public function __construct($acModel) {
        $this->ac = $acModel;
        $this->tablename = $this->ac->tableName();
        $this->db = $this->ac->getDbConnection();
        $this->command = $this->db->createCommand();
    }

    public function batchInsert($array_columns) {
        $sql    = '';
        $params = array();
        $i      = 0;
        foreach ($array_columns as $columns) {
            $names        = array();
            $placeholders = array();
            foreach ($columns as $name => $value) {
                if (!$i) {
                    $names[] = $this->db->quoteColumnName($name);
                }
                if ($value instanceof CDbExpression) {
                    $placeholders[] = $value->expression;
                    foreach ($value->params as $n => $v) {
                        $params[$n] = $v;
                    }
                } else {
                    $placeholders[]           = ':' . $name . $i;
                    $params[':' . $name . $i] = $value;
                }
            }
            if (!$i) {
                $sql = 'INSERT INTO ' . $this->db->quoteTableName($this->tablename)
                       . ' (' . implode(', ', $names) . ') VALUES ('
                       . implode(', ', $placeholders) . ')';
            } else {
                $sql .= ',(' . implode(', ', $placeholders) . ')';
            }
            $i++;
        }
        return $this->command->setText($sql)->execute($params);
    }
}

框架自带的批量插入方法,很少有网络资料:

$builder = Yii::app()->db->schema->commandBuilder; // 创建builder对象
$command = $builder->createMultipleInsertCommand('{{umeng_message}}', array( // umeng_message为数据库表
    array(// 格式为:'字段' => '值', 不包括主键ID,一个array为一条记录
        'msg_id' => $android['data']['task_id'],
        'detail' => $android['data']['json'],
        'msg_detail_id_fk' => $detailId
    ),
    array(
        'msg_id' => $android['data']['task_id'],
        'detail' => $android['data']['json'],
        'msg_detail_id_fk' => $detailId
    ),
));
$command->execute(); // 执行成功返回true