如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
什么是存储过程?他们是如何工作的?什么是存储过程的组成(每个必须是存储过程的东西)?
这是有关PHP数据对象的常见问题列表
由于PDO具有常规PHP用户未知的某些功能,因此有关PDO中的预准备语句和错误处理的问题非常频繁.所以,这只是一个可以找到它们的地方.
如果您的问题已与此列表密切相关,请在下面找到您的问题并将修复程序应用于您的代码.对其他问题进行简要介绍也是一个好主意,让自己为其他常见陷阱做好准备.
也可以看看
例如 - 我从cli创建数据库和表并插入一些数据:
CREATE DATABASE testdb CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
USE testdb;
CREATE TABLE test (id INT, str VARCHAR(100)) TYPE=innodb CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
INSERT INTO test VALUES (9, 'some string');
Run Code Online (Sandbox Code Playgroud)
现在我可以这样做,这些例子确实有用(所以 - 引号不会影响它看起来的任何东西):
SELECT * FROM test WHERE id = '9';
INSERT INTO test VALUES ('11', 'some string');
Run Code Online (Sandbox Code Playgroud)
所以 - 在这些例子中,我通过在mysql中实际存储为INT 的字符串选择了一行,然后在一个INT列中插入了一个字符串.
我不太明白为什么它的工作方式与此相同.为什么允许将字符串插入INT列?
我可以将所有Mysql数据类型作为字符串插入吗?
这种行为是否适用于不同的RDBMS?
谢谢!
我这两个功能之间的混淆Bindvalue()和BindParam()
%和_,所以使用时要小心LIKE.所以我认为BindValue()在使用LIKE查询时不会使用.LIKE查询时BindParam().因为我知道BindParam可以逃避这些%和_.BindValue()没有防止sql注入.我不确定这个,是真的吗?朋友告诉我在这3点中提到的是对还是错.我是PDO的初学者所以请清楚解释一下..
$stmt = $conn->prepare('SELECT * FROM users WHERE user_id = :user_id');
$stmt->execute(array(':user_id' => $_GET['user_id']));
$result = $stmt->fetchAll(PDO::FETCH_OBJ);
Run Code Online (Sandbox Code Playgroud)
我正在使用这样的PDO,我是否需要清理GET参数?
我知道如果我做的$stmt->bindParam(':user_id', $_GET['user_id'], PDO::PARAM_INT);比这不是问题.但我的方式安全吗?