我有一个站点,使用jQuery,使用Ajax将数据POST到PHP脚本以存储在数据库中。
POST数据是一个JSON对象,包含由Google Maps API创建的编码折线。
这是一个基本的示例对象:
[{" name":" Example Line"," type":" LINE"," data" :[["#ff8200"" 2"" 3"" 0"" 0" 36 ],{" \ u0001":" lom-flying"}," \ u0001新点"," gohwHqm {BhpCrG",&#34 ; \ u0001新点","}} cwH} d {BwImdE"," \ u0001新点"," uhdwHkjaC} _BwfF"," \ u0001新点"," sigwHcrhCd {C` {@"]}]
这是一个POST请求的示例,其中包含一些额外的变量和上面描述的对象URI:
OP =发送&安培;标记= 8685099e8880841638090ea9364184e05751c2b1-b0-1e7&安培;数据= LOMC%5B%7B%22name%22%3A%22Example +线路%22%2C%22type%22%3A%22LINE%22%2C%22data %22%3A%5B%5B%22%23ff8200%22%2C%222%22%2C%223%22%2C%220%22%2C%220%22%2C36%5D%2C%7B%22%5Cu0001 %22%3A%22lom飞扬%22%7D%2C%22%5Cu0001New +点%22%2C%22gohwHqm%7BBhpCrG%22%2C%22%5Cu0001New +点%22%2C%22%7D%7DcwH%7DD %7BBwImdE%22%2C%22%5Cu0001New +点%22%2C%22uhdwHkjaC%7D_BwfF%22%2C%22%5Cu0001New +点%22%2C%22sigwHcrhCd%7BC%60%7B%40%22%5D%7D %5D
最初我将数据作为GPX文件发布,从未出现任何问题。但是随着更多变得非常大,而且非常慢,所以我切换到这种编码格式。数据大小现在要小得多(通常编码折线包含许多点,与上述示例不同)。
但是我的网站主机在他们的服务器上使用mod_security,我已经遇到了一个拒绝我的帖子数据的问题。被触发的规则(" COMODO WAF:System Command Injection")似乎正在检查管道符号后跟字母数字字符。
不幸的是,编码的Polylines可能包含此符号,但我的主持人只是将这个特殊规则列入白名单,避免了这个问题。
我的剧本现在再次遭到拒绝。虽然我可以回到我的主人那里询问触发了哪个规则并要求他们将其列入白名单,但是没有办法知道它不会继续问。 (所以我想重新编码以完全避免这个问题。
那么我可以或应该对数据的发布方式做些什么来防止它被mod_security阻止?显然,这需要不显着增加数据大小
据推测,它特意将数据视为文本,因为无法避免在二进制文件中触发序列,并且必须允许这些。有没有办法在JQuery中将数据标记或POST为二进制文件?
顺便说一句,PHP脚本只是检查令牌是否有效然后转义数据并将其放在SQL查询中。没有对服务器上的数据进行处理。
更新:
由于Google在其折线的base64编码中使用了ASCII字符63到126,因此我将大多数非字母字符转换为数字,只留下下划线和波浪号。这样做的双重好处是可以避免与条形符号相关的任何问题,同时还可以通过不对任何编码折线进行URI编码来减小上传大小。
这已经解决了我一直遇到的mod_security阻止数据的问题,尽管不能保证某些规则可能会在将来由不同的不幸序列触发。所以任何建议仍然会受到赞赏。