我正在学习避免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()
)有误解
我正在尝试从服务器上的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…