12306的漏洞暴出来后,很多人在吐槽写得有多烂,sql不能用like %%。本人不是工程师,有点看不懂,请问具体错在哪里,怎么样写才对

因为like语句在sql执行时,需要将变量原样输出,会有sql注入的风险。例如:select count(1) from ticket where city like $city;假设这样一句sql,你可能会把“%北京%”,“%上海%”当作city传进去执行。但是你也可以将"%北京%; delete * from ticket;"当作参数传入进去,因为是字符串原样生成sql语句然后执行,你可以想象这样的参数会有什么危害。至于@彭望 说的问题,是效率问题,应该用别的索引方案代替like语句,而非风险问题。当然如果没做查询控制,可能会有DOS风险。
■网友
其实也不能说是不用like%%吧,应该是把条件再多限制一点,我特意去看了wordpress的代码,也是用的like做的。wordpress目录下wp-includes/query.php 2190行$search .= "{$searchand}(($wpdb-\u0026gt;posts.post_title LIKE \u0026#39;{$n}{$term}{$n}\u0026#39;) OR ($wpdb-\u0026gt;posts.post_content LIKE \u0026#39;{$n}{$term}{$n}\u0026#39;))";
■网友
like %%,可能被注入。
■网友
like %% 会进行全站无索引遍历,再具体一点 就是如果数据库有1000W数据,每次有like % %你就得从头跑到尾经过1000W条数据。所以说 税都交给一群**了。


    推荐阅读