bind_param完成什么工作? - php

我正在学习避免SQL注入,我有点困惑。

使用bind_param时,我不明白目的。在手册页上,我找到了以下示例:

$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

现在,假设这四个变量是用户输入的,我不明白这如何防止SQL注入。据我了解,他们仍然可以在其中输入任何内容。

我也在那里找不到'sssd'的解释。它有什么作用?那是什么使它更安全?

最后一个问题:我读到另一个关于mysqli_real_escape_string已过时的问题,但手册中并未说明。如何过时?由于某种原因,它不能再转义特殊字符吗?

注意:这个问题解释了bind_param的作用,但是我仍然不明白为什么它更安全或更受保护。
Bind_param explanation

参考方案

现在,假设这四个变量是用户输入的,我不明白
如何防止SQL注入。据我了解,他们仍然可以
在那输入他们想要的东西。

其中的主要原理是使用准备好的语句,该语句用于向数据库服务器发送安全查询,可以通过转义不属于实际查询的用户输入,并在不使用任何查询的情况下检查查询(where子句)来检查使用任何参数之前查询的有效性。

关于这个问题:PDO sends raw query to MySQL while Mysqli sends prepared query, both produce the same result

$stmt = $mysqli->prepare("SELECT * FROM users WHERE username =?")) {
$stmt->bind_param("i", $user);
$user = "''1''";

服务器日志:

  130802 23:39:39   175 Connect   ****@localhost on testdb
    175 Prepare   SELECT * FROM users WHERE username =?
    175 Execute   SELECT * FROM users WHERE username =0
    175 Quit

通过使用准备好的语句,db服务器将检查不带任何参数的查询,在此阶段,可以在绑定任何参数之前检测到错误,然后,如果查询有效,则参数也将被发送到服务器以完成查询。

从PHP手册http://php.net/manual/en/mysqli.quickstart.prepared-statements.php:

转义和SQL注入

绑定的变量将由服务器自动转义。的
服务器将其转义值插入适当的位置
执行之前的语句模板。必须提供一个提示给
服务器为绑定变量的类型,创建一个合适的
转换。有关更多信息,请参见mysqli_stmt_bind_param()函数。
信息。

..

我也在那里找不到关于“ sssd”的解释。是什么
做?那是什么使它更安全?

答案在这里:http://php.net/manual/en/mysqli-stmt.bind-param.php

i
corresponding variable has type integer

d
corresponding variable has type double

s
corresponding variable has type string

b
corresponding variable is a blob and will be sent in packets

最后一个问题:我读了另一个问题
mysqli_real_escape_string已被弃用,但并未在
手册。如何过时?无法逃脱特殊字符
出于某种原因了吗?

你能给个参考吗?我认为您对(mysql_real_escape_string())有误解

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

PHP:将字符串拆分为字母和数字部分的最佳方法 - php

我有几个格式的字符串AA11 AAAAAA1111111 AA1111111 分离字符串的字母和数字部分的最佳方法(最有效)? 参考方案 如果它们都是一系列字母,然后是一系列数字,并且没有非字母数字字符,那么sscanf()可能比regexp更有效$example = 'AAA11111'; list($alpha,$numeric) =…

php-casperjs获取内部文本 - php

我正在为casperjs使用php包装器-https://github.com/alwex/php-casperjs我正在网上自动化一些重复的工作,我需要访问一个项目的innerText,但是我尚不清楚如何从casperjs浏览器访问dom。我认为在js中我会var arr = document.querySelector('label.input…

PHP strtotime困境 - php

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00�…