在我们的数据库访问层,我们有一些动态查询创建.例如,我们有以下方法来构建ORDER BY子句的一部分:
protected string BuildSortString(string sortColumn,string sortDirection,string defaultColumn) { if (String.IsNullOrEmpty(sortColumn)) { return defaultColumn; } return String.Format("{0} {1}",sortColumn,sortDirection); }
问题是,sortColumn和sortDirection都是从外部作为字符串,所以当然应该做一些事情来防止可能的注入攻击.有人有什么想法怎么办?
解决方法
如果你必须处理字符串,那么白名单就是你最好的选择.首先,sortDirection应该对于白名单来说是微不足道的:与“asc”/“desc”不区分大小写的比较,您应该设置.对于其他人,我的偏好是将白名单列入已知列,也许通过传入数据的预期类型并进行验证.但是绝对的压缩,你可以限制正则表达式(说)强制他们都是严格的字母数字(在a-z,A-Z,0-9范围 – 如果需要可能是下划线) – 然后添加[],即
return string.Format("[{0}] {1}",sortDirection);
但是,严格的白名单已知列将会更好一些,而枚举的方向也是如此.