dedecms v5.8 未授权RCE 漏洞

在这篇博文中,我将分享对 Dedecms(或翻译成英文的“Chasing a Dream”CMS)的技术评论,包括它的攻击面以及它与其他应用程序的不同之处。最后,我将结束一个影响v5.8.1 预发布的预认证远程代码执行漏洞。这是一款有趣的软件,因为它自最初发布以来已有 14 年的历史,而且 PHP 多年来发生了很大变化。

对于网上搜索“什么是中国最大的CMS”很快发现,多 源 的状态是DEDECMS是最流行的。然而,这些来源几乎都有一个共同点:它们都是旧的。

所以,我决定做一个粗略的搜索:

dedecms v5.8 未授权RCE 漏洞_第1张图片

该产品部署非常广泛,但自2020 年 12 月 11 日推出以来,此处详述的漏洞影响了少数站点,并且从未将其纳入发布版本。

威胁建模

免责声明:我没有实际威胁建模的经验。在审核目标时,我问自己的第一件事是:如何将输入接受到应用程序中?好吧,事实证明这个目标的问题的答案是在include/common.inc.php脚本中:

function _RunMagicQuotes(&$svar)
{
    if (!@get_magic_quotes_gpc()) {
        if (is_array($svar)) {
            foreach ($svar as $_k => $_v) {
                $svar[$_k] = _RunMagicQuotes($_v);
            }

        } else {
            if (strlen($svar) > 0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_SESSION)#', $svar)) {
                exit('Request var not allow!');
            }
            $svar = addslashes($svar);
        }
    }
    return $svar;
}

//...

if (!defined('DEDEREQUEST')) {
    //检查和注册外部提交的变量   (2011.8.10 修改登录时相关过滤)
    function CheckRequest(&$val)
    {
        if (is_array($val)) {
            foreach ($val as $_k => $_v) {
                if ($_k == 'nvarname') {
                    continue;
                }

                CheckRequest($_k);
                CheckRequest($val[$_k]);
            }
        } else {
            if (strlen($val) > 0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE|_SESSION)#', $val)) { // 2
                exit('Request var not allow!');
            }
        }
    }

    CheckRequest($_REQUEST);
    CheckRequest($_COOKIE);

    foreach (array('_GET', '_POST', '_COOKIE') as $_request) {
        foreach ($$_request as $_k => $_v) {
            if ($_k == 'nvarname') {
                ${$_k} = $_v;
            } else {
                ${$_k} = _RunMagicQuotes($_v); // 1
            }

        }
    }
}

如果我们在这里密切注意,我们可以在[1]看到代码重新启用,该代码register_globals已在PHP 5.4 中删除。

register_globals过去一直是应用程序的一个大问题,并且支持非常丰富的攻击面,这也是 PHP 过去声誉不佳的原因之一。还要注意,它们不保护[2]处的全局数组$_SERVER$_FILES超级全局数组。

这可能会导致行[3] 中的开放重定向 http://target.tld/dede/co_url.php?_SERVER[SERVER_SOFTWARE]=PHP%201%20Development%20Server&_SERVER[SCRIPT_NAME]=http://google.com/或 phar 反序列化等风险include/uploadsafe.inc.php

