【问题标题】:SQL injection: Is this line safe?SQL注入:这条线安全吗?
【发布时间】:2012-05-11 01:46:24
【问题描述】:

我有这行:

$sql = "UPDATE votes SET up=up+1 WHERE id='{$p}'";

现在从我所读到的一种 sql 注入方式是由于没有正确“关闭” sql 查询而导致黑客可以添加其他信息。

所以我的问题是,对我而言,up=up+1 没有“关闭”,但如果我这样设置它up='up+1' 对我来说使其“关闭”它不起作用。

p>

如果这有什么不同的话,行向上类型是int(11)

更新:

$p 用函数清理

function sanitize($foo) { 
if(get_magic_quotes_gpc() == true) { 
 $foo = stripslashes($foo); 
} 
return mysql_real_escape_string(htmlspecialchars($foo)); 
}

【问题讨论】:

  • 该语句对我来说看起来很安全,除非您只需要确保 $p 始终是该语句之前的数字。
  • 永远不要消毒。逃脱。清理取决于您了解所有可能的攻击途径并专门针对它进行过滤。每当发现新的攻击路线时,您的功能就毫无用处。而转义处理所有攻击。
  • 如果您担心 SQL 注入攻击,那么您应该通过存储过程和视图来限制数据库访问。也就是说,特定的查询看起来很安全,尤其是因为 $p 是由函数检查的。
  • @GordonLinoff 参数化查询可以提供与存储过程相同的“安全性”。
  • @Marc B:对不起,我想我可能使用了错误的词“消毒”,这正是我所说的我的功能(见操作编辑)

标签: php sql code-injection


【解决方案1】:

up=up+1 不易受到攻击,因为它不接受用户通过变量输入。它只是增加数据库中已有的 INT 值。

WHERE id='{$p}' 可能很容易受到攻击,但是,如果变量 $p 没有正确过滤和转义,但正如您在上面添加的那样,它已被函数清理。希望 sanitize 函数能够检查变量的适当类型(无论是 int 还是 string 或其他)并检查它的适当边界。

与往常一样,最安全的方法是使用准备好的语句和参数化查询,而不是将任何变量直接传递到 SQL 字符串中。 PHP 中用于各种 RDBMS 的大多数数据库 API 都支持预准备语句。 (不过,不是mysql_*() 函数)。

【讨论】:

  • 谢谢,就像我在 op 中所说的,$p 已使用函数 function sanitize($foo) { if(get_magic_quotes_gpc() == true) { $foo = stripslashes($foo); } return mysql_real_escape_string(htmlspecialchars($foo)); } 进行了清理
【解决方案2】:

这是不安全的,除非$p 被正确转义。否则想象一下……

$p = "foo'; DROP TABLE votes; SELECT '1"

然后你最终会执行类似的操作:

UPDATE votes SET up=up+1 WHERE id='foo'; DROP TABLE votes; SELECT '1';

那不会很漂亮...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2013-03-17
    相关资源
    最近更新 更多