在对前一个问题评论,有人说:这下面的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是数字或(需要取决于确切的类型)的整数。 您应该始终将数据限制,以最严格的类型就可以了。

我觉得“正确转义”这里是关键字。在您的最后一个问题,我会假设你的代码拷贝从生产粘贴码,既然你问的问题关于三个表加入,我也让你没有做正确的转义,因此我对SQL注入攻击言论的假设。

要回答你的问题,因为这里很多人已经描述的那样,如果变量已被“正确转义”,那么你有没有问题。但是,为什么这样做是给自己找麻烦?正如一些人指出,有时正确转义不是一件简单的事情。有模式和库在PHP中,使SQL注入是不可能的,为什么我们不使用? (我还故意做出假设,你的代码就是PHP)。 Vinko Vrsalovic 回答可以给你的想法如何处理这个问题。

这说法本身是不是一个真正的问题,它的“安全”,但我不知道你是怎样的(API堆栈上的一个级别)这样做。如果$ user_id是使用字符串操作(比如,如果你是让PHP自动填写语句),然后得到插入语句中的危险。

如果它得到填充使用绑定API,那么你准备好了。

所有的答案是好的,正确的,但我觉得我需要补充的是,prepare / execute范式不是的只有的解决方案,无论是。您的 的应该有一个数据库抽象层,而不是直接使用的库函数和这样的层是一个好地方,明确地逃脱字符串参数,你是否让prepare做到这一点,或者你自己做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top