为了账号安全,请及时绑定邮箱和手机立即绑定

DEDE,防止form被无限提交信息?

DEDE,防止form被无限提交信息?

阿波罗的战车 2019-03-29 19:15:30
我用的是DEDE,自定义表单开发出网站最核心功能。现在有人利用我的自定义表单来无限提交申请(应该是通过action地址),导致后台删不完的无效信息。
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

有如下几个建议,把下拉框和单选按扭在后台做成单行文本,这样的话不管你提交的是下拉框或是单选,都可以有效的接收它的值。如果后台就做成单选或下拉,如果改了默认值,提交的表单值跟后台默认值对不上的话就会出现提交不成功的情况,就是前台提交的时候选择了,但后台看不到数据。若是做成单行文本,提交的值就会以文本的形式写入到后台,表单修改值也更加显得方便了。

 

提交之后会显示织梦的默认提示信息“友情提示”几秒过后就自动转到首页。如何才能让提交的信息停留,并让用户确认所提交的信息。

 

我想了如下方式。给diy.php里提交成功后输入固定值而不是自带的跳转方法。如下:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113if($action == 'post'){ if(empty($do)) {  $postform $diy->getForm(true);  include DEDEROOT."/templets/plus/{$diy->postTemplate}";  exit(); } elseif($do == 2) {  $dede_fields empty($dede_fields) ? '' : trim($dede_fields);  $dede_fieldshash empty($dede_fieldshash) ? '' : trim($dede_fieldshash);  if(!empty($dede_fields))  {   if($dede_fieldshash != md5($dede_fields.$cfg_cookie_encode))   {    showMsg('数据校验不对,程序返回''-1');    exit();   }  }  $diyform $dsql->getOne("select * from osen_diyforms where diyid='$diyid' ");  if(!is_array($diyform))  {   showmsg('自定义表单不存在''-1');   exit();  }    $addvar $addvalue '';    if(!empty($dede_fields))  {     $fieldarr explode(';'$dede_fields);   if(is_array($fieldarr))   {    foreach($fieldarr as $field)    {     if($field == ''continue;     $fieldinfo explode(','$field);     if($fieldinfo[1] == 'textdata')     {      ${$fieldinfo[0]} = FilterSearch(stripslashes(${$fieldinfo[0]}));      ${$fieldinfo[0]} = addslashes(${$fieldinfo[0]});     }     else     {      ${$fieldinfo[0]} = GetFieldValue(${$fieldinfo[0]}, $fieldinfo[1],0,'add','','diy'$fieldinfo[0]);     }     $addvar .= ', `'.$fieldinfo[0].'`';     $addvalue .= ", '".${$fieldinfo[0]}."'";    }   }    }    $query "insert into `{$diy->table}` (`id`, `ifcheck` $addvar)  values (NULL, 0 $addvalue); ";    if($dsql->executenonequery($query))  {   $id $dsql->GetLastID();   if($diy->public == 2)   {    //diy.php?action=view&diyid={$diy->diyid}&id=$id    $goto "diy.php?action=list&diyid={$diy->diyid}";    $bkmsg '发布成功,现在转向表单列表页...';   }   else   {    $goto = !empty($cfg_cmspath) ? $cfg_cmspath '/';    $bkmsg '发布成功,请等待管理员处理...';   }   echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>订单核对 </title><link href="/img_cnosn/css_end.css" rel="stylesheet" type="text/css" /></head>  <body><div id="ctent"><h1>您已成功提交订单,请仔细核对你的信息!</h1><ul><script language="javascript"> function ReplaceAll(str,sptr,sptr1) {  while (str.indexOf(sptr) >= 0)  {     str = str.replace(sptr, sptr1);  }  return str; }   descria=",您的姓名:,联系电话:,送货地址:,购买产品:,支付方式:,订货留言:,b"; var descri=new Array(); descri=descria.split(","); str= "'.$addvalue.'" ; str=ReplaceAll(str,"\'",""); var strarray=new   Array(); strarray=str.split(",") ; for(i=0;i<7;i++){ document.write("<li>"+descri[i]+strarray[i]+"</li>"); }</script></ul><div class="info">友情提示:您的订单已提交成功,我们的客服会尽快与你取得联系 <a href="#" onclick="window.operner = null;window.open(\'\',\'_self\');window.close();">确认并关闭</a> 或 <a href="#" onclick="window.operner = null;window.open(\'\',\'_self\');window.close();">返回修改</a></div></div></body></html>';  } }}

 

以上是代码。这样就是固定提取前几个表单信息给用户确认,不过在后台增加表单的时候一定要统一按以上数组的顺序进行添加字段。这样才能对应。

有一个不好的地方是,这个文件只要一改就是针对所有的表单提交,不过这只是一个方法,供参考,最终还得灵活应用。



查看完整回答
反对 回复 2019-04-04
?
慕神8447489

TA贡献1780条经验 获得超1个赞

1

2

3

4

5

{dede:sql sql="select sum(*) as s from dede_diyform1"}

[field:s /]

{/dede:sql}

 

<!--dede_diyform1换成你的自定义表单存储的表名。->


查看完整回答
反对 回复 2019-04-04
  • 3 回答
  • 0 关注
  • 443 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信