Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
清除存储MySQL数据库过程的输入_Mysql_Sanitization - Fatal编程技术网

清除存储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
        uPass
        ,并且您没有执行动态SQL字符串。但是,在代码中如何调用过程可能会受到攻击。。。我们需要看到这一点。使用一些服务器端语言过滤器使用javascript对输入进行管理永远不会安全。这必须在服务器上完成。过程本身不易受攻击,因为RDBMS将正确处理参数
        uName
        uPass
        ,并且您没有执行动态SQL字符串。但是,在代码中如何调用过程可能会受到攻击。。。我们需要看到这一点。使用一些服务器端语言过滤器使用javascript对输入进行管理永远不会安全。这必须在服务器上完成。我已经包括了调用的PHP页面,我以前没有注意到它实际上是从PHP代码中调用的。很抱歉造成混淆,因为我说过我不太擅长这一点。我已经包括了进行调用的PHP页面,之前我没有注意到它实际上是从PHP代码中调用的。很抱歉造成混淆,正如我所说的,我不太擅长于此。对于php,请遵循:从我所收集的信息来看,上面的php使用mysqli这一简单事实应该足以确保查询是安全的。我的结论正确吗?不正确。要做到这一点,必须绑定参数$stmt=$mysqli->prepare(“插入表(列)值(?);//TODO检查$stmt creation successed/“s”表示数据库需要一个字符串$stmt->bind_param(“s”,$safe_变量);是的,我知道
        prepare
        语句实际上使代码安全。然而,
        sprintf
        难道不能确保我提供的那一个也是安全的吗?如果可能的话,请提供一个简短的例子,如果不是这样的话$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_变量);是的,我知道
        prepare
        语句实际上使代码安全。然而,
        sprintf
        难道不能确保我提供的那一个也是安全的吗?如果可能的话,请提供一个简短的例子,如果不是这样的话$stmt->bind_参数('ss',$uName,$uPSW)$stmt->Execute()$stmt->bind_result($result)$stmt->fetch();回声$结果$stmt->close()$mysqli-close();