<分区>
我需要一些帮助,而且非常非常快,因为我的数据库被注入(inject)了。我至少需要一个不允许用户使用的脚本:[空格,符号('*','=','/','。')和单词列表('SELECT','FROM' ,'WHERE')] 在我的注册表的文本字段中。
我听说了一些关于 mysql_real_escape_string()
的事情。这个命令在做什么?并且不要发布指向 PHP: mysql_real_escape_string() Manual
的链接,因为我已经读过了。
<分区>
我需要一些帮助,而且非常非常快,因为我的数据库被注入(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/