如何避免网址腐败?

时间:2014-11-28 08:02:52

标签: jquery asp.net-mvc-3

我使用以下方法从带有参数的脚本调用控制器的功能

  $("#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 

这意味着一些角色正在改变。如何避免呢?

1 个答案:

答案 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的描述,问题可能与编码相关,参数化查询可能会带走至少一些问题。如果它没有,那么您就可以开始寻找其他编码问题。