php - 通过输入类型文本防止 SQL 注入(inject)

标签 php sql database string inject

<分区>

我需要一些帮助,而且非常非常快,因为我的数据库被注入(inject)了。我至少需要一个不允许用户使用的脚本:[空格,符号('*','=','/','。')和单词列表('SELECT','FROM' ,'WHERE')] 在我的注册表的文本字段中。

我听说了一些关于 mysql_real_escape_string() 的事情。这个命令在做什么?并且不要发布指向 PHP: mysql_real_escape_string() Manual 的链接,因为我已经读过了。

最佳答案

处理这个问题的方法有对也有错。 (通常)错误的方法是尝试设置输入卫生方法(如脚本)并希望没有任何通过。它通常不起作用。

我建议您做的是重写您的 PHP SQL 查询以使用 MySQLi 准备好的语句。这些查询首先从常见的 SQL 语法(“SELECT...WHERE...”)转换为您的引擎可以使用的语句,然后才用您的输入替换字段,从而防止 SQL 注入(inject)。

例如,(非常)易受影响的 SQL 语法:

"SELECT * FROM users_passwords WHERE user='" + user + "' AND pass='" + password + "'"

可以转换为如下准备语句:

"SELECT * FROM users_passwords WHERE user=? AND password=?"

然后,使用命令 bind_param(),您可以在语句准备好后安全地将 ? 占位符替换为您的参数。虽然原始 SQL 查询允许您使用一些基本的注入(inject)技术(例如编写 ' OR true OR '),但准备好的语句不允许这样做。

这是一个工作示例:

// Create a new MySQLi connection object
$db = new mysqli('localhost','db_username','db_password','db_name');

// Create a new prepared statement
$stmt = $db->prepare('SELECT * FROM users_passwords WHERE user=? AND pass=?');

// Bind the parameters, in order, to the statement (s stands for string)
$stmt->bind_param('ss', username, password);

// Self-explanatory
$stmt->execute();

关于php - 通过输入类型文本防止 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27396390/

相关文章:

.net - 为什么在没有事务的情况下插入 1M 记录比在事务中插入要慢?

php - 为什么 Zend_Db_Adapter 比 mysql_query 慢很多

php - foreach 循环填充 call_user_func_array 的数组

mysql - SQL - 用条件替换另一个列值中的列值

sql - 无法使用 .my.cnf 文件连接到数据库 pymysql

mysql - 不同条件下的合计值

mysql - 多个表还是多个数据库?

javascript - 检测网站是否被直接访问..可能吗?

PHP/Beanstalkd : Spawning Multiple workers in parallel

mysql - SQL 返回最近 12 周的数据,按周分组,从上周一开始