分类目录归档:DEDECMS技巧

DEDECMS技巧

dedecms会员数据调用方法大全

调用12个企业会员 按 注册时间排序
{dede:sql sql=’select * from dede_member where mtype=”企业” order by mid limit 0,12′}
<a href=../member/index.php?uid=[field:userid/] target=’_blank’>[field:uname/]</a>
{/dede:sql}

调用12个个人会员 按 注册时间排序
{dede:sql sql=’select * from dede_member where mtype=”个人” order by mid limit 0,12′}
<a href=../member/index.php?uid=[field:userid/] target=’_blank’>[field:uname/]</a>
{/dede:sql}

详解

使用dede的sql标签

sql语句

select * from dede_member where mtype=”个人” order by mid limit 0,12

mtype=”个人” 判断是否为个人类型

order by mid  按mid(注册的ID编号) 排列

limit 0,12 从第0条数据开始读取 读取12条后返回

相关调用

调取所有会员中的12个

{dede:sql sql=’select * from dede_member order by mid limit 0,12′}
<a href=../member/index.php?uid=[field:userid/] target=’_blank’>[field:uname/]</a>
{/dede:sql}

调取所有会员中的12个 按最后登录时间排序

{dede:sql sql=’select * from dede_member  order by  logintime limit 0,12′}
<a href=../member/index.php?uid=[field:userid/] target=’_blank’>[field:uname/]</a>
{/dede:sql}

调取12个上传了头像的会员 按最后登录时间排序 并显示出他们的头像

{dede:sql sql=’select * from dede_member  where length(face)>0 order by logintime limit 0,12′}
<a href=../member/index.php?uid=[field:userid/] target=’_blank’><img src=[field:face/] /></a>
{/dede:sql}

以上本人都已测试成功
补充一条

调取12个推荐会员 按最后登录时间排序

{dede:sql sql=’select * from dede_member where matt=1 order by logintime limit 0,12′}
<a href=../member/index.php?uid=[field:userid/] target=’_blank’>[field:uname/]</a>
{/dede:sql}

Dede织梦图集Flash控件停用无法上传图片处理

我们知道由于Flash控件与2020年停用,导致DedeCMS织梦图集无法上传图片,尽管flash现已退出舞台了,而织梦的图集上传功用依然使用的是flash控件,现在不仅无法正常上传图像而且也不支持多实例多图集,我们来把它换一换,换成现在比较流行的layui前端框架 – layui上传模块。

现在比较流行的layui前端框架 – layui上传模块。

整合教程

第一步、下载额外所需文件,根据自己网站编码

把下载得到的文件解压吗,然后找到 layui上传模块 文件夹,然后选择自己DedeCMS编码对应的文件夹,然后把”layui”文件夹和”taglib”文件夹放到你网站include文件夹里去。

第二步、为后台图片集模型添加layui上传模块,官方原来的图集上传功能保留不动

伸手党 可以直接把下载解压后的文件夹 图集模型上传模块 下的4个文件替换即可使用(替换之前建议你备份你自己的这4个文件)

  1. /dede/templets/album_add.htm
  2. /dede/templets/album_edit.htm
  3. /dede/album_add.php
  4. /dede/album_edit.php

覆盖文件后刷新后台即可使用。

如果您使用的是默认单个图集,没有对DedeCMS图集进行开发过,下面的教程可略过无需理会【注意,二开的后台请根据教程来操作】。

二开教程

1、打开 /dede/templets/album_add.htm 找到

  1. <div id=”thumbnails”></div>

