我需要一些帮助,而且非常快,因为我的数据库被注入了。我至少需要一个不允许用户使用的脚本:[Spaces,Sybols喜欢('*','=','/','。')和一个单词列表('SELECT','FROM' ,'WHERE')]在我的登记表格的文本字段中。
我听到了关于mysql_real_escape_string()
的一些事情。这个命令在做什么?并且不要发布到PHP: mysql_real_escape_string() Manual
的链接,因为我已经阅读过了。
答案 0 :(得分:2)
有一种正确和错误的方法可以解决这个问题。 (通常)错误的方法是尝试设置输入卫生方法(如脚本)并希望没有任何东西通过。它通常不起作用。
我建议您重写PHP SQL查询以使用 MySQLi预处理语句。这些是首先从常用SQL语法(" SELECT ... WHERE ...")转换为引擎可以使用的语句的查询,然后只有您的输入替换了字段,从而防止SQL注入。
例如,(非常)易受影响的SQL语法:
"SELECT * FROM users_passwords WHERE user='" + user + "' AND pass='" + password + "'"
可以转换为以下准备好的声明:
"SELECT * FROM users_passwords WHERE user=? AND password=?"
然后,使用命令bind_param()
,您可以在准备语句后用参数安全地替换?
占位符。虽然原始的SQL查询允许您使用一些基本的注入技术(比如写' 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();
答案 1 :(得分:0)
如果您使用的是PHP,那么为什么不在PHP脚本中执行此操作。在GET和POST中清理所有用户提供的输入,然后将其移至DB调用。这是正确的做法。
答案 2 :(得分:0)
即使你清理它,我也会强烈避免从任何输入构造SQL查询字符串 出于安全目的和性能的好方法是使用函数来设置参数:
for example:
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);