使用mysqli来阻止sql注入,如何设置NULL或CURRENT_DATE?

时间:2011-09-07 08:15:03

标签: mysql mysqli sql-injection

mysqli php库中,在bind_param()方法中,将参数绑定到查询中。 bind_param()的第一个参数是types,一个字符串,其中每个字符代表数据类型传递,例如,'s'代表字符串。

   $query = "update users set update_usr_id = ? where user_id = ?";
   $arg1 = ($update_usr_id=$usr_id) ? '2011-01-01' : 'CURRENT_DATE';
   $arg2 = $update_usr_id;

如何将NULL或CURRENT_DATE表示为参数?

例如,尝试'CURRENT_DATE'作为字符串,但发布为“0000-00-00”。 (据我所知,“0000-00-00”,一个非法的日期,对于不使用NULL的人来说是一个NULL的mysqlism,显然是很多人)。

使用参数,如何使用NULL和CURRENT_DATE?


@Johan指出NULL 确实有效。在测试中,这似乎是真的,但事实并非如此。会发生什么,从第一个NULL参数开始,所有参数都设置为NULL!

默认值与此无关。有很多次我希望在UPDATE中将列设置为NULL或CURRENT_DATE - 而不是INSERT - 因此默认值在事务中不起作用。

另外,编写触发器以涵盖mysqli的不足之处的想法是非常糟糕的编程 - 在我的日子里写了意大利面条触发器,我是一个可以说话的人。更新日志的触发器是一回事 - 像这样的触发器将是一个持续的维护噩梦,几乎没有可能正确维护代码的可能性。

2 个答案:

答案 0 :(得分:1)

如果需要默认参数,可以在数据库模式中指定默认值 对于current_date,您需要将数据类型设置为timestamp而不是date,这样MySQL会在丢失数据时自动将now()插入到字段中。

或创建触发器

DELIMITER $$

CREATE TRIGGER BEFORE INSERT ON FOR EACH ROW
BEGIN
  IF new.mydate IS NULL THEN SET new.mydate = NOW();
END $$

DELIMITER ;

如果要传递null,只需将var设置为null:

$var = null;

<强>链接
http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html

答案 1 :(得分:0)

mysqli参数有限且难以使用。它们不仅不接受NULL和CURRENT_DATE等内部函数作为参数,而且每个参数都通过引用传递。 (这意味着需要为每个参数创建一个参数 - 这可能是INOUT过程参数或SELECT INTO所必需的,但对于普通的dml只是浪费时间。)最重要的是,它们显然不会被会话存储或db以使后续调用更有效。

(比较Postgres准备好的声明,例如,它被命名并重新使用(仅在会话级别)。这意味着数据库不需要重新教授声明;它还意味着语句已经“计划好”,因此不仅会学习语义,还会学习执行计划并重新使用以提高速度。)

目前正在为MySQL编写一些内容,我希望它实际上可用。将在稍后发布。