清除存储MySQL数据库过程的输入
我正在使用其他人制作的数据库(我没有真正的权限更改它)。但是,当我查看数据库中的存储过程时,我注意到以下过程:清除存储MySQL数据库过程的输入,mysql,sanitization,Mysql,Sanitization,我正在使用其他人制作的数据库(我没有真正的权限更改它)。但是,当我查看数据库中的存储过程时,我注意到以下过程: DELIMITER $$ CREATE PROCEDURE `logIn`(userName varChar(50), userPass varChar(50)) BEGIN declare userID int; SELECT u.userID INTO userID FROM users u WHERE u.userName=user
DELIMITER $$
CREATE PROCEDURE `logIn`(userName varChar(50), userPass varChar(50))
BEGIN
declare userID int;
SELECT
u.userID INTO userID
FROM
users u
WHERE
u.userName=userName
AND u.userPassword=MD5(userPass);
IF (IFNULL(uID,-1) > 0) THEN
select 1 as outMsg;
ELSE
select 0 as outMsg;
END IF;
END$$
相应的表users
有三列:userID INT
,userName VARCHAR(50)
和userPassword VARCHAR(50)
由于我在这方面不是很在行,有人能告诉我是否需要对这样一个函数的输入进行清理,以不允许任何SQL注入,如果不允许,为什么?如能提供一般经验法则,将不胜感激
另外,此函数将从表单提交的JS脚本中调用。是的,在尝试运行该过程之前,必须对输入进行消毒
您可能希望共享该过程的实际调用点,以便在此处获得更多帮助,因为在表单提交时无法直接从JS调用该过程。您可能有一个Servlet、PHP页面或一些HTTP友好的中介来进行数据库调用。是的,在尝试运行过程之前,必须对输入进行清理
您可能希望共享该过程的实际调用点,以便在此处获得更多帮助,因为在表单提交时无法直接从JS调用该过程。您可能有一个Servlet、PHP页面或一些HTTP友好的中介来以某种方式进行数据库调用。这里有一些经验法则,它们取决于底层数据类型及其插入数据库的方式 首先,参数化查询始终是SQL注入保护的最佳选择。。但是如果你不能改变 字符串类型:
- >
- 这里有一些经验法则取决于底层数据类型以及如何将其插入数据库 首先,参数化查询始终是SQL注入保护的最佳选择。。但是如果你不能改变 字符串类型:
- 删除任何单引号 或 将任何单引号替换为单引号两次
- 用编码的替代字符替换以下任何字符
- >
- 过程本身不易受攻击,因为RDBMS将正确处理参数
和uName
,并且您没有执行动态SQL字符串。但是,在代码中如何调用过程可能会受到攻击。。。我们需要看到这一点。使用一些服务器端语言过滤器使用javascript对输入进行管理永远不会安全。这必须在服务器上完成。过程本身不易受攻击,因为RDBMS将正确处理参数uPass
和uName
,并且您没有执行动态SQL字符串。但是,在代码中如何调用过程可能会受到攻击。。。我们需要看到这一点。使用一些服务器端语言过滤器使用javascript对输入进行管理永远不会安全。这必须在服务器上完成。我已经包括了调用的PHP页面,我以前没有注意到它实际上是从PHP代码中调用的。很抱歉造成混淆,因为我说过我不太擅长这一点。我已经包括了进行调用的PHP页面,之前我没有注意到它实际上是从PHP代码中调用的。很抱歉造成混淆,正如我所说的,我不太擅长于此。对于php,请遵循:从我所收集的信息来看,上面的php使用mysqli这一简单事实应该足以确保查询是安全的。我的结论正确吗?不正确。要做到这一点,必须绑定参数$stmt=$mysqli->prepare(“插入表(列)值(?);//TODO检查$stmt creation successed/“s”表示数据库需要一个字符串$stmt->bind_param(“s”,$safe_变量);是的,我知道uPass
语句实际上使代码安全。然而,prepare
难道不能确保我提供的那一个也是安全的吗?如果可能的话,请提供一个简短的例子,如果不是这样的话$stmt->bind_参数('ss',$uName,$uPSW)$stmt->Execute()$stmt->bind_result($result)$stmt->fetch();回声$结果$stmt->close()$mysqli-close();对于php,请遵循:据我所知,上述php使用mysqli这一简单事实足以确保查询的安全性。我的结论正确吗?不正确。要做到这一点,必须绑定参数$stmt=$mysqli->prepare(“插入表(列)值(?);//TODO检查$stmt creation successed/“s”表示数据库需要一个字符串$stmt->bind_param(“s”,$safe_变量);是的,我知道sprintf
语句实际上使代码安全。然而,prepare
难道不能确保我提供的那一个也是安全的吗?如果可能的话,请提供一个简短的例子,如果不是这样的话$stmt->bind_参数('ss',$uName,$uPSW)$stmt->Execute()$stmt->bind_result($result)$stmt->fetch();回声$结果$stmt->close()$mysqli-close();sprintf