尝试使用某些可能类似于sql查询的文本保存文件时出现500内部服务器错误。所以ModSecurity阻止了它:
[client xxx.xxx.xxx.xxx] ModSecurity: Access denied with code 500 (phase 2). Pattern match "(insert[[:space:]]+into.+values|select.*from.+[a-z|A-Z|0-9]|select.+from|bulk[[:space:]]+insert|union.+select|convert.+\\\\(.*from)" at ARGS:description. [file "/usr/local/apache/conf/modsec2.user.conf"] [line "359"] [id "300016"] [rev "2"] [msg "Generic SQL injection protection"] [severity "CRITICAL"] [hostname "xxxxxxxxxxxxx.net"] [uri "/app/3/admin/modules/product/product_a.php"] [unique_id "TzvCxkPj2kkAAH4WkMwAAAAE"]
所以我在文件夹/ app / 3 / admin / modules / product /
上创建了一个.htaccess文件<IfModule mod_security.c>
SecFilterRemove 300015
SecFilterRemove 300016
</IfModule>
但这也不能解决问题。我仍然在apache的日志文件中获得带有日志条目的500代码。
知道为什么这可能不起作用?
答案 0 :(得分:2)
文件的保存真的是问题吗?我发现很难想象,因为这不是Apache在atll的管辖权。是不是查询字符串中的查询导致了问题?
您可以绕过那个,例如通过base64编码查询(如果33%的大小增加不测试URL的大小限制),或将查询存储在会话变量中并仅传递指向变量的唯一随机键。
编辑:如果您真的要传输以后执行的实时SQL查询 - 请不要这样做。这正是mod_security过滤器存在的原因。
无论哪种方式,phpMyAdmin,一个数据库管理工具,都有同样的问题:它传输实时查询以便运行。有许多帖子涉及phpMyAdmin和mod_security。 This one建议禁用许多其他过滤器ID。 (理想情况下,只对需要接收POST数据的文件执行此操作。)