Php 如何知道MySQL何时需要转义

Php 如何知道MySQL何时需要转义,php,mysql,escaping,Php,Mysql,Escaping,我正在用CodeIgniter建立一个站点。这是我自己创建的第一个与数据库交互的站点。我正在为这个项目使用MySQL。在将数据保存到数据库之前,如何判断数据是否需要转义?如果有疑问,请全部转义。再安全不过了 好的,好的。我明白了 总是逃避不要担心逃避自己(你会把事情搞砸的)。使用DB层,首先准备语句,然后向其中添加数据 在PHP中,您应该使用。你写 SELECT * FROM table WHERE key = :key AND value = :value 然后通过调用函数添加数据。何时退出

我正在用CodeIgniter建立一个站点。这是我自己创建的第一个与数据库交互的站点。我正在为这个项目使用MySQL。在将数据保存到数据库之前,如何判断数据是否需要转义?

如果有疑问,请全部转义。再安全不过了

好的,好的。我明白了


总是逃避

不要担心逃避自己(你会把事情搞砸的)。使用DB层,首先准备语句,然后向其中添加数据

在PHP中,您应该使用。你写

SELECT * FROM table WHERE key = :key AND value = :value

然后通过调用函数添加数据。

何时退出?一旦您的站点公开。

如果数据是字符串,则必须始终对其进行转义

但是,最好改用参数。

如果使用with,则不必进行任何手动转义:

使用绑定的第二个好处 这些值是自动生成的 逃逸,生成更安全的查询。你 不必记住手动操作 逃逸数据;引擎能做到这一点 自动为你


当MySQL查询字符串中的任何一个由用户输入组成时,可以对其进行转义,例如:

在PHP中: $username=//来自用户输入的值

那么您的查询字符串是: “在
表中插入('username')值(“.$username”)”


由于$username变量可能会有恶意代码被客户端插入到您的数据库中,因此您必须退出此mySQL查询。

我建议您习惯使用准备好的语句。尤其是因为您刚刚接触数据库。你越早开始使用这些,它就越容易成为你的第二天性

一、 例如,当我开始使用数据库时,我不知道准备好的语句。当我接触到他们时,我也感受到了自己的固执。因为我已经习惯了另一种做事的方式。现在,这可能不是你自己的角色交易,但不管怎样,尽快开始都没有坏处

准备好的语句允许您在查询中使用占位符。通过将这些占位符绑定到占位符,可以用实际值替换这些占位符。这个绑定过程会自动转义这些值

下面是一个(简单)示例:

PDO和准备好的声明有更多的可能性。例如,您可以轻松地在循环中重用准备好的语句,例如:

$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
foreach( $users as $dirtyUser )
{
    $statement->bindValue( ':username', $dirtyUser->username );
    $statement->bindValue( ':password', $dirtyUser->password );
    $result = $statement->execute();
    // result checking ommited for brevity
}
或者将占位符绑定传递给execute方法,如下所示:

$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
$result = $statement->execute( array( 
                                   ':username' => $dirtyUsername, 
                                   ':password' => $dirtyPassword
                             ) );
// result checking ommited for brevity

。。。等等。

如果您自己生成SQL,而不是使用PDO之类的东西,那么您必须始终转义字符串

转义字符串是SQL语言的基本要求。它允许您在字符串中使用撇号或反斜杠等字符,而不会出现任何问题。在任何情况下都不需要转义字符串

即使是非字符串也必须进行过滤,以确保它们确实是非字符串


如果你在学习,请认真考虑像其他许多人所说的学习PDO之类的东西,而不是逃避自己的字符串。你的,约西亚也是。没有任何用户或疑问相关。没有任何相关的东西。逃走是无条件的程序。对上校弹片+1。转义实际上不是一个安全问题,转义是使查询有效的方法。@Shrapnel和@zerkms使查询有效听起来是件好事?我错过了什么?@Mike:去掉“怀疑”和“太安全了”。唯一的规则是“永远”。程序员不应该考虑“逃跑或不逃跑”,这必须是确定的行为。冗余转义将破坏数据。可怕的错误。正确答案-一旦你开始与database@Col:请写下你自己的答案,这样我们可以把它做得更好;-)(并非讽刺)不是查询字符串而是数据字符串。不是当任何字符串由用户输入组成时,而是任何字符串。如图所示,请详细说明;)见鬼,这是唯一与CodeIgniter有关的答案。我因为愚蠢的第二部分而投了反对票。这与问题和可怕的想法本身无关。如果您因为业务逻辑而需要筛选数据,请执行此操作,但不要尝试保护某些内容。+1更正并提供引用。它甚至利用了提问者正在使用的事实codeigniter@zerkms:根据输入或输出进行过滤在很大程度上取决于用例。过滤输入并非天生错误。@Jonathan Fingland:过滤与转义无关。完全任何字符串数据都应该转义。不要混淆操作。绑定过程不会转义。剩下的是使用PDO的情况,实际上可能是这样(好的,不是调用bindParam()本身)。设置ATTR_EMULATE_PREPARES标志(或由于驱动程序不支持服务器端准备语句而强制设置)时,PDO将创建一个包含(转义)参数的查询字符串。
$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
$result = $statement->execute( array( 
                                   ':username' => $dirtyUsername, 
                                   ':password' => $dirtyPassword
                             ) );
// result checking ommited for brevity