Php 处理;“杀死”;大形式输入

Php 处理;“杀死”;大形式输入,php,javascript,mysql,Php,Javascript,Mysql,所以詹姆斯·帕特森一直在试图入侵我的网站!好的,不是真的,但他写了不少书,书名以“Kill”开头,这会从我们的服务器端防火墙触发一个htp501/htp505 情况是这样的,我们的图书馆软件每周生成一份电子邮件报告,报告上周收藏的所有新书。我已经制作了一个表单(使用php/html),我们可以在其中对这些数据进行C&P,它将把这些数据转换成一个漂亮的小页面,展示我们的新标题。提交表单后,我会在将数据添加到MySQL数据库之前对其进行清理。“Kill”触发器发生在表单中的数据可以传递和处理之前。数

所以詹姆斯·帕特森一直在试图入侵我的网站!好的,不是真的,但他写了不少书,书名以“Kill”开头,这会从我们的服务器端防火墙触发一个htp501/htp505

情况是这样的,我们的图书馆软件每周生成一份电子邮件报告,报告上周收藏的所有新书。我已经制作了一个表单(使用php/html),我们可以在其中对这些数据进行C&P,它将把这些数据转换成一个漂亮的小页面,展示我们的新标题。提交表单后,我会在将数据添加到MySQL数据库之前对其进行清理。“Kill”触发器发生在表单中的数据可以传递和处理之前。数据的格式如下:

Kill shot : an American assassin thriller / Vince Flynn|Flynn, Vince|2012|9781416595205 (hbk.)|NEWBKSHELF|20120207| 
我认为这样做的方法是使用一点javascript,将kill的每个实例都更改为一些无害的内容,然后在我将其插入MySQL数据库时将其更改回来


然而,像上面这样的条目可能有数百个,我对javascript不是很在行,我不知道如何完成前半部分(例如将kill的每个实例更改为kxllkill更改为kxll)我很有信心,当我保存数据时,我可以安全地将kxll更改回。

您应该挂接到表单的onSubmit(),然后检查每个字段,然后在提交的字段包含kill时替换其值。例如,最好是使用JQuery

$(function() {
    $("#formid").bind("submit", function(event) {
        $('input')
        .filter(function(){return $(this).val().indexOf("kill") !== false;})
        .each( function(index,element) {
            $(this).val($(this).val().replace(/kill/i, "kxll"));
        });
    });
});
此处演示:

如果要捕获输入中的任何位置的“kill”,可能需要使用
$('input[value*=“kill”]')
。替换(/kill/ig,“kxll”)

有关更多信息:


(javascript替换)

也有类似的问题,我的解决方案是。。。非正统的,但确实奏效了

替换(/kill/ig,“(非法标签1)”

如果您想在提交表单之前正确显示它,只需将函数放在onsubmit上即可

然后生成一个包含非法标记的sql

so DB

ID    |   Word
1     |   Kill
当您想要导出数据时,只需替换实时事件即可


请注意:此解决方案并不理想,如果您无法使用替代方案(如修复防火墙)

这只是一个修复,因为您不知道
kill
是否是唯一不允许使用的特殊单词(可能
man
cat
ls
也被禁止),您可以对整个字符串进行编码。例如,您可以使用此方法将其转换为字符码,然后在服务器端将其转换回。

提交时,您可以从表单中构建JSON对象,然后对其进行BASE64编码并通过AJAX提交,同时取消原始表单提交。服务器上的Base64解码在PHP中通过

base64_decode($string);

客户端上的Base64通过

btoa(string)
有关更多信息,请参阅。只能在Chrome和Firefox中本机运行,否则请使用此处提到的脚本


也许你没有访问权限,但最好的办法是淡化那疯狂的防火墙。我认为解决办法很简单:修复你的防火墙。但是,我没有权限更改设置。需要区分大小写。不确定jQuery内容选择器是否区分大小写,但replace是。应该使用.replace(/kill/ig,“kxll”)我喜欢你的解决方案,但如果他有很多话,问题就在于他。您不存储更改,它可能会变得混乱。只要kill tho就可以了。@WillemMulder仍然需要添加“g”标志,否则它将只匹配第一个匹配项。为True,但我只假设字符串前面有一个kill(因此,jquery选择器)。为了完整起见,我将添加它:)谢谢!这似乎是最好的答案,我会这样做,除非我不能让它工作。我可能在这里遗漏了一些明显的东西,但据我所知,它甚至没有捕捉到一个实例。这个问题需要用JS在浏览器中解决,因为数据永远不会到达PHP服务器。