在对前一个问题的评论中,有人说下面的sql语句打开了我的sql注入:
select ss.*, se.name as engine, ss.last_run_at + interval ss.refresh_frequency day as next_run_at, se.logo_name from searches ss join search_engines se on ss.engine_id = se.id where ss.user_id='.$user_id.' group by ss.id order by ss.project_id, ss.domain, ss.keywords
假设$userid
变量被正确转义,这是如何使我容易受到攻击的,我该怎么做才能解决它?
值得使用的每个SQL接口库都对绑定参数提供某种支持.不要试图聪明,只要使用它.
你可能真的,真的认为/希望你已经正确地逃脱了,但是你不值得花时间.
此外,一些数据库支持预处理语句缓存,因此正确执行也可以提高效率.
更简单,更安全,更快捷.
假设它被正确转义,它不会让你容易受到攻击.事情是,正确逃避比第一眼看上去更难,并且每次进行这样的查询时,你都会谴责自己逃脱.如果可能,避免所有麻烦并使用预准备语句(或绑定参数或参数化查询).这个想法是允许数据访问库正确地转义值.
例如,在PHP中,使用mysqli:
$db_connection = new mysqli("localhost", "user", "pass", "db"); $statement = $db_connection->prepare("SELECT thing FROM stuff WHERE id = ?"); $statement->bind_param("i", $user_id); //$user_id is an integer which goes //in place of ? $statement->execute();