【问题标题】:MySQLi prepare is for security reasons?MySQLi准备是出于安全原因吗?
【发布时间】:2011-09-03 10:55:10
【问题描述】:

所以,我开始使用 MySQLi 扩展,因为我听说将来会支持它。我读到了这一点,而不是使用mysql_real_escape_string(),出于安全原因,我必须使用prepare(),例如当我在查询中使用$_GET 或$_POST 时。

这是真的吗?我看到 prepare() 非常适合制作可以更改参数的 SQL 查询模板。所以脚本也可以在 SQL 级别上是动态的。它真的很有用。但我找不到有关其安全措施的真实信息。真的可以避邪不射吗?还是我必须在编程层面处理它?

例如这个代码是安全的吗?如您所见,它使用$_GET 填充模板,因此如果 MySQLi prepare 无法按我希望的那样工作,那将非常危险。

$stmt = $mysqli->prepare('SELECT description,title FROM menu WHERE name = ?');

$stmt->bind_param('s', $n);

$n = $_GET['b'];

$stmt->bind_result($meta_description,$meta_title);
$stmt->execute(); 

【问题讨论】:

    标签: php security mysqli prepared-statement sql-injection


    【解决方案1】:

    准备好的参数不受注入的影响,因为它们是在解析 SQL 之后提供给服务器的,也就是说,它们不能被解释为 SQL 片段,这是 SQL 注入攻击的基础。

    在您的示例中,服务器将使用$_GET['b'] 变量中的任何内容与name 数据库字段进行比较,但是绝对不可能服务器可能会被欺骗解释为文本作为布尔方程,语句结束后跟删除,...

    因此从设计上讲,它不提供 SQL 注入攻击面,这就是为什么使用准备好的语句比各种转义和输入清理方案要优越得多。

    【讨论】:

    • 我想补充一点,使用带有占位符的准备好的语句通常会产生更快的代码,因为客户端和服务器的工作量更少,因为他们不需要花时间转义和取消转义数据。此外,服务器仅在准备好 SQL 语句时才对其进行解析:之后将其用于多个查询会更快。
    • 感谢您的快速答复! :)
    猜你喜欢
    • 2013-07-12
    • 2013-06-30
    • 2016-02-07
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多