这是怎么MySQL查询容易受到SQL注入?
-
11-07-2019 - |
题
在对前一个问题评论,有人说:这下面的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
变量被正确地转义,这如何让我脆弱,我能做些什么来解决这个问题?
解决方案
假设它是正确转义,它不会让你容易受到伤害。问题是,逃避正常的难度比它看起来很像,你自己谴责在每次做这样的查询时,正确逃生。如果可能,避免一切麻烦和使用准备好的语句(或绑定的参数或参数化查询)。我们的想法是,以允许数据访问库正确地逸出值。
例如,在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();
其他提示
每个SQL接口库值得使用具有某种结合参数的支持。不要试图聪明,只是用它。
您可以真的,真的想/希望你正确转义的东西,但它只是不值得你这样做还不是时候。
此外,一些数据库支持预处理语句缓存,这样做是正确的也可以为你带来效率的提高。
更容易,更安全,更快速。
如果它被正确转义和验证,那么你就没有问题。
当它不正确转义或验证,就会出现问题。这可以通过马虎编码或疏忽发生。
的问题不是特别实例,但与图案。这种图案使得SQL注入可能的,而另一图案使得不可能。
如果 $ USER_ID 被转义,那么你不应该受到SQL注入攻击。
在这种情况下,我也将确保$ user_id是数字或(需要取决于确切的类型)的整数。 您应该始终将数据限制,以最严格的类型就可以了。
这说法本身是不是一个真正的问题,它的“安全”,但我不知道你是怎样的(API堆栈上的一个级别)这样做。如果$ user_id是使用字符串操作(比如,如果你是让PHP自动填写语句),然后得到插入语句中的危险。
如果它得到填充使用绑定API,那么你准备好了。
所有的答案是好的,正确的,但我觉得我需要补充的是,prepare
/ execute
范式不是的只有的解决方案,无论是。您的 的应该有一个数据库抽象层,而不是直接使用的库函数和这样的层是一个好地方,明确地逃脱字符串参数,你是否让prepare
做到这一点,或者你自己做。