我使用以下方法从带有参数的脚本调用控制器的功能
$("#export-it-Voip").attr("href", '@Url.Action("ExportAllToExcel", "Home")?strvoicerecordfetchquery=' + voipquery + '&nSelectAllten=' + 10+'&nbSelectAll='+1);
但我的voipquery包含类似
的字符串"SELECT * FROM T100TRAFFIC WHERE NTYPE = 7 AND UPPER(VCDESCRIPTION) LIKE UPPER('%cal%') ORDER BY DTTIME DESC "
但是在控制器上它将成为
SELECT * FROM T100TRAFFIC WHERE NTYPE = 7 AND UPPER(VCDESCRIPTION) LIKE UPPER('�l%') ORDER BY DTTIME DESC
这意味着一些角色正在改变。如何避免呢?
答案 0 :(得分:2)
在您执行任何事情之前:停止让自己暴露于SQL injection。我不知道您的用例是什么,但允许SQL命令作为这样的查询字符串参数几乎肯定是一个可怕的想法。
我不知道您使用什么工具来访问数据库,但首先要将您的SQL字符串重新整理为:
SELECT
*
FROM
T100TRAFFIC
WHERE
NTYPE = 7
AND
UPPER(VCDESCRIPTION) LIKE '%'+UPPER(@search)+'%'
ORDER BY
DTTIME DESC
这有一个参数@search
,你可以用搜索字符串填充它。
在您的操作方法上,您现在只将搜索字符串 - 而不是整个SQL命令作为参数:
public ActionResult ExportAllToExcel(string query, int selectAllTen, int selectAll)
并在客户端上,
$("#export-it-Voip").attr("href", '@Url.Action("ExportAllToExcel", "Home")?query=' + voipquery + '&nSelectAllten=' + 10+'&nbSelectAll='+1);
其中voipquery
现在是带有查询字符串的JavaScript变量,例如var voipquery = 'cal'
。
编辑:我在这个答案上得到了一些赞成票,所以我认为我会根据上述建议的一些理由来改进它。
首先,SQL注入是恶意用户最常见的攻击媒介之一(阅读:黑客)。就成功的攻击者所能成就而言,它也是最危险的一个;如果您不走运,您将公开整个数据库以进行阅读和修改。因此,在担心其他事情之前担心这一点是个好主意。
其次,恰好所提出的建议解决方案实际上也有助于解决原始问题。根据OP的描述,问题可能与编码相关,参数化查询可能会带走至少一些问题。如果它没有,那么您就可以开始寻找其他编码问题。