foreach ($_FILES as $_key => $_value) {
    foreach ($keyarr as $k) {
        if (!isset($_FILES[$_key][$k])) {
            exit("DedeCMS Error: Request Error!");
        }
    }
    if (preg_match('#^(cfg_|GLOBALS)#', $_key)) {
        exit('Request var not allow for uploadsafe!');
    }
    $$_key = $_FILES[$_key]['tmp_name'];
    ${$_key . '_name'} = $_FILES[$_key]['name'];  // 4
    ${$_key . '_type'} = $_FILES[$_key]['type'] = preg_replace('#[^0-9a-z\./]#i', '', $_FILES[$_key]['type']);
    ${$_key . '_size'} = $_FILES[$_key]['size'] = preg_replace('#[^0-9]#', '', $_FILES[$_key]['size']);

    if (is_array(${$_key . '_name'}) && count(${$_key . '_name'}) > 0) {
        foreach (${$_key . '_name'} as $key => $value) {
            if (!empty($value) && (preg_match("#\.(" . $cfg_not_allowall . ")$#i", $value) || !preg_match("#\.#", $value))) {
                if (!defined('DEDEADMIN')) {
                    exit('Not Admin Upload filetype not allow !');
                }
            }
        }
    } else {
        if (!empty(${$_key . '_name'}) && (preg_match("#\.(" . $cfg_not_allowall . ")$#i", ${$_key . '_name'}) || !preg_match("#\.#", ${$_key . '_name'}))) {
            if (!defined('DEDEADMIN')) {
                exit('Not Admin Upload filetype not allow !');
            }
        }
    }

    if (empty(${$_key . '_size'})) {
        ${$_key . '_size'} = @filesize($$_key); // 3
    }
GET /plus/recommend.php?_FILES[poc][name]=0&_FILES[poc][type]=1337&_FILES[poc][tmp_name]=phar:///path/to/uploaded/phar.rce&_FILES[poc][size]=1337 HTTP/1.1
Host: target

我没有报告这些错误,因为它们没有产生任何影响(否则我会称它们为漏洞)。开放 URL 重定向错误本身无法进一步攻击攻击者,如果没有小工具链,则无法触发 phar 反序列化错误。

不过,训练有素的眼睛会发现一些特别有趣的东西。在第[4] 行,代码使用_name未过滤的字符串创建了一个攻击者控制的变量_RunMagicQuotes。这意味着具有管理员凭据的攻击者可以sys_payment.php通过_RunMagicQuotes使用文件上传绕过该函数来触发脚本中的 SQL 注入:

dedecms v5.8 未授权RCE 漏洞_第2张图片

作为参考,我们可以看到 SQL 注入在内部是如何表现的dede/sys_payment.php

//配置支付接口
else if ($dopost == 'config') { // 5
    if ($pay_name == "" || $pay_desc == "" || $pay_fee == "") { // 6
        ShowMsg("您有未填写的项目!", "-1");
        exit();
    }
    $row = $dsql->GetOne("SELECT * FROM `#@__payment` WHERE id='$pid'");
    if ($cfg_soft_lang == 'utf-8') {
        $config = AutoCharset(unserialize(utf82gb($row['config'])));
    } else if ($cfg_soft_lang == 'gb2312') {
        $config = unserialize($row['config']);
    }
    $payments = "'code' => '" . $row['code'] . "',";
    foreach ($config as $key => $v) {
        $config[$key]['value'] = ${$key};
        $payments .= "'" . $key . "' => '" . $config[$key]['value'] . "',";
    }
    $payments = substr($payments, 0, -1);
    $payment = "\$payment=array(" . $payments . ")";
    $configstr = "<" . "?php\r\n" . $payment . "\r\n?" . ">\r\n";
    if (!empty($payment)) {
        $m_file = DEDEDATA . "/payment/" . $row['code'] . ".php";
        $fp = fopen($m_file, "w") or die("写入文件 $safeconfigfile 失败,请检查权限!");
        fwrite($fp, $configstr);
        fclose($fp);
    }
    if ($cfg_soft_lang == 'utf-8') {
        $config = AutoCharset($config, 'utf-8', 'gb2312');
        $config = serialize($config);
        $config = gb2utf8($config);
    } else {
        $config = serialize($config);
    }

    $query = "UPDATE `#@__payment` SET name = '$pay_name',fee='$pay_fee',description='$pay_desc',config='$config',enabled='1' WHERE id='$pid'"; // 7
    $dsql->ExecuteNoneQuery($query); // 8

[5][6] 处,有一些检查$dopost设置为config$pay_name$pay_desc并且$pay_fee是从请求中设置的。稍后在[7]代码使用提供的攻击者构建原始 SQL 查询$pay_name,最后在[8]我认为触发了 SQL 注入......

纵深防御

过去,Dedecms 开发人员受到SQL 注入漏洞的严重打击(可能是由于register_globals在源代码级别启用)。在上面的例子中,我们得到了服务器的响应Safe Alert: Request Error step 2,当然我们的注入失败了。这是为什么?查看include/dedesqli.class.php以了解:

//SQL语句过滤程序,由80sec提供,这里作了适当的修改
function CheckSql($db_string, $querytype = 'select')
{

    // ...more checks...

    //老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以检查它
    if (strpos($clean, 'union') !== false && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0) {
        $fail = true;
        $error = "union detect";
    }

    // ...more checks...

    //老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息
    elseif (preg_match('~\([^)]*?select~s', $clean) != 0) {
        $fail = true;
        $error = "sub select detect";
    }
    if (!empty($fail)) {
        fputs(fopen($log_file, 'a+'), "$userIP||$getUrl||$db_string||$error\r\n");
        exit("Safe Alert: Request Error step 2!");  // 9
    } else {
        return $db_string;
    }

现在我不知道80Sec是谁,但他们看起来很严肃。在CheckSql从被称为Execute

    //执行一个带返回结果的SQL语句,如SELECT,SHOW等
    public function Execute($id = "me", $sql = '')
    {

        //...

        //SQL语句安全检查
        if ($this->safeCheck) {
            CheckSql($this->queryString);
        }

SetQuery

    public function SetQuery($sql)
    {
        $prefix = "#@__";
        $sql = trim($sql);
        if (substr($sql, -1) !== ";") {
            $sql .= ";";
        }
        $sql = str_replace($prefix, $GLOBALS['cfg_dbprefix'], $sql);

        CheckSql($sql, $this->getSQLType($sql)); // 5.7前版本仅做了SELECT的过滤,对UPDATE、INSERT、DELETE等语句并未过滤。
         
        $this->queryString = $sql;
    }

但是我们可以通过使用另一个同样调用的函数来避免这个函数,mysqli_query例如GetTableFields

 //获取特定表的信息
    public function GetTableFields($tbname, $id = "me")
    {
        global $dsqli;
        if (!$dsqli->isInit) {
            $this->Init($this->pconnect);
        }
        $prefix = "#@__";
        $tbname = str_replace($prefix, $GLOBALS['cfg_dbprefix'], $tbname);
        $query = "SELECT * FROM {$tbname} LIMIT 0,1";
        $this->result[$id] = mysqli_query($this->linkID, $query);
    }

不是,只是任何旧水槽。这个不使用引号,所以我们不需要打破带引号的字符串,这是必需的,因为我们的输入将流经_RunMagicQuotes函数。GetTableFields可以dede/sys_data_done.php在第[10]行的脚本中找到危险的用法:

if ($dopost == 'bak') {
    if (empty($tablearr)) {
        ShowMsg('你没选中任何表!', 'javascript:;');
        exit();
    }
    if (!is_dir($bkdir)) {
        MkdirAll($bkdir, $cfg_dir_purview);
        CloseFtp();
    }

    if (empty($nowtable)) {
        $nowtable = '';
    }
    if (empty($fsize)) {
        $fsize = 20480;
    }
    $fsizeb = $fsize * 1024;
    
    //第一页的操作
    if ($nowtable == '') {
        //...
    }
    //执行分页备份
    else {
        $j = 0;
        $fs = array();
        $bakStr = '';

        //分析表里的字段信息
        $dsql->GetTableFields($nowtable); // 10
GET /dede/sys_data_done.php?dopost=bak&tablearr=1&nowtable=%23@__vote+where+1=sleep(5)--+& HTTP/1.1
Host: target
Cookie: PHPSESSID=jr66dkukb66aifov2sf2cuvuah;

但是当然,这需要管理员权限,我们对此并不感兴趣(没有提升权限或绕过身份验证)。

查找预先验证的端点

如果我们尝试有点困难,虽然,我们可以找到一些更有趣的代码include/filter.inc.php在稍旧版本:DedeCMS-V5.7-UTF8-SP2.tar.gz

$magic_quotes_gpc = ini_get('magic_quotes_gpc');
function _FilterAll($fk, &$svar)
{
    global $cfg_notallowstr, $cfg_replacestr, $magic_quotes_gpc;
    if (is_array($svar)) {
        foreach ($svar as $_k => $_v) {
            $svar[$_k] = _FilterAll($fk, $_v);
        }
    } else {
        if ($cfg_notallowstr != '' && preg_match("#" . $cfg_notallowstr . "#i", $svar)) {
            ShowMsg(" $fk has not allow words!", '-1');
            exit();
        }
        if ($cfg_replacestr != '') {
            $svar = preg_replace('/' . $cfg_replacestr . '/i', "***", $svar);
        }
    }
    if (!$magic_quotes_gpc) {
        $svar = addslashes($svar);
    }
    return $svar;
}

/* 对_GET,_POST,_COOKIE进行过滤 */
foreach (array('_GET', '_POST', '_COOKIE') as $_request) {
    foreach ($$_request as $_k => $_v) {
        ${$_k} = _FilterAll($_k, $_v);
    }
}

你能看出这里有什么问题吗?$magic_quotes_gpc配置中的代码集。如果没有在php.inithen 中设置,则addslashes调用。但是我们可以通过$magic_quotes_gpc在请求中使用并重写该变量并避免addslashes!

此代码用于提交由未经身份验证的用户执行的反馈。我决定看一看,我发现以下沉没/plus/bookfeedback.php

else if($action=='send')
{
    //...
    //检查验证码
    if($cfg_feedback_ck=='Y')
    {
        $validate = isset($validate) ? strtolower(trim($validate)) : '';
        $svali = strtolower(trim(GetCkVdValue()));
        if($validate != $svali || $svali=='')
        {
            ResetVdValue();
            ShowMsg('验证码错误!','-1');
            exit();
        }
    }

    //...
    if($comtype == 'comments')
    {
        $arctitle = addslashes($arcRow['arctitle']);
        $arctitle = $arcRow['arctitle'];
        if($msg!='')
        {
            $inquery = "INSERT INTO `#@__bookfeedback`(`aid`,`catid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`, `mid`,`bad`,`good`,`ftype`,`face`,`msg`)
                   VALUES ('$aid','$catid','$username','$bookname','$ip','$ischeck','$dtime', '{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg'); ";  // 11
            $rs = $dsql->ExecuteNoneQuery($inquery); // 12
            if(!$rs)
            {
                echo $dsql->GetError();
                exit();
            }
        }
    }

[11] 中,我们可以看到代码使用攻击者控制的输入(例如$catid和 )构建查询$bookname。有可能进入这个接收器并绕过addslashes触发未经身份验证的 SQL 注入:

我们设置了会话 cookie,因为它与存储在未经身份验证的会话中的验证码相关联:

dedecms v5.8 未授权RCE 漏洞_第3张图片

CheckSql幸运的是,我无法绕过(不),但我可以绕过并从数据库中泄漏一些数据,因为我可以同时使用$catid$bookname进行注入,然后(ab)使用第二个命令:

else if($action=='quote')
{
    $row = $dsql->GetOne("Select * from `#@__bookfeedback` where id ='$fid'");
    require_once(DEDEINC.'/dedetemplate.class.php');
    $dtp = new DedeTemplate();
    $dtp->LoadTemplate($cfg_basedir.$cfg_templets_dir.'/plus/bookfeedback_quote.htm');
    $dtp->Display();
    exit();
}

我所要做的就是猜测$fid(主键)并通过注入$msg的检查它是否匹配pwn,如果匹配,我知道注入的结果已显示给我:

然而,这个 SQL 注入是有限的,因为我不能使用select,sleepbenchmark关键字,因为它们被CheckSql函数拒绝了。自从发现该漏洞以来,开发人员似乎/plus/bookfeedback.php在最新版本中删除了该文件,但绕过的核心问题addslashes仍然存在。在这一点上,如果我们要找到关键漏洞,我们需要关注不同的错误类别。

dedecms v5.8 未授权RCE 漏洞_第4张图片

ShowMsg 模板注入远程代码执行漏洞

  • CVSS: 9.8 (/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
  • 版本:5.8.1 预发布

概括

未经身份验证的攻击者可以针对易受攻击的 Dedecms 版本执行任意代码。

漏洞分析

plus/flink.php脚本内部:

if ($dopost == 'save') {
    $validate = isset($validate) ? strtolower(trim($validate)) : '';
    $svali = GetCkVdValue();
    if ($validate == '' || $validate != $svali) {
        ShowMsg('验证码不正确!', '-1'); // 1
        exit();
    }

[1] 处,我们可以观察到ShowMsg在 中定义的调用include/common.func.php

function ShowMsg($msg, $gourl, $onlymsg = 0, $limittime = 0)
{
    if (empty($GLOBALS['cfg_plus_dir'])) {
        $GLOBALS['cfg_plus_dir'] = '..';
    }
    if ($gourl == -1) { // 2
        $gourl = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; // 3
        if ($gourl == "") {
            $gourl = -1;
        }
    }

    $htmlhead = "
    \r\n\r\nDedeCMS提示信息
    ...
    <script></span><span style="color:#dd1144">\r\n</span><span style="color:#dd1144">"</span>;
    <span style="color:teal">$htmlfoot</span> <strong>=</strong> <span style="color:#dd1144">"
    </script>
    ...
    </body></span><span style="color:#dd1144">\r\n</span><span style="color:#dd1144"></html></span><span style="color:#dd1144">\r\n</span><span style="color:#dd1144">"</span>;

    <span style="color:teal">$litime</span> <strong>=</strong> (<span style="color:teal">$limittime</span> <strong>==</strong> <span style="color:#009999">0</span> <strong>?</strong> <span style="color:#009999">1000</span> <strong>:</strong> <span style="color:teal">$limittime</span>);
    <span style="color:teal">$func</span> <strong>=</strong> <span style="color:#dd1144">''</span>;

    <span style="color:#999988"><em>//...</em></span>

    <strong>if</strong> (<span style="color:teal">$gourl</span> <strong>==</strong> <span style="color:#dd1144">''</span> <strong>||</strong> <span style="color:teal">$onlymsg</span> <strong>==</strong> <span style="color:#009999">1</span>) {
        <span style="color:#999988"><em>//...</em></span>
    } <strong>else</strong> {
        <span style="color:#999988"><em>//...</em></span>
        <span style="color:teal">$func</span> <span style="color:#009999">.</span><strong>=</strong> <span style="color:#dd1144">"var pgo=0;
      function JumpUrl(){
        if(pgo==0){ location='</span><span style="color:teal">$gourl</span><span style="color:#dd1144">'; pgo=1; }
      }</span><span style="color:#dd1144">\r\n</span><span style="color:#dd1144">"</span>;
        <span style="color:teal">$rmsg</span> <strong>=</strong> <span style="color:teal">$func</span>;
        <span style="color:#999988"><em>//...</em></span>
        <strong>if</strong> (<span style="color:teal">$onlymsg</span> <strong>==</strong> <span style="color:#009999">0</span>) {
            <strong>if</strong> (<span style="color:teal">$gourl</span> <strong>!=</strong> <span style="color:#dd1144">'javascript:;'</span> <strong>&&</strong> <span style="color:teal">$gourl</span> <strong>!=</strong> <span style="color:#dd1144">''</span>) {
                <span style="color:teal">$rmsg</span> <span style="color:#009999">.</span><strong>=</strong> <span style="color:#dd1144">"<br /><a href='</span><span style="color:#dd1144">{</span><span style="color:teal">$gourl</span><span style="color:#dd1144">}</span><span style="color:#dd1144">'>如果你的浏览器没反应,请点击这里...</a>"</span>;
                <span style="color:teal">$rmsg</span> <span style="color:#009999">.</span><strong>=</strong> <span style="color:#dd1144">"<br/></div></span><span style="color:#dd1144">\"</span><span style="color:#dd1144">);</span><span style="color:#dd1144">\r\n</span><span style="color:#dd1144">"</span>;
                <span style="color:teal">$rmsg</span> <span style="color:#009999">.</span><strong>=</strong> <span style="color:#dd1144">"setTimeout('JumpUrl()',</span><span style="color:teal">$litime</span><span style="color:#dd1144">);"</span>;
            } <strong>else</strong> {
                <span style="color:#999988"><em>//...</em></span>
            }
        } <strong>else</strong> {
            <span style="color:#999988"><em>//...</em></span>
        }
        <span style="color:teal">$msg</span> <strong>=</strong> <span style="color:teal">$htmlhead</span> <span style="color:#009999">.</span> <span style="color:teal">$rmsg</span> <span style="color:#009999">.</span> <span style="color:teal">$htmlfoot</span>;
    }

    <span style="color:teal">$tpl</span> <strong>=</strong> <strong>new</strong> <span style="color:#445588"><strong>DedeTemplate</strong></span>();
    <span style="color:teal">$tpl</span><strong>-></strong><span style="color:#990000"><strong>LoadString</strong></span>(<span style="color:teal">$msg</span>); <span style="color:#999988"><em>// 4</em></span>
    <span style="color:teal">$tpl</span><strong>-></strong><span style="color:#990000"><strong>Display</strong></span>(); <span style="color:#999988"><em>// 5</em></span>
}
</code></span></span></span></span></code></pre> 
   </div> 
  </div> 
  <p style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">我们可以在<em>[2]</em>中看到,如果<code class="language-plaintext">$gourl</code>设置为 -1,则攻击者可以通过引用标头控制<em>[3]</em><code class="language-plaintext">$gourl</code>处的变量。该变量未过滤并嵌入到变量中,该变量由<em>[4]</em>处的调用加载并由<em>[5]</em>处的调用解析。在里面我们发现:<code class="language-plaintext">$msg</code><code class="language-plaintext">LoadString</code><code class="language-plaintext">Display</code><code class="language-plaintext">include/dedetemplate.class.php</code></span></span></p> 
  <div> 
   <div> 
    <pre class="has" style="margin-left:0;"><code class="language-highlight"><span style="color:#111111"><span style="background-color:#ffffff"><span style="background-color:#eeeeff"><span style="background-color:#eeeeff"><code><strong>class</strong> <span style="color:#445588"><strong>DedeTemplate</strong></span>
{
    <span style="color:#999988"><em>//...</em></span>
    <strong>public</strong> <strong>function</strong> LoadString(<span style="color:teal">$str</span> <strong>=</strong> <span style="color:#dd1144">''</span>)
    {
        <span style="color:teal">$this</span><strong>-></strong>sourceString <strong>=</strong> <span style="color:teal">$str</span>; <span style="color:#999988"><em>// 6</em></span>
        <span style="color:teal">$hashcode</span> <strong>=</strong> <span style="color:#0086b3">md5</span>(<span style="color:teal">$this</span><strong>-></strong>sourceString);
        <span style="color:teal">$this</span><strong>-></strong>cacheFile <strong>=</strong> <span style="color:teal">$this</span><strong>-></strong>cacheDir <span style="color:#009999">.</span> <span style="color:#dd1144">"/string_"</span> <span style="color:#009999">.</span> <span style="color:teal">$hashcode</span> <span style="color:#009999">.</span> <span style="color:#dd1144">".inc"</span>;
        <span style="color:teal">$this</span><strong>-></strong>configFile <strong>=</strong> <span style="color:teal">$this</span><strong>-></strong>cacheDir <span style="color:#009999">.</span> <span style="color:#dd1144">"/string_"</span> <span style="color:#009999">.</span> <span style="color:teal">$hashcode</span> <span style="color:#009999">.</span> <span style="color:#dd1144">"_config.inc"</span>;
        <span style="color:teal">$this</span><strong>-></strong><span style="color:#990000"><strong>ParseTemplate</strong></span>();
    }
    
    <span style="color:#999988"><em>//...</em></span>
    <strong>public</strong> <strong>function</strong> Display()
    {
        <strong>global</strong> <span style="color:teal">$gtmpfile</span>;
        <span style="color:#0086b3">extract</span>(<span style="color:teal">$GLOBALS</span>, <span style="color:teal">EXTR_SKIP</span>);
        <span style="color:teal">$this</span><strong>-></strong><span style="color:#990000"><strong>WriteCache</strong></span>(); <span style="color:#999988"><em>// 7</em></span>
        <strong>include</strong> <span style="color:teal">$this</span><strong>-></strong>cacheFile; <span style="color:#999988"><em>// 9</em></span>
    }
</code></span></span></span></span></code></pre> 
   </div> 
  </div> 
  <p style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">在<em>[6]</em>的<code class="language-plaintext">sourceString</code>设置与攻击者控制的<code class="language-plaintext">$msg</code>。然后在<em>[7] 处</em> <code class="language-plaintext">WriteCache</code>被调用:</span></span></p> 
  <div> 
   <div> 
    <pre class="has" style="margin-left:0;"><code class="language-highlight"><span style="color:#111111"><span style="background-color:#ffffff"><span style="background-color:#eeeeff"><span style="background-color:#eeeeff"><code>    <strong>public</strong> <strong>function</strong> WriteCache(<span style="color:teal">$ctype</span> <strong>=</strong> <span style="color:#dd1144">'all'</span>)
    {
        <strong>if</strong> (<strong>!</strong><span style="color:#0086b3">file_exists</span>(<span style="color:teal">$this</span><strong>-></strong>cacheFile) <strong>||</strong> <span style="color:teal">$this</span><strong>-></strong>isCache <strong>==</strong> <strong>false</strong>
            <strong>||</strong> (<span style="color:#0086b3">file_exists</span>(<span style="color:teal">$this</span><strong>-></strong>templateFile) <strong>&&</strong> (<span style="color:#0086b3">filemtime</span>(<span style="color:teal">$this</span><strong>-></strong>templateFile) <strong>></strong> <span style="color:#0086b3">filemtime</span>(<span style="color:teal">$this</span><strong>-></strong>cacheFile)))
        ) {
            <strong>if</strong> (<strong>!</strong><span style="color:teal">$this</span><strong>-></strong>isParse) {
                <span style="color:#999988"><em>//...</em></span>
            }
            <span style="color:teal">$fp</span> <strong>=</strong> <span style="color:#0086b3">fopen</span>(<span style="color:teal">$this</span><strong>-></strong>cacheFile, <span style="color:#dd1144">'w'</span>) <strong>or</strong> <span style="color:#0086b3">dir</span>(<span style="color:#dd1144">"Write Cache File Error! "</span>);
            <span style="color:#0086b3">flock</span>(<span style="color:teal">$fp</span>, <span style="color:#009999">3</span>);
            <span style="color:teal">$result</span> <strong>=</strong> <span style="color:#0086b3">trim</span>(<span style="color:teal">$this</span><strong>-></strong><span style="color:#990000"><strong>GetResult</strong></span>()); <span style="color:#999988"><em>// 8</em></span>
            <span style="color:teal">$errmsg</span> <strong>=</strong> <span style="color:#dd1144">''</span>;     
            <strong>if</strong> (<strong>!</strong><span style="color:teal">$this</span><strong>-></strong><span style="color:#990000"><strong>CheckDisabledFunctions</strong></span>(<span style="color:teal">$result</span>, <span style="color:teal">$errmsg</span>)) { <span style="color:#999988"><em>// 9</em></span>
                <span style="color:#0086b3">fclose</span>(<span style="color:teal">$fp</span>);
                <strong>@</strong><span style="color:#0086b3">unlink</span>(<span style="color:teal">$this</span><strong>-></strong>cacheFile);
                <strong>die</strong>(<span style="color:teal">$errmsg</span>);
            }
            <span style="color:#0086b3">fwrite</span>(<span style="color:teal">$fp</span>, <span style="color:teal">$result</span>);
            <span style="color:#0086b3">fclose</span>(<span style="color:teal">$fp</span>);
            <span style="color:#999988"><em>//...</em></span>
        }
</code></span></span></span></span></code></pre> 
   </div> 
  </div> 
  <p style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">在<em>[8] 处</em>,代码调用<code class="language-plaintext">GetResult</code>返回值<code class="language-plaintext">sourceString</code>来设置<code class="language-plaintext">$result</code>变量,该变量现在包含攻击者控制的输入。在<em>[9] 处,</em>该<code class="language-plaintext">CheckDisabledFunctions</code>函数在<code class="language-plaintext">$result</code>变量上被调用。让我们看看是什么<code class="language-plaintext">CheckDisabledFunctions</code>:</span></span></p> 
  <div> 
   <div> 
    <pre class="has" style="margin-left:0;"><code class="language-highlight"><span style="color:#111111"><span style="background-color:#ffffff"><span style="background-color:#eeeeff"><span style="background-color:#eeeeff"><code>    <strong>public</strong> <strong>function</strong> CheckDisabledFunctions(<span style="color:teal">$str</span>, <strong>&</strong><span style="color:teal">$errmsg</span> <strong>=</strong> <span style="color:#dd1144">''</span>)
    {
        <strong>global</strong> <span style="color:teal">$cfg_disable_funs</span>;
        <span style="color:teal">$cfg_disable_funs</span> <strong>=</strong> <strong>isset</strong>(<span style="color:teal">$cfg_disable_funs</span>) <strong>?</strong> <span style="color:teal">$cfg_disable_funs</span> <strong>:</strong> <span style="color:#dd1144">'phpinfo,eval,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,file_put_contents,fsockopen,fopen,fwrite'</span>;
        <span style="color:#999988"><em>// 模板引擎增加disable_functions</em></span>
        <strong>if</strong> (<strong>!</strong><span style="color:#0086b3">defined</span>(<span style="color:#dd1144">'DEDEDISFUN'</span>)) {
            <span style="color:teal">$tokens</span> <strong>=</strong> <span style="color:#990000"><strong>token_get_all_nl</strong></span>(<span style="color:teal">$str</span>);
            <span style="color:teal">$disabled_functions</span> <strong>=</strong> <span style="color:#0086b3">explode</span>(<span style="color:#dd1144">','</span>, <span style="color:teal">$cfg_disable_funs</span>);
            <strong>foreach</strong> (<span style="color:teal">$tokens</span> <strong>as</strong> <span style="color:teal">$token</span>) {
                <strong>if</strong> (<span style="color:#0086b3">is_array</span>(<span style="color:teal">$token</span>)) {
                    <strong>if</strong> (<span style="color:teal">$token</span>[<span style="color:#009999">0</span>] <strong>=</strong> <span style="color:#dd1144">'306'</span> <strong>&&</strong> <span style="color:#0086b3">in_array</span>(<span style="color:teal">$token</span>[<span style="color:#009999">1</span>], <span style="color:teal">$disabled_functions</span>)) {
                        <span style="color:teal">$errmsg</span> <strong>=</strong> <span style="color:#dd1144">'DedeCMS Error:function disabled "'</span> <span style="color:#009999">.</span> <span style="color:teal">$token</span>[<span style="color:#009999">1</span>] <span style="color:#009999">.</span> <span style="color:#dd1144">'" <a href="http://help.dedecms.com/install-use/apply/2013/0711/2324.html" target="_blank">more...</a>'</span>;
                        <strong>return</strong> <strong>false</strong>;
                    }
                }
            }
        }
        <strong>return</strong> <strong>true</strong>;
    }
</code></span></span></span></span></code></pre> 
   </div> 
  </div> 
  <p style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">好。这是可能的攻击者绕过此否认与一些创意几种方式列表,写出恶意PHP到临时文件,并最终达到<code class="language-plaintext">include</code>在<code class="language-plaintext">Display</code>在<em>[9]</em>执行任意代码。</span></span></p> 
  <h4 id="proof-of-concept" style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">概念证明</span></span></h4> 
  <p style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">可以借用自己的代码并调用危险函数,但无论如何都有几种通用方法可以绕过拒绝列表。不检查引用标头是否有双引号,因此以下有效负载将起作用:</span></span></p> 
  <p style="text-align:center;"><a href="http://img.e-com-net.com/image/info8/d34fcb54a1da45d8a901ef1f6a6281dd.jpg" target="_blank"><img alt="dedecms v5.8 未授权RCE 漏洞_第5张图片" src="http://img.e-com-net.com/image/info8/d34fcb54a1da45d8a901ef1f6a6281dd.jpg" width="650" height="142" style="border:1px solid black;"></a></p> 
  <p style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">以下(非详尽的)列表路径可以到达该漏洞:</span></span></p> 
  <ol style="margin-left:30px;"> 
   <li><code class="language-plaintext">/plus/flink.php?dopost=save</code></li> 
   <li><code class="language-plaintext">/plus/users_products.php?oid=1337</code></li> 
   <li><code class="language-plaintext">/plus/download.php?aid=1337</code></li> 
   <li><code class="language-plaintext">/plus/showphoto.php?aid=1337</code></li> 
   <li><code class="language-plaintext">/plus/users-do.php?fmdo=sendMail</code></li> 
   <li><code class="language-plaintext">/plus/posttocar.php?id=1337</code></li> 
   <li><code class="language-plaintext">/plus/vote.php?dopost=view</code></li> 
   <li><code class="language-plaintext">/plus/carbuyaction.php?do=clickout</code></li> 
   <li><code class="language-plaintext">/plus/recommend.php</code></li> 
   <li>…</li> 
  </ol> 
  <h3 id="reporting" style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">报告</span></span></h3> 
  <p style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">我在 2021 年 4 月左右发现了这个漏洞,但决定继续使用它,因为它只影响pre-release发行版而不是发行版。在 repo 上几个月不活动后,我决定在 9 月 23 日向该错误报告,<code class="language-plaintext">opensource@dedecms.com</code>两天后发布了一个解决该错误的静默补丁:</span></span></p> 
  <p style="text-align:center;"><a href="http://img.e-com-net.com/image/info8/aca73b304e6744478d658c4740b85ae8.jpg" target="_blank"><img alt="dedecms v5.8 未授权RCE 漏洞_第6张图片" src="http://img.e-com-net.com/image/info8/aca73b304e6744478d658c4740b85ae8.jpg" width="650" height="200" style="border:1px solid black;"></a></p> 
  <p style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">由于开发人员的这种行为,我决定不报告影响发布版本的其余 RCE 漏洞。虽然我同意不需要 CVE,但我确实认为至少应该在提交中添加安全说明。</span></span></p> 
  <h3 id="conclusion" style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">结论</span></span></h3> 
  <p style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">我真的很喜欢审核中国软件,因为开发人员的思维方式往往与西方开发人员截然不同。逻辑流程更加流畅,作为安全审计员,它要求您在看到代码中出现的新模式时站起来思考并改变策略。</span></span></p> 
  <p style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">这是一个简单的提醒,即使产品被审计到死,<strong>也不要对自己失去信心</strong>。即使您不会说中文,您的下一个 RCE 也即将到来。</span></span></p> 
  <h3 id="references" style="margin-left:0;"><span style="color:#111111;"><span style="background-color:#ffffff;">参考</span></span></h3> 
  <ul style="margin-left:30px;"> 
   <li>https://laworigin.github.io/2018/03/07/CVE-2018-7700-dedecms%E5%90%8E%E5%8F%B0%E4%BB%BB%E6%84%8F%E4% BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/</li> 
  </ul> 
  <div> 
   <div></div> 
  </div> 
  <div> 
   <div></div> 
  </div> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1744040402056396800"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(网络渗透,安全漏洞,网络安全,安全)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1904077984357216256.htm"
                           title="JavaScript(JS)单线程影响速度" target="_blank">JavaScript(JS)单线程影响速度</a>
                        <span class="text-muted">ok060</span>
<a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a>
                        <div>js单线程影响速度在JavaScript(JS)中,单线程的本质是其执行模型的核心特点,这意味着同一时间只能执行一个任务。这种设计使得JS在处理诸如DOM操作、用户交互等任务时更为直观和安全,因为它避免了复杂的多线程并发问题,如竞态条件(raceconditions)和死锁(deadlocks)。然而,单线程的特性也确实影响了其处理大量计算或I/O密集型任务时的性能。影响速度的原因阻塞性操作:在单</div>
                    </li>
                    <li><a href="/article/1904073749683040256.htm"
                           title="腾讯面经,有点难度~" target="_blank">腾讯面经,有点难度~</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AFgo/1.htm">后端go</a>
                        <div>今天分享组织内的朋友在腾讯安全的实习面经。内容涵盖了QPS测试方法、SQL聚合查询、Linux进程管理、Redis数据结构与持久化、NAT原理、Docker隔离机制、Go语言GMP调度模型、协程控制、系统调用流程、变量逃逸分析及map操作等等知识点。下面是我整理的面经详解:面经详解一个表,里面有数据列,id,name,class,查学生最喜欢的前10个课程,sql语句实现SELECTclass,C</div>
                    </li>
                    <li><a href="/article/1904072733700976640.htm"
                           title="DunTrust IP SSL证书——支持多端口验证" target="_blank">DunTrust IP SSL证书——支持多端口验证</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/https/1.htm">https</a>
                        <div>市面上99%的证书品牌的IPSSL证书在签发过程中会涉及默认80或者443端口开放问题,但是也有少数服务商也支持其他端口验证。一、IPSSL证书概述IPSSL证书是一种用于保护IP地址安全的SSL证书,它能够对IP地址进行HTTPS加密,确保传输数据的安全性和完整性。IPSSL证书通常用于没有域名或需要直接使用IP地址进行访问的场景。二、多端口验证的支持情况市面上99%的证书品牌的IPSSL证书在</div>
                    </li>
                    <li><a href="/article/1904072478037176320.htm"
                           title="内网IP地址SSL证书申请指南" target="_blank">内网IP地址SSL证书申请指南</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a>
                        <div>SSL/TLS证书是保障网站和服务安全的重要工具,能够加密数据传输并验证服务器身份。然而,对于局域网/内网IP地址而言,申请SSL证书的过程具有一定的特殊性,以下是一份详细的攻略:一、了解局域网/内网IP地址的特殊性唯一性问题:局域网/内网IP地址在内部网络中可能具有唯一性,但在整个互联网中并不唯一。访问限制:局域网/内网IP地址通常只能在内部网络中访问,无法从外部网络直接访问。二、选择证书颁发机</div>
                    </li>
                    <li><a href="/article/1904064785578782720.htm"
                           title="SM国密算法深度解析与技术实践" target="_blank">SM国密算法深度解析与技术实践</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a>
                        <div>SM国密算法深度解析与技术实践一、算法体系概述SM系列密码算法是由中国国家密码管理局发布的商用密码标准体系,涵盖非对称加密、对称加密、杂凑算法、标识密码等多个领域。其核心组件包括:SM2:基于椭圆曲线的非对称加密算法(GB/T32918)SM3:密码杂凑算法(GB/T32905)SM4:分组对称加密算法(GB/T32907)与国际算法对比类型国密算法国际标准密钥长度安全强度非对称加密SM2RSA-</div>
                    </li>
                    <li><a href="/article/1904063111523004416.htm"
                           title="文件的基本的基本属性" target="_blank">文件的基本的基本属性</a>
                        <span class="text-muted">伶星37</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>为什么要有基本属性Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。例子你可以把Linux比作成一个学校,里面的人学生老师校长里面的资料课本学校档案老师个人备案资料学生只能看课本,其他的都不能看,而老师,可以看老师备案资料和课本。校长上面都可以看。在Linux中我们通常使</div>
                    </li>
                    <li><a href="/article/1904058822549368832.htm"
                           title="JVM 类加载器之间的层次关系,以及类加载的委托机制" target="_blank">JVM 类加载器之间的层次关系,以及类加载的委托机制</a>
                        <span class="text-muted">冰糖心书房</span>
<a class="tag" taget="_blank" href="/search/JVM/1.htm">JVM</a><a class="tag" taget="_blank" href="/search/2025/1.htm">2025</a><a class="tag" taget="_blank" href="/search/Java%E9%9D%A2%E8%AF%95%E7%B3%BB%E5%88%97/1.htm">Java面试系列</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a>
                        <div>JVM类加载器之间存在一种层次关系,通常被称为双亲委派模型(ParentDelegationModel)。这种层次关系和委托机制是Java类加载机制的核心,对于保证Java程序的安全性和避免类冲突至关重要。1.类加载器的层次关系:JVM中的类加载器(ClassLoader)主要分为以下几种,它们之间存在自顶向下的层次关系(父子关系,但不是继承关系,而是组合关系):启动类加载器(BootstrapC</div>
                    </li>
                    <li><a href="/article/1904048982498275328.htm"
                           title="使用 Docker 部署 Puter 云桌面系统" target="_blank">使用 Docker 部署 Puter 云桌面系统</a>
                        <span class="text-muted">Jaxx.Wang</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/1.htm">开源项目</a><a class="tag" taget="_blank" href="/search/Docker/1.htm">Docker</a>
                        <div>1)Puter介绍:::infoGitHub:https://github.com/HeyPuter/puter:::Puter是一个先进的开源桌面环境,运行在浏览器中,旨在具备丰富的功能、异常快速和高度可扩展性。它可以用于构建远程桌面环境,也可以作为云存储服务、远程服务器、Web托管平台等的界面。Puter是一个隐私至上的个人云,可以将您的所有文件、应用程序和游戏保存在一个安全的地方,随时随地都</div>
                    </li>
                    <li><a href="/article/1904044697244987392.htm"
                           title="Python密码学:cryptography库" target="_blank">Python密码学:cryptography库</a>
                        <span class="text-muted">零 度°</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%AF%86%E7%A0%81%E5%AD%A6/1.htm">密码学</a>
                        <div>在数字时代,确保数据的安全性和隐私至关重要。Python中的cryptography库是一个全面的包,为Python开发者提供了密码学原语和配方。它支持高级配方和常见密码学算法的低级接口。cryptography库概述cryptography库旨在易于使用且默认安全。它包括各种密码学操作的高级和低级API,如:对称加密非对称加密哈希函数消息认证码(MAC)数字签名密钥管理cryptography库</div>
                    </li>
                    <li><a href="/article/1904044192745713664.htm"
                           title="网安会有35岁中年危机吗,还有网安将来发展怎么样?网络安全工程师可以干到多大年龄" target="_blank">网安会有35岁中年危机吗,还有网安将来发展怎么样?网络安全工程师可以干到多大年龄</a>
                        <span class="text-muted">认真写程序的强哥</span>
<a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E5%B9%B2%E8%B4%A7%E5%88%86%E4%BA%AB/1.htm">干货分享</a><a class="tag" taget="_blank" href="/search/%E9%BB%91%E5%AE%A2%E6%8A%80%E6%9C%AF/1.htm">黑客技术</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/1.htm">渗透测试</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">计算机</a>
                        <div>关于35岁中年危机这个问题,我想说,在网安行业里,这根本就不是个事儿!!与传统的IT行业不同,网安行业更加注重实战经验和技能深度,而不是单一的年龄因素。随着经验的积累,网络安全工程师在面对复杂问题时,反应更快、决策更准,这种价值是无法用年龄来衡量的。所以,只要你保持学习热情,不断提升自己的技能,35岁不仅不是终点,反而可能是你职业生涯的新起点。初入计算机行业的人或者想转行大学计算机相关专业准程序员</div>
                    </li>
                    <li><a href="/article/1904043688774922240.htm"
                           title="Python---frozenset集合" target="_blank">Python---frozenset集合</a>
                        <span class="text-muted">爱听雨声的北方汉</span>
<a class="tag" taget="_blank" href="/search/%E5%BF%AB%E5%BF%AB%E4%B9%90%E4%B9%90%E5%AD%A6Python/1.htm">快快乐乐学Python</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a>
                        <div>frozenset是set的不可变版本,因此set集合中所有能改变集合本身的方法(如add、remove、discard、xxx_update等),frozenset都不支持;set集合中不改变集合本身的方法,fronzenset都支持。frozenset的作用主要有以下两点:1、当集合元素不需要改变时,使用frozenset代替set更安全。2、当某些API需要不可变对象时,必须用frozens</div>
                    </li>
                    <li><a href="/article/1904042931728216064.htm"
                           title="(python)保障信息安全的加密库-cryptography" target="_blank">(python)保障信息安全的加密库-cryptography</a>
                        <span class="text-muted">Marst·Zhang</span>
<a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/1.htm">基础知识</a><a class="tag" taget="_blank" href="/search/%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7/1.htm">实用工具</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>前言cryptography是一个广泛使用的Python加密库,提供了各种加密、哈希和签名算法的实现。它支持多种加密算法,如AES、RSA、ECC等,以及哈希函数(如SHA-256、SHA-384等)和数字签名算法(如DSA、ECDSA等).目录常见用途密码学函数主要功能优点缺点总结常见用途数据加密使用对称加密算法(如AES)对数据进行加密,确保数据在传输或存储过程中的机密性。数字签名生成和验证数</div>
                    </li>
                    <li><a href="/article/1904039275201097728.htm"
                           title="Python文件加密库之cryptography使用详解" target="_blank">Python文件加密库之cryptography使用详解</a>
                        <span class="text-muted">Rocky006</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>概要在现代信息社会中,数据的安全性变得越来越重要。为了保护敏感信息,文件加密技术被广泛应用。Python的cryptography库提供了强大的加密功能,可以轻松实现文件加密和解密。本文将详细介绍如何使用cryptography库进行文件加密,包含具体的示例代码。cryptography库简介cryptography是Python中一个功能强大且易用的加密库,提供了对称加密、非对称加密、哈希算法、</div>
                    </li>
                    <li><a href="/article/1904037509009043456.htm"
                           title="国内外的网络安全成难题,IPLOOK 2022年用产品筑起“护城墙”" target="_blank">国内外的网络安全成难题,IPLOOK 2022年用产品筑起“护城墙”</a>
                        <span class="text-muted">爱浦路 IPLOOK</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8%E6%9E%B6%E6%9E%84/1.htm">安全架构</a>
                        <div>《爱尔兰时报》和爱尔兰国家广播电台(RTE)于12月31日对2021年爱尔兰科技行业的赢家和弱点进行了年终盘点。双方纷纷表示,2021年爱尔兰科技行业最大的弱点是爱尔兰的网络安全,这一年是一场前所未有的灾难。随着人工智能、大数据、5G等新兴技术的发展,企业面临的威胁日益增加,信息安全的重要性变得越来越突显。现在我们把视线从爱尔兰的网络安全问题拉回到国内的网络安全现状。我国对网络安全问题保持时刻警惕</div>
                    </li>
                    <li><a href="/article/1904034610807894016.htm"
                           title="cryptography,一个神奇的 Python 库!" target="_blank">cryptography,一个神奇的 Python 库!</a>
                        <span class="text-muted">Sitin涛哥</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>更多资料获取个人网站:ipengtao.com大家好,今天为大家分享一个神奇的Python库-cryptography。Github地址:https://github.com/pyca/cryptography在当今数字化时代,信息安全越来越受到重视。数据加密是保护数据安全的重要手段之一,而Python的cryptography库提供了丰富的功能来支持各种加密算法和协议。本文将深入探讨crypto</div>
                    </li>
                    <li><a href="/article/1904026912141930496.htm"
                           title="Java多线程" target="_blank">Java多线程</a>
                        <span class="text-muted">反方向的空</span>
<a class="tag" taget="_blank" href="/search/Java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">Java多线程</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>Java多线程为什么要在代码中引入多线程?可以使用多个线程来处理任务,提高效率如果阻塞点过多,一个线程会处理不过来;例如TCP服务器在等待建立连接的时候会阻塞,而整个流程不能因为这个而卡死在这里,所以引入另外的线程去处理另外的任务哪些地方是线程安全问题的风险点?线程对共享数据修改的部分,必须考虑是否线程安全!!!并发编程的优缺点为什么要使用并发编程?(优点)充分利用多核CPU的计算能力:通过并发编</div>
                    </li>
                    <li><a href="/article/1904026026992791552.htm"
                           title="GSMA SAS 安全生产审计检查清单" target="_blank">GSMA SAS 安全生产审计检查清单</a>
                        <span class="text-muted">SofterICer</span>
<a class="tag" taget="_blank" href="/search/eSIM/1.htm">eSIM</a><a class="tag" taget="_blank" href="/search/SAS/1.htm">SAS</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                        <div>GSMASAS安全生产审计检查清单以下是根据GSMAFS.18-SecurityAccreditationScheme-ConsolidatedSecurityRequirementsandGuidelinesv11.1文档中与安全生产相关的章节,整理的安全生产审计检查清单。该清单涵盖了生产流程安全的关键领域、控制措施和最佳实践,并按照文档结构进行组织。1.生产流程控制控制措施/要求适用性状态备注</div>
                    </li>
                    <li><a href="/article/1904010891997802496.htm"
                           title="探索NebulaGraph:一个开源分布式图数据库的技术解析" target="_blank">探索NebulaGraph:一个开源分布式图数据库的技术解析</a>
                        <span class="text-muted">一休哥助手</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/1.htm">分布式系统</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>1.介绍NebulaGraph的定位和用途NebulaGraph是一款开源的分布式图数据库,专注于存储和处理大规模图数据。它的主要定位是为了解决图数据存储和分析的问题,能够处理节点和边数量巨大、结构复杂的图结构数据。NebulaGraph被设计用来应对各种领域的图数据挑战,包括社交网络分析、推荐系统、网络安全监测等。无论是从数据量还是计算复杂度上,NebulaGraph都能够应对各种挑战,为用户提</div>
                    </li>
                    <li><a href="/article/1904007899798106112.htm"
                           title="与普通日期格式化对比,FastDateFormat 为何能线程安全?" target="_blank">与普通日期格式化对比,FastDateFormat 为何能线程安全?</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>FastDateFormat为什么线程安全SimpleDateFormat的线程不安全大家都知道SimpleDateFormat是线程不安全的protectedCalendarcalendar;SimpleDateFormat中的calendar是成员变量,同实例多个线程下会共享该calendar对象而在进行格式化的时候可能会由于第一个线程还没有格式化完成,而第二个线程已经将时间修改了的情况pri</div>
                    </li>
                    <li><a href="/article/1904002699565789184.htm"
                           title="加州CA 65测试(Proposition 65)的深度解读" target="_blank">加州CA 65测试(Proposition 65)的深度解读</a>
                        <span class="text-muted">南京速跃检测技术服务有限公司</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95/1.htm">学习方法</a><a class="tag" taget="_blank" href="/search/%E5%88%9B%E4%B8%9A%E5%88%9B%E6%96%B0/1.htm">创业创新</a>
                        <div>以下是关于加州CA65测试(Proposition65)的深度解读,结合法规核心、测试范围及合规影响进行结构化分析:一、法规背景与核心要求1.法规起源-名称:《1986年加州安全饮用水和有毒物质执行法》(SafeDrinkingWaterandToxicEnforcementAct),简称CA65或Prop65。-目的:保护加州居民免受致癌、致畸或生殖毒性化学物质的暴露风险,要求企业提供清晰警告标</div>
                    </li>
                    <li><a href="/article/1903999550356516864.htm"
                           title="深入理解 Java 内存模型(JMM):原理、可见性与并发控制" target="_blank">深入理解 Java 内存模型(JMM):原理、可见性与并发控制</a>
                        <span class="text-muted">全栈探索者chen</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/1.htm">程序人生</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/JMM/1.htm">JMM</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E5%AD%98/1.htm">内存</a>
                        <div>深入理解Java内存模型(JMM):原理、可见性与并发控制1.引言在多线程编程中,内存可见性、指令重排序和线程同步是开发者必须理解的核心概念。Java内存模型(JMM,JavaMemoryModel)定义了一组规则,确保Java程序在并发环境下的线程安全性和一致性。本文将深入剖析JMM的原理,并通过代码示例展示如何正确控制并发。2.什么是Java内存模型(JMM)?Java内存模型(JMM)是Ja</div>
                    </li>
                    <li><a href="/article/1903996020279275520.htm"
                           title="OpenSSH详解:构建安全远程管理的核心技术" target="_blank">OpenSSH详解:构建安全远程管理的核心技术</a>
                        <span class="text-muted">ScilogyHunter</span>
<a class="tag" taget="_blank" href="/search/%E5%B8%B8%E8%A7%81%E8%BD%AF%E4%BB%B6%E5%BA%93/1.htm">常见软件库</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/OpenSSH/1.htm">OpenSSH</a>
                        <div>OpenSSH详解:构建安全远程管理的核心技术引言在数字化时代,远程管理服务器和数据传输的安全性至关重要。OpenSSH(OpenSecureShell)作为SSH协议的开源实现,通过加密通信、身份验证和数据完整性保护,彻底解决了传统工具(如Telnet、FTP)的明文传输风险。本文将从核心原理、配置实践到高级功能,全面解析OpenSSH的技术细节与应用场景。一、OpenSSH的核心架构与工作原理</div>
                    </li>
                    <li><a href="/article/1903995511321456640.htm"
                           title="交换机救命命令手册:华为 & 思科平台最全运维指令速查表" target="_blank">交换机救命命令手册:华为 & 思科平台最全运维指令速查表</a>
                        <span class="text-muted">IT程序媛-桃子</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E9%80%9A/1.htm">数通</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA%E8%AE%A4%E8%AF%81/1.htm">华为认证</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>引言:这是一份救命的交换机运维秘籍在交换机配置与故障排查过程中,不论你是初入网络世界的小白,还是年资数年的资深工程师,总会遇到那些“关键时刻靠得住的命令”。这篇文章,我将整理一份覆盖华为+思科双平台的实战命令手册,从最基础的设备状态查看,到VLAN、STP、防环、LACP、QOS、抓包、限速、安全加固等操作,通通囊括。关键时刻,拿来即用,就是这篇的全部意义。01️⃣基础生存命令:先活下来再说场景华</div>
                    </li>
                    <li><a href="/article/1903994123828916224.htm"
                           title="数据安全新纪元——多方安全计算与MySQL结合的隐私预算管理深度解析" target="_blank">数据安全新纪元——多方安全计算与MySQL结合的隐私预算管理深度解析</a>
                        <span class="text-muted">墨夶</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%991/1.htm">数据库学习资料1</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                        <div>在当今数字化时代,数据已成为企业最宝贵的资产之一。然而,随着数据泄露事件频发,如何确保数据的安全性和隐私性成为了亟待解决的问题。传统的加密技术虽然能在一定程度上保护静态数据,但在动态数据分析过程中却显得力不从心。为了解决这一难题,隐私计算作为一种新兴的技术应运而生,它允许在不解密原始数据的前提下进行有效的计算和分析。本文将深入探讨如何利用多方安全计算(MPC)与关系型数据库MySQL相结合的方式实</div>
                    </li>
                    <li><a href="/article/1903990972082089984.htm"
                           title="Java 24 正式发布:AI 开发与后量子安全引领企业级编程革命" target="_blank">Java 24 正式发布:AI 开发与后量子安全引领企业级编程革命</a>
                        <span class="text-muted">程序猿小白菜</span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AFjava%E7%94%9F%E6%80%81%E5%9C%88/1.htm">后端java生态圈</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a>
                        <div>摘要2025年3月18日,Oracle正式发布Java24(OracleJDK24),这是Java诞生30周年之际的重要版本更新。新版本聚焦AI开发支持、后量子安全加密、性能优化和开发效率提升,提供20余项新特性及数千项改进,为企业级应用开发注入全新动力。一、语言特性:代码简洁性与模式匹配增强Java24在语法层面进一步简化代码逻辑,提升开发效率:JEP488:原始类型模式匹配(第二次预览)支持在</div>
                    </li>
                    <li><a href="/article/1903980622125264896.htm"
                           title="密码学,算法在人工智能的实战利用" target="_blank">密码学,算法在人工智能的实战利用</a>
                        <span class="text-muted">china—hbaby</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%AF%86%E7%A0%81%E5%AD%A6/1.htm">密码学</a>
                        <div>在人工智能(AI)的快速发展中,数据安全和隐私保护成为了核心议题。密码学,作为保护信息安全的基石,其在AI领域的应用显得尤为重要。本文将探讨密码学在AI中的利用,并提供一些代码示例来展示其实际应用。密码学的概述即常用加密方式密码学(Cryptography)是数学和计算机科学的一个分支,它涉及保护信息的安全性和隐私性。密码学的主要目标是确保信息在传输过程中不被未授权的第三方读取或篡改,以及确保信息</div>
                    </li>
                    <li><a href="/article/1903950478186704896.htm"
                           title="Appdata\Local Roaming LocalLow文件夹" target="_blank">Appdata\Local Roaming LocalLow文件夹</a>
                        <span class="text-muted">ynchyong</span>
<a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E8%BF%90%E7%BB%B4/1.htm">系统运维</a><a class="tag" taget="_blank" href="/search/local/1.htm">local</a><a class="tag" taget="_blank" href="/search/Roaming/1.htm">Roaming</a><a class="tag" taget="_blank" href="/search/LocalLow/1.htm">LocalLow</a>
                        <div>自Vista及Win7开始,微软更改了原有的应用程序存储目录结构,(XP是ApplicationData)C\用户\用户名\Appdata,并分为Roaming,Local,及LocalLow三个文件夹.更改原因如下:优化登录速度根据使用安全级别分别访问不同文件夹Windows使用Local及LocalLow文件夹存放非漫游的应用程序数据(类似注册表Local_machine)及一些空间占用大无法</div>
                    </li>
                    <li><a href="/article/1903949088987082752.htm"
                           title="Python 用户账户(创建用户账户)" target="_blank">Python 用户账户(创建用户账户)</a>
                        <span class="text-muted">钢铁男儿</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/1.htm">从入门到精通</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/sqlite/1.htm">sqlite</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>Web应用程序的核心是让任何用户都能够注册账户并能够使用它,不管用户身处何方。在本章中,你将创建一些表单,让用户能够添加主题和条目,以及编辑既有的条目。你还将学习Django如何防范对基于表单的网页发起的常见攻击,这让你无需花太多时间考虑确保应用程序安全的问题。然后,我们将实现一个用户身份验证系统。你将创建一个注册页面,供用户创建账户,并让有些页面只能供已登录的用户访问。接下来,我们将修改一些视图</div>
                    </li>
                    <li><a href="/article/1903944417417424896.htm"
                           title="深度学习框架PyTorch——从入门到精通(6.2)自动微分机制" target="_blank">深度学习框架PyTorch——从入门到精通(6.2)自动微分机制</a>
                        <span class="text-muted">Fansv587</span>
<a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/pytorch/1.htm">pytorch</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a>
                        <div>本节自动微分机制是上一节自动微分的扩展内容自动微分是如何记录运算历史的保存张量非可微函数的梯度在本地设置禁用梯度计算设置requires_grad梯度模式(GradModes)默认模式(梯度模式)无梯度模式推理模式评估模式(`nn.Module.eval()`)自动求导中的原地操作原地操作的正确性检查多线程自动求导CPU上的并发不确定性计算图保留自动求导节点的线程安全性C++钩子函数不存在线程安全</div>
                    </li>
                    <li><a href="/article/1903939242027970560.htm"
                           title="云计算习题" target="_blank">云计算习题</a>
                        <span class="text-muted">「已注销」</span>

                        <div>云计算一、单选题二、多选题三、实操题单选题多选题实操题一、单选题下面哪个是软件代码版本控制软件?(B)A.projectB.SVNC.notepad++D.Xshell为满足金融业务的监管和安全要求,平台不需要考虑下列哪个应用?(A)A.文档版本管理B.防火墙策略C.安全漏洞扫描D.多租户安全隔离以下哪一个是项目收尾过程的正确顺序?(C)A.得到正式验收、解散团队、写出经验教训、结束合同B.写出经</div>
                    </li>
                                <li><a href="/article/50.htm"
                                       title="java封装继承多态等" target="_blank">java封装继承多态等</a>
                                    <span class="text-muted">麦田的设计者</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/encapsulatopn/1.htm">encapsulatopn</a>
                                    <div>       最近一段时间看了很多的视频却忘记总结了,现在只能想到什么写什么了,希望能起到一个回忆巩固的作用。 
    1、final关键字 
      译为:最终的 
       &</div>
                                </li>
                                <li><a href="/article/177.htm"
                                       title="F5与集群的区别" target="_blank">F5与集群的区别</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/weblogic/1.htm">weblogic</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E7%BE%A4/1.htm">集群</a><a class="tag" taget="_blank" href="/search/F5/1.htm">F5</a>
                                    <div>        http请求配置不是通过集群,而是F5;集群是weblogic容器的,如果是ejb接口是通过集群。 
        F5同集群的差别,主要还是会话复制的问题,F5一把是分发http请求用的,因为http都是无状态的服务,无需关注会话问题,类似</div>
                                </li>
                                <li><a href="/article/304.htm"
                                       title="LeetCode[Math] - #7 Reverse Integer" target="_blank">LeetCode[Math] - #7 Reverse Integer</a>
                                    <span class="text-muted">Cwind</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%A2%98%E8%A7%A3/1.htm">题解</a><a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a><a class="tag" taget="_blank" href="/search/LeetCode/1.htm">LeetCode</a><a class="tag" taget="_blank" href="/search/Algorithm/1.htm">Algorithm</a>
                                    <div>原题链接:#7 Reverse Integer 
  
要求: 
按位反转输入的数字 
例1: 输入 x = 123, 返回 321 
例2: 输入 x = -123, 返回 -321 
  
难度:简单 
  
分析: 
对于一般情况,首先保存输入数字的符号,然后每次取输入的末位(x%10)作为输出的高位(result = result*10 + x%10)即可。但</div>
                                </li>
                                <li><a href="/article/431.htm"
                                       title="BufferedOutputStream" target="_blank">BufferedOutputStream</a>
                                    <span class="text-muted">周凡杨</span>

                                    <div>     首先说一下这个大批量,是指有上千万的数据量。 
     例子: 
     有一张短信历史表,其数据有上千万条数据,要进行数据备份到文本文件,就是执行如下SQL然后将结果集写入到文件中! 
     select t.msisd</div>
                                </li>
                                <li><a href="/article/558.htm"
                                       title="linux下模拟按键输入和鼠标" target="_blank">linux下模拟按键输入和鼠标</a>
                                    <span class="text-muted">被触发</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                    <div>查看/dev/input/eventX是什么类型的事件, cat /proc/bus/input/devices 
设备有着自己特殊的按键键码,我需要将一些标准的按键,比如0-9,X-Z等模拟成标准按键,比如KEY_0,KEY-Z等,所以需要用到按键 模拟,具体方法就是操作/dev/input/event1文件,向它写入个input_event结构体就可以模拟按键的输入了。 
 
linux/in</div>
                                </li>
                                <li><a href="/article/685.htm"
                                       title="ContentProvider初体验" target="_blank">ContentProvider初体验</a>
                                    <span class="text-muted">肆无忌惮_</span>
<a class="tag" taget="_blank" href="/search/ContentProvider/1.htm">ContentProvider</a>
                                    <div>ContentProvider在安卓开发中非常重要。与Activity,Service,BroadcastReceiver并称安卓组件四大天王。 
在android中的作用是用来对外共享数据。因为安卓程序的数据库文件存放在data/data/packagename里面,这里面的文件默认都是私有的,别的程序无法访问。 
如果QQ游戏想访问手机QQ的帐号信息一键登录,那么就需要使用内容提供者COnte</div>
                                </li>
                                <li><a href="/article/812.htm"
                                       title="关于Spring MVC项目(maven)中通过fileupload上传文件" target="_blank">关于Spring MVC项目(maven)中通过fileupload上传文件</a>
                                    <span class="text-muted">843977358</span>
<a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/spring+mvc/1.htm">spring mvc</a><a class="tag" taget="_blank" href="/search/%E4%BF%AE%E6%94%B9%E5%A4%B4%E5%83%8F/1.htm">修改头像</a><a class="tag" taget="_blank" href="/search/%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6/1.htm">上传文件</a><a class="tag" taget="_blank" href="/search/upload/1.htm">upload</a>
                                    <div>Spring MVC 中通过fileupload上传文件,其中项目使用maven管理。 
  
1.上传文件首先需要的是导入相关支持jar包:commons-fileupload.jar,commons-io.jar 
因为我是用的maven管理项目,所以要在pom文件中配置(每个人的jar包位置根据实际情况定) 
<!-- 文件上传 start by zhangyd-c --&g</div>
                                </li>
                                <li><a href="/article/939.htm"
                                       title="使用svnkit api,纯java操作svn,实现svn提交,更新等操作" target="_blank">使用svnkit api,纯java操作svn,实现svn提交,更新等操作</a>
                                    <span class="text-muted">aigo</span>
<a class="tag" taget="_blank" href="/search/svnkit/1.htm">svnkit</a>
                                    <div> 原文:http://blog.csdn.net/hardwin/article/details/7963318 
  
import java.io.File;  
  
import org.apache.log4j.Logger;  
import org.tmatesoft.svn.core.SVNCommitInfo;  
import org.tmateso</div>
                                </li>
                                <li><a href="/article/1066.htm"
                                       title="对比浏览器,casperjs,httpclient的Header信息" target="_blank">对比浏览器,casperjs,httpclient的Header信息</a>
                                    <span class="text-muted">alleni123</span>
<a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/crawler/1.htm">crawler</a><a class="tag" taget="_blank" href="/search/header/1.htm">header</a>
                                    <div>		@Override
		protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
		{
			String type=req.getParameter("type");
			Enumeration es=re</div>
                                </li>
                                <li><a href="/article/1193.htm"
                                       title="java.io操作 DataInputStream和DataOutputStream基本数据流" target="_blank">java.io操作 DataInputStream和DataOutputStream基本数据流</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%B5%81/1.htm">流</a>
                                    <div>1,java中如果不保存整个对象,只保存类中的属性,那么我们可以使用本篇文章中的方法,如果要保存整个对象  先将类实例化  后面的文章将详细写到 
  
  
2,DataInputStream 是java.io包中一个数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。</div>
                                </li>
                                <li><a href="/article/1320.htm"
                                       title="车辆保险理赔案例" target="_blank">车辆保险理赔案例</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/%E8%BD%A6%E9%99%A9/1.htm">车险</a>
                                    <div>理赔案例: 
一货运车,运输公司为车辆购买了机动车商业险和交强险,也买了安全生产责任险,运输一车烟花爆竹,在行驶途中发生爆炸,出现车毁、货损、司机亡、炸死一路人、炸毁一间民宅等惨剧,针对这几种情况,该如何赔付。 
赔付建议和方案: 
客户所买交强险在这里不起作用,因为交强险的赔付前提是:“机动车发生道路交通意外事故”; 
如果是交通意外事故引发的爆炸,则优先适用交强险条款进行赔付,不足的部分由商业</div>
                                </li>
                                <li><a href="/article/1447.htm"
                                       title="学习Spring必学的Java基础知识(5)—注解" target="_blank">学习Spring必学的Java基础知识(5)—注解</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>        文章来源:http://www.iteye.com/topic/1123823,整理在我的博客有两个目的:一个是原文确实很不错,通俗易懂,督促自已将博主的这一系列关于Spring文章都学完;另一个原因是为免原文被博主删除,在此记录,方便以后查找阅读。 
  
        有必要对</div>
                                </li>
                                <li><a href="/article/1574.htm"
                                       title="【Struts2一】Struts2 Hello World" target="_blank">【Struts2一】Struts2 Hello World</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/Hello+world/1.htm">Hello world</a>
                                    <div>Struts2 Hello World应用的基本步骤 
创建Struts2的Hello World应用,包括如下几步: 
1.配置web.xml 
2.创建Action 
3.创建struts.xml,配置Action 
4.启动web server,通过浏览器访问 
  配置web.xml 
<?xml version="1.0" encoding="</div>
                                </li>
                                <li><a href="/article/1701.htm"
                                       title="【Avro二】Avro RPC框架" target="_blank">【Avro二】Avro RPC框架</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/rpc/1.htm">rpc</a>
                                    <div>1. Avro RPC简介 1.1. RPC 
 
 RPC逻辑上分为二层,一是传输层,负责网络通信;二是协议层,将数据按照一定协议格式打包和解包 
 从序列化方式来看,Apache Thrift 和Google的Protocol Buffers和Avro应该是属于同一个级别的框架,都能跨语言,性能优秀,数据精简,但是Avro的动态模式(不用生成代码,而且性能很好)这个特点让人非常喜欢,比较适合R</div>
                                </li>
                                <li><a href="/article/1828.htm"
                                       title="lua set get cookie" target="_blank">lua set get cookie</a>
                                    <span class="text-muted">ronin47</span>
<a class="tag" taget="_blank" href="/search/lua+cookie/1.htm">lua cookie</a>
                                    <div>lua:
local access_token = ngx.var.cookie_SGAccessToken
if access_token then
    ngx.header["Set-Cookie"] = "SGAccessToken="..access_token.."; path=/;Max-Age=3000"
end</div>
                                </li>
                                <li><a href="/article/1955.htm"
                                       title="java-打印不大于N的质数" target="_blank">java-打印不大于N的质数</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>

public class PrimeNumber {

	/**
	 * 寻找不大于N的质数
	 */
	public static void main(String[] args) {
		int n=100;
		PrimeNumber pn=new PrimeNumber();
		pn.printPrimeNumber(n);
		System.out.print</div>
                                </li>
                                <li><a href="/article/2082.htm"
                                       title="Spring源码学习-PropertyPlaceholderHelper" target="_blank">Spring源码学习-PropertyPlaceholderHelper</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>今天在看Spring 3.0.0.RELEASE的源码,发现PropertyPlaceholderHelper的一个bug 
当时觉得奇怪,上网一搜,果然是个bug,不过早就有人发现了,且已经修复: 
详见: 
http://forum.spring.io/forum/spring-projects/container/88107-propertyplaceholderhelper-bug 
 
</div>
                                </li>
                                <li><a href="/article/2209.htm"
                                       title="[逻辑与拓扑]布尔逻辑与拓扑结构的结合会产生什么?" target="_blank">[逻辑与拓扑]布尔逻辑与拓扑结构的结合会产生什么?</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E6%8B%93%E6%89%91/1.htm">拓扑</a>
                                    <div> 
   如果我们已经在一个工作流的节点中嵌入了可以进行逻辑推理的代码,那么成百上千个这样的节点如果组成一个拓扑网络,而这个网络是可以自动遍历的,非线性的拓扑计算模型和节点内部的布尔逻辑处理的结合,会产生什么样的结果呢? 
 
   是否可以形成一种新的模糊语言识别和处理模型呢?  大家有兴趣可以试试,用软件搞这些有个好处,就是花钱比较少,就算不成</div>
                                </li>
                                <li><a href="/article/2336.htm"
                                       title="ITEYE 都换百度推广了" target="_blank">ITEYE 都换百度推广了</a>
                                    <span class="text-muted">cuisuqiang</span>
<a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a><a class="tag" taget="_blank" href="/search/AdSense/1.htm">AdSense</a><a class="tag" taget="_blank" href="/search/%E7%99%BE%E5%BA%A6%E6%8E%A8%E5%B9%BF/1.htm">百度推广</a><a class="tag" taget="_blank" href="/search/%E5%B9%BF%E5%91%8A/1.htm">广告</a><a class="tag" taget="_blank" href="/search/%E5%A4%96%E5%BF%AB/1.htm">外快</a>
                                    <div>以前ITEYE的广告都是谷歌的Google AdSense,现在都换成百度推广了。 
  
为什么个人博客设置里面还是Google AdSense呢? 
  
都知道Google AdSense不好申请,这在ITEYE上也不是讨论了一两天了,强烈建议ITEYE换掉Google AdSense。至少,用一个好申请的吧。 
  
什么时候能从ITEYE上来点外快,哪怕少点</div>
                                </li>
                                <li><a href="/article/2463.htm"
                                       title="新浪微博技术架构分析" target="_blank">新浪微博技术架构分析</a>
                                    <span class="text-muted">dalan_123</span>
<a class="tag" taget="_blank" href="/search/%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A/1.htm">新浪微博</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                                    <div>新浪微博在短短一年时间内从零发展到五千万用户,我们的基层架构也发展了几个版本。第一版就是是非常快的,我们可以非常快的实现我们的模块。我们看一下技术特点,微博这个产品从架构上来分析,它需要解决的是发表和订阅的问题。我们第一版采用的是推的消息模式,假如说我们一个明星用户他有10万个粉丝,那就是说用户发表一条微博的时候,我们把这个微博消息攒成10万份,这样就是很简单了,第一版的架构实际上就是这两行字。第</div>
                                </li>
                                <li><a href="/article/2590.htm"
                                       title="玩转ARP攻击" target="_blank">玩转ARP攻击</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/r/1.htm">r</a>
                                    <div>我写这片文章只是想让你明白深刻理解某一协议的好处。高手免看。如果有人利用这片文章所做的一切事情,盖不负责。 网上关于ARP的资料已经很多了,就不用我都说了。 用某一位高手的话来说,“我们能做的事情很多,唯一受限制的是我们的创造力和想象力”。 ARP也是如此。 以下讨论的机子有 一个要攻击的机子:10.5.4.178 硬件地址:52:54:4C:98</div>
                                </li>
                                <li><a href="/article/2717.htm"
                                       title="PHP编码规范" target="_blank">PHP编码规范</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83/1.htm">编码规范</a>
                                    <div>一、文件格式 
1. 对于只含有 php 代码的文件,我们将在文件结尾处忽略掉 "?>" 。这是为了防止多余的空格或者其它字符影响到代码。例如:<?php$foo = 'foo';2. 缩进应该能够反映出代码的逻辑结果,尽量使用四个空格,禁止使用制表符TAB,因为这样能够保证有跨客户端编程器软件的灵活性。例</div>
                                </li>
                                <li><a href="/article/2844.htm"
                                       title="linux 脱机管理(nohup)" target="_blank">linux 脱机管理(nohup)</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/linux+nohup/1.htm">linux nohup</a><a class="tag" taget="_blank" href="/search/nohup/1.htm">nohup</a>
                                    <div>脱机管理 nohup 
转载请出自出处:http://eksliang.iteye.com/blog/2166699 
nohup可以让你在脱机或者注销系统后,还能够让工作继续进行。他的语法如下 
nohup [命令与参数]   --在终端机前台工作
nohup [命令与参数] & --在终端机后台工作 
  
但是这个命令需要注意的是,nohup并不支持bash的内置命令,所</div>
                                </li>
                                <li><a href="/article/2971.htm"
                                       title="BusinessObjects Enterprise Java SDK" target="_blank">BusinessObjects Enterprise Java SDK</a>
                                    <span class="text-muted">greemranqq</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/BO/1.htm">BO</a><a class="tag" taget="_blank" href="/search/SAP/1.htm">SAP</a><a class="tag" taget="_blank" href="/search/Crystal+Reports/1.htm">Crystal Reports</a>
                                    <div>最近项目用到oracle_ADF  从SAP/BO 上调用 水晶报表,资料比较少,我做一个简单的分享,给和我一样的新手 提供更多的便利。 
  
首先,我是尝试用JAVA JSP 去访问的。 
  
官方API:http://devlibrary.businessobjects.com/BusinessObjectsxi/en/en/BOE_SDK/boesdk_ja</div>
                                </li>
                                <li><a href="/article/3098.htm"
                                       title="系统负载剧变下的管控策略" target="_blank">系统负载剧变下的管控策略</a>
                                    <span class="text-muted">iamzhongyong</span>
<a class="tag" taget="_blank" href="/search/%E9%AB%98%E5%B9%B6%E5%8F%91/1.htm">高并发</a>
                                    <div>假如目前的系统有100台机器,能够支撑每天1亿的点击量(这个就简单比喻一下),然后系统流量剧变了要,我如何应对,系统有那些策略可以处理,这里总结了一下之前的一些做法。 
1、水平扩展 
这个最容易理解,加机器,这样的话对于系统刚刚开始的伸缩性设计要求比较高,能够非常灵活的添加机器,来应对流量的变化。 
2、系统分组 
假如系统服务的业务不同,有优先级高的,有优先级低的,那就让不同的业务调用提前分组</div>
                                </li>
                                <li><a href="/article/3225.htm"
                                       title="BitTorrent DHT 协议中文翻译" target="_blank">BitTorrent DHT 协议中文翻译</a>
                                    <span class="text-muted">justjavac</span>
<a class="tag" taget="_blank" href="/search/bit/1.htm">bit</a>
                                    <div>前言 
做了一个磁力链接和BT种子的搜索引擎 {Magnet & Torrent},因此把 DHT 协议重新看了一遍。 
 
 BEP: 5Title: DHT ProtocolVersion: 3dec52cb3ae103ce22358e3894b31cad47a6f22bLast-Modified: Tue Apr 2 16:51:45 2013 -070</div>
                                </li>
                                <li><a href="/article/3352.htm"
                                       title="Ubuntu下Java环境的搭建" target="_blank">Ubuntu下Java环境的搭建</a>
                                    <span class="text-muted">macroli</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a>
                                    <div>配置命令: 
  $sudo apt-get install ubuntu-restricted-extras 
  再运行如下命令: 
  $sudo apt-get install sun-java6-jdk 
  待安装完毕后选择默认Java. 
  $sudo update- alternatives --config java 
  安装过程提示选择,输入“2”即可,然后按回车键确定。 </div>
                                </li>
                                <li><a href="/article/3479.htm"
                                       title="js字符串转日期(兼容IE所有版本)" target="_blank">js字符串转日期(兼容IE所有版本)</a>
                                    <span class="text-muted">qiaolevip</span>
<a class="tag" taget="_blank" href="/search/TO/1.htm">TO</a><a class="tag" taget="_blank" href="/search/Date/1.htm">Date</a><a class="tag" taget="_blank" href="/search/String/1.htm">String</a><a class="tag" taget="_blank" href="/search/IE/1.htm">IE</a>
                                    <div>	/**
	 * 字符串转时间(yyyy-MM-dd HH:mm:ss)
	 * result (分钟)
	 */
	stringToDate : function(fDate){
		var fullDate = fDate.split(" ")[0].split("-");
		var fullTime = fDate.split("</div>
                                </li>
                                <li><a href="/article/3606.htm"
                                       title="【数据挖掘学习】关联规则算法Apriori的学习与SQL简单实现购物篮分析" target="_blank">【数据挖掘学习】关联规则算法Apriori的学习与SQL简单实现购物篮分析</a>
                                    <span class="text-muted">superlxw1234</span>
<a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/1.htm">数据挖掘</a><a class="tag" taget="_blank" href="/search/%E5%85%B3%E8%81%94%E8%A7%84%E5%88%99/1.htm">关联规则</a>
                                    <div>关联规则挖掘用于寻找给定数据集中项之间的有趣的关联或相关关系。 
关联规则揭示了数据项间的未知的依赖关系,根据所挖掘的关联关系,可以从一个数据对象的信息来推断另一个数据对象的信息。 
例如购物篮分析。牛奶 ⇒ 面包 [支持度:3%,置信度:40%]  支持度3%:意味3%顾客同时购买牛奶和面包。   置信度40%:意味购买牛奶的顾客40%也购买面包。   规则的支持度和置信度是两个规则兴</div>
                                </li>
                                <li><a href="/article/3733.htm"
                                       title="Spring 5.0 的系统需求,期待你的反馈" target="_blank">Spring 5.0 的系统需求,期待你的反馈</a>
                                    <span class="text-muted">wiselyman</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>        
       Spring 5.0将在2016年发布。Spring5.0将支持JDK 9。 
  
       Spring 5.0的特性计划还在工作中,请保持关注,所以作者希望从使用者得到关于Spring 5.0系统需求方面的反馈。 
 </div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>