这个MySQL查询如何容易受到SQL注入攻击?

Ian*_*Ian 4 mysql security sql-injection

在对前一个问题的评论中,有人说下面的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
Run Code Online (Sandbox Code Playgroud)

假设$userid变量被正确转义,这是如何使我容易受到攻击的,我该怎么做才能解决它?

Dus*_*tin 15

值得使用的每个SQL接口库都对绑定参数提供某种支持.不要试图聪明,只要使用它.

你可能真的,真的认为/希望你已经正确地逃脱了,但是你不值得花时间.

此外,一些数据库支持预处理语句缓存,因此正确执行也可以提高效率.

更简单,更安全,更快捷.


Vin*_*vic 6

假设它被正确转义,它不会让你容易受到攻击.事情是,正确逃避比第一眼看上去更难,并且每次进行这样的查询时,你都会谴责自己逃脱.如果可能,避免所有麻烦并使用预准备语句(或绑定参数或参数化查询).这个想法是允许数据访问库正确地转义值.

例如,在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();
Run Code Online (Sandbox Code Playgroud)