在它所在的tr标签下面加入

  1. <link href=”../include/layui/css/layui.css” rel=”stylesheet” media=”all”>
  2. <script src=”../include/layui/layui.js” type=”text/javascript”></script>
  3. <tr>
  4. <td width=”100%” height=”24″ colspan=”4″ class=”bline”>
  5. <table width=”800″ border=”0″ cellspacing=”0″ cellpadding=”0″>
  6. <tr>
  7. <td width=”80″ height=”40″>&nbsp;<b>默认图集:</b></td>
  8. <td><button type=”button” class=”layui-btn layui-btn-sm layui-btn-normal imgurls”><i class=”layui-icon layui-icon-upload”></i>上传图片</button></td>
  9. </tr>
  10. </table>
  11. </td>
  12. </tr>
  13. <tr>
  14. <td colspan=”4″ class=”bline”>
  15. <table width=’100%’>
  16. <tr>
  17. <td><div class=”layui-upload-img”><ul class=”layui-upload-list” id=”imgurls”></ul></div></td>
  18. </tr>
  19. </table>
  20. </td>
  21. </tr>
  22. <script type=”text/javascript”>
  23. layui.use(‘upload’, function(){
  24. var $ = layui.jquery
  25. ,upload = layui.upload;
  26.  
  27. // imgurls 图片上传
  28. var uploadInst = upload.render({
  29. elem: ‘.imgurls’
  30. ,url: ‘../include/layui/layuiupload.php’
  31. ,multiple: true
  32. ,accept: ‘images’
  33. ,acceptMime: ‘image/*’
  34. ,done: function(res){
  35. if(res.code == 0){
  36. return layer.msg(res.msg);
  37. }
  38. $(‘#imgurls’).append(‘<li class=”item_img”><div class=”operate”><i class=”toleft layui-icon layui-icon-left”></i><i class=”toright layui-icon layui-icon-right”></i><i class=”close layui-icon layui-icon-close-fill” data-id=”‘ + res.id + ‘”></i></div><img src=”‘ + res.img + ‘” class=”img” ><input type=”text” name=”imgurls[alt][]” value=”” class=”layui-input” /><input type=”hidden” name=”imgurls[url][]” value=”‘ + res.img + ‘” /><input type=”hidden” name=”imgurls[uaid][]” value=”‘ + res.id + ‘” /></li>’);
  39. }
  40. ,error: function(){
  41.  
  42. }
  43. });
  44.  
  45. $(“body”).on(“click”,”.close”,function(){
  46. var id = $(this).data(‘id’);
  47. $.get(‘../include/layui/layuiupload.php’,{‘dopost’:’del’,’id’:id},function(res){})
  48. $(this).closest(“li”).remove();
  49. });
  50.  
  51. $(“body”).on(“click”,”.layui-upload-img ul li .toleft”,function(){
  52. var li_index = $(this).closest(“li”).index();
  53. if(li_index >= 1){
  54. $(this).closest(“li”).insertBefore($(this).closest(“ul”).find(“li”).eq(Number(li_index)-1));
  55. }
  56. });
  57. $(“body”).on(“click”,”.layui-upload-img ul li .toright”,function(){
  58. var li_index = $(this).closest(“li”).index();
  59. $(this).closest(“li”).insertAfter($(this).closest(“ul”).find(“li”).eq(Number(li_index)+1));
  60. });
  61.  
  62. });
  63. </script>

2、打开 /dede/templets/album_edit.htm 找到

  1. <div id=”thumbnails”></div>

在它所在的tr标签下面加入

  1. <link href=”../include/layui/css/layui.css” rel=”stylesheet” media=”all”>
  2. <script src=”../include/layui/layui.js” type=”text/javascript”></script>
  3. <tr>
  4. <td width=”100%” height=”24″ colspan=”4″ class=”bline”>
  5. <table width=”800″ border=”0″ cellspacing=”0″ cellpadding=”0″>
  6. <tr>
  7. <td width=”80″ height=”40″>&nbsp;<b>默认图集:</b></td>
  8. <td><button type=”button” class=”layui-btn layui-btn-sm layui-btn-normal imgurls”><i class=”layui-icon layui-icon-upload”></i>上传图片</button></td>
  9. </tr>
  10. </table>
  11. </td>
  12. </tr>
  13. <tr>
  14. <td colspan=”4″ class=”bline”>
  15. <table width=’100%’>
  16. <tr>
  17. <td><div class=”layui-upload-img”><ul class=”layui-upload-list” id=”imgurls”></ul></div></td>
  18. </tr>
  19. </table>
  20. </td>
  21. </tr>
  22. <script type=”text/javascript”>
  23. layui.use(‘upload’, function(){
  24. var $ = layui.jquery
  25. ,upload = layui.upload;
  26.  
  27. // imgurls 图片上传
  28. var uploadInst = upload.render({
  29. elem: ‘.imgurls’
  30. ,url: ‘../include/layui/layuiupload.php’
  31. ,multiple: true
  32. ,accept: ‘images’
  33. ,acceptMime: ‘image/*’
  34. ,done: function(res){
  35. if(res.code == 0){
  36. return layer.msg(res.msg);
  37. }
  38. $(‘#imgurls’).append(‘<li class=”item_img”><div class=”operate”><i class=”toleft layui-icon layui-icon-left”></i><i class=”toright layui-icon layui-icon-right”></i><i class=”close layui-icon layui-icon-close-fill” data-id=”‘ + res.id + ‘”></i></div><img src=”‘ + res.img + ‘” class=”img” ><input type=”text” name=”imgurls[alt][]” value=”” class=”layui-input” /><input type=”hidden” name=”imgurls[url][]” value=”‘ + res.img + ‘” /><input type=”hidden” name=”imgurls[uaid][]” value=”‘ + res.id + ‘” /></li>’);
  39. }
  40. ,error: function(){
  41. //失败重传
  42.  
  43. }
  44. });
  45.  
  46. $(“body”).on(“click”,”.close”,function(){
  47. var id = $(this).data(‘id’);
  48. $.get(‘../include/layui/layuiupload.php’,{‘dopost’:’del’,’id’:id},function(res){})
  49. $(this).closest(“li”).remove();
  50. });
  51.  
  52. $(“body”).on(“click”,”.layui-upload-img ul li .toleft”,function(){
  53. var li_index = $(this).closest(“li”).index();
  54. if(li_index >= 1){
  55. $(this).closest(“li”).insertBefore($(this).closest(“ul”).find(“li”).eq(Number(li_index)-1));
  56. }
  57. });
  58. $(“body”).on(“click”,”.layui-upload-img ul li .toright”,function(){
  59. var li_index = $(this).closest(“li”).index();
  60. $(this).closest(“li”).insertAfter($(this).closest(“ul”).find(“li”).eq(Number(li_index)+1));
  61. });
  62.  
  63. });
  64. </script>

3、打开 /dede/album_add.php 找到

  1. //加入附加表

在它上面加入

  1. //图集字段 imgurls
  2. if(is_array($_POST[‘imgurls’][‘url’]))
  3. {
  4. $my_imgurls = “”;
  5. foreach($_POST[‘imgurls’][‘url’] as $key => $val)
  6. {
  7. $my_imgurls .= “{dede:img ddimg=’$val‘ text='{$_POST[‘imgurls’][‘alt’][$key]}’ width=” height=” uaid='{$_POST[‘imgurls’][‘uaid’][$key]}’}$val{/dede:img}\r\n“;
  8. }
  9. }
  10. $imgurls .= addslashes($my_imgurls);

4、打开 /dede/album_edit.php 找到

  1. //更新附加表

在它上面加入

  1. //图集字段 imgurls
  2. if(is_array($_POST[‘imgurls’][‘url’]))
  3. {
  4. $my_imgurls = “”;
  5. foreach($_POST[‘imgurls’][‘url’] as $key => $val)
  6. {
  7. $my_imgurls .= “{dede:img ddimg=’$val‘ text='{$_POST[‘imgurls’][‘alt’][$key]}’ width=” height=” uaid='{$_POST[‘imgurls’][‘uaid’][$key]}’}$val{/dede:img}\r\n“;
  8. }
  9. }
  10. $imgurls .= addslashes($my_imgurls);

第三步、内容页模板调用图集标签新写法

  1. <h2>默认图集</h2>
  2. <ul>
  3. {dede:imagelist}
  4. <li>
  5. <img src=”[field:imgsrc/]” alt=”[field:text/]” width=”220″ height=”150″>
  6. <p>[field:text/]</p>
  7. </li>
  8. {/dede:imagelist}
  9. </ul>
  10.  
  11. <h2>户型图片</h2>
  12. <ul>
  13. {dede:imagelist field=”huxing”}
  14. <li>
  15. <img src=”[field:imgsrc/]” alt=”[field:text/]” width=”220″ height=”150″>
  16. <p>[field:text/]</p>
  17. </li>
  18. {/dede:imagelist}
  19. </ul>

特别说明

  1. {dede:imagelist field=”huxing”}

field=’图片集字段’

不填的话就是调用图集默认,织梦多个图集多实例教程

在操作下面的教程之前必须确定你已经完成上面第一、第二、第三步

第一步、附加表里添加多个图集字段,例如 户型图片 字段

后台-系统-SQL工具-SQL命令行工具

  1. ALTER TABLE dede_addonimages ADD `huxing` text;

dede_addonimages 是我的图集模型附加表,注意自己的附加表,千万别写错了

第二步、打开 /dede/templets/album_add.htm 找到

  1. id=”imgurls”

在它所在的tr下面加入

  1. <tr>
  2. <td width=”100%” height=”24″ colspan=”4″ class=”bline”>
  3. <table width=”800″ border=”0″ cellspacing=”0″ cellpadding=”0″>
  4. <tr>
  5. <td width=”80″ height=”40″>&nbsp;<b>户型图片:</b></td>
  6. <td>
  7. <button type=”button” class=”layui-btn layui-btn-sm layui-btn-normal huxing”>
  8. <i class=”layui-icon layui-icon-upload”></i>上传图片
  9. </button>
  10. </td>
  11. </tr>
  12. </table>
  13. </td>
  14. </tr>
  15. <tr>
  16. <td colspan=”4″ class=”bline”>
  17. <table width=’100%’>
  18. <tr>
  19. <td>
  20. <div class=”layui-upload-img”>
  21. <ul class=”layui-upload-list” id=”huxing”></ul>
  22. </div>
  23. </td>
  24. </tr>
  25. </table>
  26. </td>
  27. </tr>

如图,注意标注的地方

继续找到

  1. // imgurls 图片上传

在它上面加入

  1. // huxing 图片上传
  2. var uploadInst = upload.render({
  3. elem: ‘.huxing’
  4. ,url: ‘../include/layui/layuiupload.php’
  5. ,multiple: true
  6. ,accept: ‘images’
  7. ,acceptMime: ‘image/*’
  8. ,done: function(res){
  9. if(res.code == 0){
  10. return layer.msg(res.msg);
  11. }
  12. $(‘#huxing’).append(‘<li class=”item_img”><div class=”operate”><i class=”toleft layui-icon layui-icon-left”></i><i class=”toright layui-icon layui-icon-right”></i><i class=”close layui-icon layui-icon-close-fill” data-id=”‘ + res.id + ‘”></i></div><img src=”‘ + res.img + ‘” class=”img” ><input type=”text” name=”huxing[alt][]” value=”” class=”layui-input” /><input type=”hidden” name=”huxing[url][]” value=”‘ + res.img + ‘” /><input type=”hidden” name=”huxing[uaid][]” value=”‘ + res.id + ‘” /></li>’);
  13. }
  14. ,error: function(){
  15. //失败重传
  16.  
  17. }
  18. });

如图,注意标注的地方

第三步、打开 /dede/templets/album_edit.htm 找到

  1. id=”imgurls”

在它所在的tr下面加入

  1. <tr>
  2. <td width=”100%” height=”24″ colspan=”4″ class=”bline”>
  3. <table width=”800″ border=”0″ cellspacing=”0″ cellpadding=”0″>
  4. <tr>
  5. <td width=”80″ height=”40″>&nbsp;<b>户型图片:</b></td>
  6. <td>
  7. <button type=”button” class=”layui-btn layui-btn-sm layui-btn-normal huxing”>
  8. <i class=”layui-icon layui-icon-upload”></i>上传图片
  9. </button>
  10. </td>
  11. </tr>
  12. </table>
  13. </td>
  14. </tr>
  15. <tr>
  16. <td colspan=”4″ class=”bline”>
  17. <table width=’100%’>
  18. <tr>
  19. <td>
  20. <div class=”layui-upload-img”>
  21. <ul class=”layui-upload-list” id=”huxing”>
  22. <?php
  23. if($addRow[‘huxing’]!=””)
  24. {
  25. $dtp = new DedeTagParse();
  26. $dtp->LoadSource($addRow[‘huxing’]);
  27. if(is_array($dtp->CTags))
  28. {
  29. $fhtml = ”;
  30. foreach($dtp->CTags as $ctag)
  31. {
  32. if($ctag->GetName()==”img”)
  33. {
  34. $bigimg = trim($ctag->GetInnerText());
  35. $text = trim($ctag->GetAtt(‘text’),’‘’);
  36. $uaid = trim($ctag->GetAtt(‘uaid’),’‘’);
  37. $fhtml .= “<li class=\”item_img\”><div class=\”operate\”><i class=\”toleft layui-icon layui-icon-left\”></i><i class=\”toright layui-icon layui-icon-right\”></i><i class=\”close layui-icon layui-icon-close-fill\” data-id=\”{$uaid}\”></i></div><img src=\”{$bigimg}\” class=\”img\” ><input type=\”text\” name=\”huxing[alt][]\” value=\”{$text}\” class=\”layui-input\” /><input type=\”hidden\” name=\”huxing[url][]\” value=\”{$bigimg}\” /><input type=\”hidden\” name=\”huxing[uaid][]\” value=\”{$uaid}\” /></li>”;
  38. }
  39. }
  40. echo $fhtml;
  41. }
  42. $dtp->Clear();
  43. }
  44. ?>
  45. </ul>
  46. </div>
  47. </td>
  48. </tr>
  49. </table>
  50. </td>
  51. </tr>

如图,注意标注的字段部分

继续找到

  1. // imgurls 图片上传

在它上面加入

  1. // huxing 图片上传
  2. var uploadInst = upload.render({
  3. elem: ‘.huxing’
  4. ,url: ‘../include/layui/layuiupload.php’
  5. ,multiple: true
  6. ,accept: ‘images’
  7. ,acceptMime: ‘image/*’
  8. ,done: function(res){
  9. if(res.code == 0){
  10. return layer.msg(res.msg);
  11. }
  12. $(‘#huxing’).append(‘<li class=”item_img”><div class=”operate”><i class=”toleft layui-icon layui-icon-left”></i><i class=”toright layui-icon layui-icon-right”></i><i class=”close layui-icon layui-icon-close-fill” data-id=”‘ + res.id + ‘”></i></div><img src=”‘ + res.img + ‘” class=”img” ><input type=”text” name=”huxing[alt][]” value=”” class=”layui-input” /><input type=”hidden” name=”huxing[url][]” value=”‘ + res.img + ‘” /><input type=”hidden” name=”huxing[uaid][]” value=”‘ + res.id + ‘” /></li>’);
  13. }
  14. ,error: function(){
  15. //失败重传
  16.  
  17. }
  18. });

如图,注意标注的字段

第四步、打开 /dede/album_add.php 找到

  1. //生成HTML

在它上面加入

  1. //新增图集字段 huxing
  2. if(is_array($_POST[‘huxing’][‘url’]))
  3. {
  4. $huxing = “”;
  5. foreach($_POST[‘huxing’][‘url’] as $key => $val)
  6. {
  7. $huxing .= “{dede:img ddimg=’$val‘ text='{$_POST[‘huxing’][‘alt’][$key]}’ width=” height=” uaid='{$_POST[‘huxing’][‘uaid’][$key]}’}$val{/dede:img}\r\n“;
  8. }
  9. if($huxing)
  10. {
  11. $huxing = addslashes($huxing);
  12. $upquery = “UPDATE `$addtable` SET `huxing`=’$huxing‘ WHERE aid=’$arcID‘ “;
  13. $dsql->ExecuteNoneQuery($upquery);
  14. }
  15. }

如图,注意标注的字段

第五步、打开 /dede/album_edit.php 找到

  1. //生成HTML

在它上面加入

  1. //新增图集字段 huxing
  2. $huxing = “”;
  3. if(is_array($_POST[‘huxing’][‘url’]))
  4. {
  5. foreach($_POST[‘huxing’][‘url’] as $key => $val)
  6. {
  7. $huxing .= “{dede:img ddimg=’$val‘ text='{$_POST[‘huxing’][‘alt’][$key]}’ width=” height=” uaid='{$_POST[‘huxing’][‘uaid’][$key]}’}$val{/dede:img}\r\n“;
  8. }
  9. }
  10. $huxing = addslashes($huxing);
  11. $upquery = “UPDATE `$addtable` SET `huxing`=’$huxing‘ WHERE aid=’$id‘ “;
  12. $dsql->ExecuteNoneQuery($upquery);

如图,注意标注的字段

第六步、内容页标签新写法参考上面,使用layui第一张图作为缩略图,打开 /dede/album_add.php 找到

  1. 生成文档ID

在它上面加入

  1. //使用layui第一张图作为缩略图
  2. if($ddisfirst==1 && $litpic==”)
  3. {
  4. if(isset($_POST[‘imgurls’][‘url’][0]))
  5. {
  6. $litpic = $_POST[‘imgurls’][‘url’][0];
  7. }
  8. }

如图,注意标注的字段

[渗透]缓慢的HTTP拒绝服务攻击原理、利用和防范

漏洞等级:中

Slow HTTP Denial of Service Attack 缓慢的HTTP拒绝服务攻击

TCP三次握手:

攻击原理:
对任何一个开放了http访问的服务器,先建立一个连接,指定一个比较大的content-length,然后以非常低的速度发包,比如1-10s发一个字节,然后维持这个连接不断开。如果客户端持续建立这样的连接,那么服务器的可用连接将一点一点被占满,从而导致拒绝服务。

和CC攻击一样,只要Web服务器开放了Web服务,那么它就可以是一个靶子,HTTP协议在接收到request之前是不对请求内容作校验的,所以即使你的Web应用没有可用的form表单,这个攻击一样有效。

在客户端以单线程方式建立较大数量的无用连接,并保持持续发包的代价非常的低廉。实际试验中一台普通PC可以建立的连接在3000个以上。这对一台普通的Web server,将是致命的打击。更不用说结合肉鸡群做分布式DoS了。

鉴于此攻击简单的利用程度、拒绝服务的后果、带有逃逸特性的攻击方式,这类攻击一炮而红,成为众多攻击者的研究和利用对象。

慢速攻击的分类:
Slow headers:Web应用在处理HTTP请求之前都要先接收完所有的HTTP头部,因为HTTP头部中包含了一些Web应用可能用到的重要的信息。攻击者利用这点,发起一个HTTP请求,一直不停的发送HTTP头部,消耗服务器的连接和内存资源。抓包数据可见,攻击客户端与服务器建立TCP连接后,每30秒才向服务器发送一个HTTP头部,而Web服务器再没接收到2个连续的\r\n时,会认为客户端没有发送完头部,而持续的等等客户端发送数据。
Slow body:攻击者发送一个HTTP POST请求,该请求的Content-Length头部值很大,使得Web服务器或代理认为客户端要发送很大的数据。服务器会保持连接准备接收数据,但攻击客户端每次只发送很少量的数据,使该连接一直保持存活,消耗服务器的连接和内存资源。抓包数据可见,攻击客户端与服务器建立TCP连接后,发送了完整的HTTP头部,POST方法带有较大的Content-Length,然后每10s发送一次随机的参数。服务器因为没有接收到相应Content-Length的body,而持续的等待客户端发送数据。
Slow read:客户端与服务器建立连接并发送了一个HTTP请求,客户端发送完整的请求给服务器端,然后一直保持这个连接,以很低的速度读取Response,比如很长一段时间客户端不读取任何数据,通过发送Zero Window到服务器,让服务器误以为客户端很忙,直到连接快超时前才读取一个字节,以消耗服务器的连接和内存资源。抓包数据可见,客户端把数据发给服务器后,服务器发送响应时,收到了客户端的ZeroWindow提示(表示自己没有缓冲区用于接收数据),服务器不得不持续的向客户端发出ZeroWindowProbe包,询问客户端是否可以接收数据。
慢速攻击的利用工具:
Slowhttptest https://github.com/shekyan/slowhttptest
Slowloris
测试工具SlowHttpTest:
安装方法1:

安装openssl和libssl-dev
sudo apt-get install openssl
sudo apt-get install libssl-dev
安装libssl如果失败,执行apt-get update,然后再执行sudo apt-get install libssl-dev
安装slowhttptest
git clone https://github.com/shekyan/slowhttptest.git
cd slowhttptest
./configure
make
make install
安装方法2:
sudo apt-get install slowhttptest

使用:
参数:

-g 在测试完成后,以时间戳为名生成一个CVS和HTML文件的统计数据
-H SlowLoris模式
-B Slow POST模式
-R Range Header模式
-X Slow Read模式
-c number of connections 测试时建立的连接数
-d HTTP proxy host:port 为所有连接指定代理
-e HTTP proxy host:port 为探测连接指定代理
-i seconds 在slowrois和Slow POST模式中,指定发送数据间的间隔。
-l seconds 测试维持时间
-n seconds 在Slow Read模式下,指定每次操作的时间间隔。
-o file name 使用-g参数时,可以使用此参数指定输出文件名
-p seconds 指定等待时间来确认DoS攻击已经成功
-r connections per second 每秒连接个数
-s bytes 声明Content-Length header的值
-t HTTP verb 在请求时使用什么操作,默认GET
-u URL 指定目标url
-v level 日志等级(详细度)
-w bytes slow read模式中指定tcp窗口范围下限
-x bytes 在slowloris and Slow POST tests模式中,指定发送的最大数据长度
-y bytes slow read模式中指定tcp窗口范围上限
-z bytes 在每次的read()中,从buffer中读取数据量

例子:
slowloris模式:

slowhttptest -c 1000 -H -g -o my_header_stats -i 10 -r 200 -t GET -u https://host.example.com/index.html -x 24 -p 3

slow post模式:

slowhttptest -c 3000 -B -g -o my_body_stats -i 110 -r 200 -s 8192 -t FAKEVERB -u http://host.example.com/loginform.html -x 10 -p 3

slow read模式:

slowhttptest -c 8000 -X -r 200 -w 512 -y 1024 -n 5 -z 32 -k 3 -u https://host.example.com/resources/index.html -p 3
1
哪些服务器易被慢速攻击
慢速攻击主要利用的是thread-based架构的服务器的特性,这种服务器会为每个新连接打开一个线程,它会等待接收完整个HTTP头部才会释放连接。比如Apache会有一个超时时间来等待这种不完全连接(默认是300s),但是一旦接收到客户端发来的数据,这个超时时间会被重置。正是因为这样,攻击者可以很容易保持住一个连接,因为攻击者只需要在即将超时之前发送一个字符,便可以延长超时时间。而客户端只需要很少的资源,便可以打开多个连接,进而占用服务器很多的资源。

经验证,Apache、httpd采用thread-based架构,很容易遭受慢速攻击。而另外一种event-based架构的服务器,比如nginx和lighttpd则不容易遭受慢速攻击。

如何防护慢速攻击
Apache服务器现在使用较多的有三种简单防护方式。
第一种:
mod_reqtimeout :Apache2.2.15后,该模块已经被默认包含,用户可配置从一个客户端接收HTTP头部和HTTPbody的超时时间和最小速率。如果一个客户端不能在配置时间内发送万头部或body数据,服务器会返回一个408REQUEST TIME OUT错误。配置文件如下:

< IfModule mod_reqtimeout.c >
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
< /IfModule >


第二种:
mod_qos:Apache的一个服务质量控制模块,用户可配置各种不同粒度的HTTP请求阈值,配置文件如下:

< IfModule mod_qos.c >
/# handle connections from up to 100000 different IPs
QS_ClientEntries 100000
/# allow only 50 connections per IP
QS_SrvMaxConnPerIP 50
/# limit maximum number of active TCP connections limited to 256
MaxClients 256
/# disables keep-alive when 180 (70%) TCP connections are occupied
QS_SrvMaxConnClose 180
/# minimum request/response speed (deny slow clients blocking the server, keeping connections open without requesting anything
QS_SrvMinDataRate 150 1200
< /IfModule >

第三种:
mod_security:一个开源的WAF模块,有专门针对慢速攻击防护的规则,配置如下:

SecRule RESPONSE_STATUS “@streq 408” “phase:5,t:none,nolog,pass, setvar:ip.slow_dos_counter=+1, expirevar:ip.slow_dos_counter=60, id:’1234123456′”
SecRule IP:SLOW_DOS_COUNTER “@gt 5” “phase:1,t:none,log,drop,
msg:’Client Connection Dropped due to high number of slow DoS alerts’, id:’1234123457′”
1
2
3
传统的流量清洗设备针对CC攻击,主要通过阈值的方式来进行防护,某一个客户在一定的周期内,请求访问量过大,超过了阈值,清洗设备通过返回验证码或者JS代码的方式。这种防护方式的依据是,攻击者们使用肉鸡上的DDoS工具模拟大量http request,这种工具一般不会解析服务端返回数据,更不会解析JS之类的代码。因此当清洗设备截获到HTTP请求时,返回一段特殊JavaScript代码,正常用户的浏览器会处理并正常跳转不影响使用,而攻击程序会攻击到空处。

而对于慢速攻击来说,通过返回验证码或者JS代码的方式依然能达到部分效果。但是根据慢速攻击的特征,可以辅助以下几种防护方式:1、周期内统计报文数量。一个TCP连接,HTTP请求的报文中,报文过多或者报文过少都是有问题的,如果一个周期内报文数量非常少,那么它就可能是慢速攻击;如果一个周期内报文数量非常多,那么它就可能是一个CC攻击。2、限制HTTP请求头的最大许可时间。超过最大许可时间,如果数据还没有传输完成,那么它就有可能是一个慢速攻击。
————————————————

CSS阴影效果(Box-shadow)用法趣味讲解

分享: 

使用Box-shadow属性表现阴影效果是现代浏览器中是一个非常有用的技巧,通过它我们可以做出很多非常酷的东西。让我们来一步一步的了解box-shadow属性的基本用法,然后进一步了解::before::after伪元素的用法。

基本用法

syntax-1
box-shadow:2px 2px 5px #000;
box-shadow:0px 0px 10px #000;

内阴影

syntax-2
box-shadow:inset 2px 2px 5px #000;

阴影扩展长度值

syntax-3
box-shadow:0px 0px 5px 10px #000;
box-shadow:0px 15px 10px -15px #000;
box-shadow:inset 0px 15px 10px -15px #000;

多重阴影

box-shadow:0px 0px 0px 3px #bb0a0a,
           0px 0px 0px 6px #2e56bf,
           0px 0px 0px 9px #ea982e;

伪元素::before::after的乐趣

使用伪元素::before::after,我们能创造出非常逼真的只有图片才能实现的阴影效果。让我来看一个例子:

<div class="box11 shadow"></div>
.box11 {
	width: 300px;
	height: 100px;
	background: #ccc;
	border-radius: 10px;
	margin: 10px;
}

.shadow {
	position: relative;
	max-width: 270px;
	box-shadow: 0px 1px 4px rgba(0,0,0,0.3),
				0px 0px 20px rgba(0,0,0,0.1) inset;
}

.shadow::before,
.shadow::after {
   content:"";
   position:absolute;
   z-index:-1;
}

.shadow::before,
.shadow::after {
   content:"";
   position:absolute;
   z-index:-1;
   bottom:15px;
   left:10px;
   width:50%;
   height:20%;
}

.shadow::before,
.shadow::after {
   content:"";
   position:absolute;
   z-index:-1;
   bottom:15px;
   left:10px;
   width:50%;
   height:20%;
   box-shadow:0 15px 10px rgba(0, 0, 0, 0.7);
   transform:rotate(-3deg);
}

.shadow::after{
   right:10px;
   left:auto;
   transform:rotate(3deg);
 }

正则表达式批量替换路径(vscode)

正则表达式批量替换路径(vscode)

由于项目文件目录整改,需要将文件中所有的引用路径进行更改,比较快捷的方法便是使用 vscode 的正则匹配进行批量查找、替换。

原本文件路径为 ../../assets/图片名.png

现在想改为 ../../assets/img/图片名.png

查找的正则表达式:..\/assets\/(.*).png

替换的表达式:../assets/img/$1.png

可能存在的问题,vscode 会提示开启开启 PCRE2 搜索引擎,在设置中开启即可。

dedecms织梦怎么生成百度、谷歌sitemap地图

最近用dedecms织梦建一个网站,用起来还是没有wordpress那么习惯,最近在网上找到了一个生成sitemap地图的方法,

修改地图文件

/templets/plus文件夹下

sitemap.htm代码修改如下:

  1. <?xml version=”1.0″ encoding=”{dede:global.cfg_soft_lang /}”?>
  2.  <urlset xmlns=”http://www.sitemaps.org/schemas/sitemap/0.9″>
  3.  <url>
  4.  <loc>{dede:global.cfg_basehost/}</loc>
  5.  <changefreq>always</changefreq>
  6.  <priority>1.0</priority>
  7.  </url>
  8. {dede:arclist row=’10000′ orderby=’pubdate’}
  9. <url>
  10.  <loc>[field:global.cfg_basehost/][field:arcurl/]</loc>
  11.  <lastmod>[field:pubdate function=”GetDateMK(@me)”/]</lastmod>
  12. </url>
  13. {/dede:arclist}
  14. {dede:channelartlist row=’50’}
  15.  <url>
  16.  <loc>{dede:global.cfg_basehost/}{dede:field name=’typeurl’/}</loc>
  17.  <lastmod>{dede:php}echo date(‘Y-m-d’);{/dede:php}</lastmod>
  18.  </url>
  19.  {dede:channel type=’son’ row=’8′}
  20.  <url>
  21.  <loc>[field:global.cfg_basehost/][field:typelink/]</loc>
  22.  <lastmod>[field:id runphp=”yes”]@me=date(‘Y-m-d’);[/field:id]</lastmod>
  23.  </url>
  24.  {/dede:channel}
  25.  {/dede:channelartlist}
  26. </urlset>

rssmap.htm代码修改如下:

  1. <?xml version=’1.0′ encoding=’UTF-8′?>
  2.     <urlset xmlns=’http://www.google.com/schemas/sitemap/0.84′>
  3.       {dede:arclist typeid=’0′ }
  4.        <url><loc>[field:global.cfg_basehost/][field:arcurl/]</loc><lastmod>[field:pubdate function=”MyDate(‘Y-m-d’,@me)”/]</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url>
  5.       {/dede:arclist}
  6.       {dede:channelartlist row=50}
  7.         <url><loc>{dede:global.cfg_basehost/}{dede:field name=’typeurl’/}</loc><lastmod>{dede:php}echo date(‘Y-m-d’);{/dede:php}</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url>
  8.            {dede:channel type=’son’ row=’8′}
  9.         <url><loc>[field:global.cfg_basehost/][field:typelink/]</loc><lastmod>[field:id runphp=”yes”]@me=date(‘Y-m-d’);[/field:id]</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url>
  10.         {/dede:channel}
  11.     {/dede:channelartlist}
  12. </urlset>

修改生成程序

/dede/makehtml_map.php  (如后台目录修改则为对应目录)

  • <?php
  • /**
  •  * 生成网站地图
  •  *
  •  * @version        $Id: makehtml_map.php 1 11:17 2010年7月19日Z tianya $
  •  * @package        DedeCMS.Administrator
  •  * @copyright      Copyright (c) 2007 – 2010, DesDev, Inc.
  •  * @license        http://help.dedecms.com/usersguide/license.html
  •  * @link           http://www.dedecms.com
  •  */
  • require_once(dirname(__FILE__).”/config.php”);
  • require_once(DEDEINC.”/sitemap.class.php”);
  • require_once(DEDEINC.”/dedetag.class.php”);
  • require_once DEDEINC.”/arc.partview.class.php”;
  • if(emptyempty($dopost))
  • {
  •     ShowMsg(“参数错误!”,”-1″);
  •     exit();
  • }
  • $isremote = emptyempty($isremote)? 0 : $isremote;
  • $serviterm=emptyempty($serviterm)? “” : $serviterm;
  • $sm = new SiteMap();
  • $maplist = $sm->GetSiteMap($dopost);
  • if($dopost==”site”)
  • {
  •     $murl = $cfg_cmspath.”/sitemap.xml”;
  •     $tmpfile = $cfg_basedir.$cfg_templets_dir.”/plus/sitemap.htm”;
  • }
  • else
  • {
  •     $murl = $cfg_cmspath.”/rssmap.xml”;
  •     $tmpfile = $cfg_basedir.$cfg_templets_dir.”/plus/rssmap.htm”;
  • }
  • //$dtp = new DedeTagParse();
  • //$dtp->LoadTemplet($tmpfile);
  • //$dtp->SaveTo($cfg_basedir.$murl);
  • $pv = new PartView();
  • $pv->SetTemplet($tmpfile); //在这里修改你的谷歌地图模板路径,相对于模板目录  
  • $pv->SaveToHtml($cfg_basedir.$murl);   //生成文件名,保存在根目录 
  • if($cfg_remote_site==’Y’ && $isremote == 1)
  • {
  •     if($serviterm!=””)
  •     {
  •         list($servurl, $servuser, $servpwd) = explode(‘,’, $serviterm);
  •         $config=array( ‘hostname’ => $servurl, ‘username’ => $servuser,
  •                    ‘password’ => $servpwd,’debug’ => ‘TRUE’);
  •     } else {
  •         $config=array();
  •     }
  •     if( $ftp->connect($config) )
  •     {
  •         //分析远程文件路径
  •         $remotefile = $murl;
  •         $localfile = ‘..’.$remotefile;
  •         $remotedir = preg_replace(‘#[^/]*.html#’, ”, $remotefile);
  •         $ftp->rmkdir($remotedir);
  •         if($ftp->upload($localfile, $remotefile, ‘acii’)) echo “远程发布成功!”.”<br />”;
  •     }
  • }
  • //$pv->Clear();
  • echo “<a href=’$murl’ target=’_blank’>成功更新文件: $murl 浏览…</a>”;
  • exit();

生成网站地图

网站后台——生成——更新网站地图

普通地图则是生成百度sitemap地图

地址为 /sitemap.xml

RSS地图则是生成谷歌sitemap地图

地址为 /rssmap.xml

dede图片集上传图片不能上传 弹出提示“302”的解决办法

今天用织梦(DEDECMS)的图片集复制了一个新的模型,然后在里面添加了一些功能,本地测试时都没有问题,可上传到服务器上的时候在“手工上传”那里上传图片的时候,弹出了一个“302”,并且出现一个红色的 “ERROR” 图片。百度了一下,找到一种解决办法,记录下来(本人测试可用~):

找到 include/userlogin.class.php 文件,在 第11行的 session_start(); 前面加上如下一段代码即可~

if (isset($_POST["PHPSESSID"])) 
{
    session_id($_POST["PHPSESSID"]);  
}
else if(isset($_GET["PHPSESSID"])) {
    session_id($_GET["PHPSESSID"]);
}

DedeCMS用PHP判断flag自定义属性是否存在

DedeCMS自带有自定义属性:头条[h],推荐[c],幻灯[f]等,可以非常自由地进行调用,在首页或列表中调用方法如下:

{dede:arclist typeid='1' flag='c'}
<li><a href="[field:arcurl/]">[field:title/]</a></li>
{/dede:arclist}

如果在文章内容页把自定义属性调用出来用,试试用

{dede:field.flag/}

显示出来的是不是文字,而是

c,p

这是正常的,因为他只是调用数据表里的内容,如果要把指定的文字调用出来就需要array处理一下,用到PHP的strstr函数,下面给出方法

{dede:field name='array' runphp='yes'}
if(@me['typeid']=='1' && strstr(@me['flag'],'c')=='c') @me='[推荐]'.@me['title']';
else @me=@me['title'];
{/dede:field}

注意这个例子增加了栏目的ID判断条件,如果不需要判断就直接用

{dede:field name='array' runphp='yes'}
if(strstr(@me['flag'],'c')=='c') @me='[推荐]'.@me['title'];
else @me=@me['title'];
{/dede:field}

php判断字符串是否包含方法

方法一、使用strstr,strstr返回需要判断是否被包含的字符开始到结束的字符串,如果没有返回值,则不包含。

举例,判断是否包含字符“#”:

<?php
    $str='abc#defg';
    $in=strstr($str,'#');
    echo $in;//输出结果为:#defg
?>

方法二、使用stristr,它的用法和strstr的完全一样。唯一的区别是stristr不区分大小写,而strstr区分大小写。可以根据实际情况是否区分大小写来使用。

方法三、使用strpos,但它对中文件的支持不是很好,它的返回值为boolean型,也就是true和false(真和假)。执行速度比stristr和strstr都快,strpos函数中有一个参数用于指定判断的位置,默认为空,即判断整个字符串。

下面看例子:

<?php
    $str='bde';
    $in='b';
    $output=strpos($str,$in);
?>

方法四、将字符串用explode来拆分数组再判断。如下:

function chstr($str,$in){
    $tmparr = explode($in,$str);
    if(count($tmparr)>1){
        return true;
    }else{
        return false;
    }
}

$str='abc#defg';
$in='#';//判断是否包含#这个字符
$bh=chstr($str,$in);
if($bn){
    echo '字符串'.$str.'包含'.$in;
}else{
    echo '字符串'.$str.'不包含'.$in;
}

2020年最新 dede安全设置 防黑加固

(为了安全起见,建议先做好全站数据和文件的备份,以下教程是总结经验,本人也是这样设置,并且没有任何问题)

已知漏洞修复
文件1:include/dedesql.class.php
文件2:include/uploadsafe.inc.php
文件3:include/dialog/select_soft_post.php
文件4:dede/config.php
文件5:dede/file_class.php  (2020/03/04 更新了这个文件,请下载更新)
文件6:plus/guestbook/edit.inc.php
以上三个文件存在漏洞,请下载下面的文件进行修复,直接覆盖即可 不会影响网站,也可以把原先的做好备份,以防万一。

下载链接: https://pan.baidu.com/s/1F7WK5MzVs632paI0q2q9PA
提取码: aax5

———————————————————————————————————————————–

1、修改默认后台名。打开网站根目录,找到[dede],这个文件夹就是后台的路径,可以随意修改,比如修改为[yesido],此时后台登陆的路径为:http://www.*****.com/yesido/ 

2、删除member文件夹(一共就两个模板带会员功能,不是这两个模板的,都删除这个文件夹)  带会员的模版:Member文件夹就是会员系统,织梦本身是自带里会员系统的,大家也可以在后台找到,但是很多用户都是做了企业站,并不需要会员功能,就像发布的基本都是企业站,所以并不需要会员系统,这时,大家就可以删除这个文件夹,删除他,不但可以防止攻击,还可减省了空间容量。 

3、删除special文件夹Special文件夹是专题的意思,网上下载的源码都没有用到这个专题页面,所以大家放心删掉好了。

 4、打开plus文件夹留下这么几个文件,其他全部删除,参考下图;

织梦安全设置

下面我们对这几个文件做下解释,

Img 文件夹,这个是主要是CSS样式在里面,所以保留,如果删除了,会造成发布文章时界面有点乱,所以要保留

ad_js.php  这个文件时广告位,因为有些模板用到了后台调用广告位,如果你不确定,建议保留

Diy.php  这个是留言系统,有些模板上有用户在线留言功能,用到的就是这个,如果你不确定,建议保留

Search.php 这个是搜索功能,也就是网站上的搜索,如果你不确定,建议保留

List.php 这动态栏目,网上下载的都是生成静态栏目了,但是有些用户喜欢动态栏目,即使你使用的是静态栏目,这个保留也没影响,所以建议保留

View.php 这个是动态文章,道理和list.php一样,建议保留。

count.php 这个是文章浏览次数,建议保留。

如果实在看不懂,就按照截图保留,其他的都删除,删除前建议备份一份。

DEDE文件夹下 删除以下文件

ad_add.phpad_edit.php
ad_main.php
adtype_main.php
这几个是后台广告设置的文件 如果模版上没有广告位的 删除这几个(只有少数新闻博客模版有广告位) 

———————————————————————————————————————————–

cards_make.php
cards_manage.php
cards_type.php
这几个是会员点卡功能  所有模版都没用到这个  直接删除

———————————————————————————————————————————–

feedback_edit.php
feedback_main.php
这是评论功能  所有模版都没用到这个  直接删除

———————————————————————————————————————————–

file_class.php
file_manage_control.php
file_manage_main.php
file_manage_view.php
file_pic_view.php
这几个是附件管理 文件式管理器 这个是影响安全,很多用户在用这个功能 必须删除,改成FTP上传文件图片等

———————————————————————————————————————————–

freelist_add.php
freelist_edit.php
freelist_main.php
这几个是自由列表管理  所有模版都没用到这个  直接删除

———————————————————————————————————————————–

getdedesysmsg.php
这个是织梦官方广告   直接删除

———————————————————————————————————————————–

group_edit.php
group_guestbook.php
group_main.php
group_notice.php
group_store.php
group_threads.php
group_user.php
这几个是圈子功能  所有模版都没用到这个  直接删除

———————————————————————————————————————————–

mail_file_manage.php
mail_getfile.php
mail_send.php
mail_title.php
mail_title_send.php
mail_type.php
这几个邮件管理功能  所有模版都没用到这个  直接删除

———————————————————————————————————————————–

mda_main.php
这个是织梦官方广告   直接删除

———————————————————————————————————————————–

media_add.php
media_edit.php
media_main.php
这几个是上传文件 这个是影响安全,很多用户在用这个功能 必须删除,改成FTP上传文件图片等

———————————————————————————————————————————–

member_do.php
member_feed_edit.php
member_guestbook.php 
….
所有的 member_开头的  这些是会员注册等  模版中只有二个是带会员的  其他的都没带,如果不是那两个  这些都删除 

———————————————————————————————————————————–

mynews_add.php
mynews_edit.php
mynews_main.php
这几个是站内新闻 所有模版都没用到这个  直接删除

———————————————————————————————————————————–

mytag_add.php
mytag_edit.php
mytag_main.php
mytag_tag_guide.php
mytag_tag_guide_ok.php
这几个是自定义标记 所有模版都没用到这个  直接删除

———————————————————————————————————————————–

shops_delivery.php
shops_operations.php
shops_operations_cart.php
shops_operations_userinfo.php
订单功能  也是带会员的才会用到  只有二个是带会员的  其他的都没带,如果不是那两个  这些都删除  带会员的

———————————————————————————————————————————–

spec_add.php
spec_edit.php
这几个专题功能 所有模版都没用到这个  直接删除

———————————————————————————————————————————–

story_add.php
story_add_action.php
….
所有的 story_ 开头的  这些都是小说功能  所有模版都没用到这个  直接删除

———————————————————————————————————————————–

vote_add.php
vote_getcode.php
vote_edit.php
vote_main.php
这几个是投票功能  所有模版都没用到这个  直接删除

———————————————————————————————————————————–
三、删除根目录下的install 文件夹,这是安装目录,因为我们都安装好了,所以这个没用了,删除即可。
四、修改用户名和密码,修改密码很简单,后台-系统-系统用户管理,点更改,然后修改即可,但是用户名默认的是admin,大家发现不能修改用户名,其实是可以的,大家按下图操作:

织梦安全设置

找到功能地图,

(如果你是VIP,隐藏了这一链接,大家只要直接输入链接即可:sys_data_replace.php    如:http://www.ddddd.cn/dede/sys_data_replace.php)

织梦安全设置.

找到数据库内容替换,

织梦安全设置

新的用户名小心填错,以免不知道用户名,进不去后台。修改后,在后台退出,然后重新进后台,用新的用户名登录。

五、网站做好定期的备份工作,不要闲麻烦