我正在使用CodeIgniter构建网站。这是我自己构建的第一个与数据库交互的站点。我在这个项目中使用MySQL。如何在将数据保存到数据库之前判断数据是否需要转义?
答案 0 :(得分:8)
我建议你习惯使用准备好的陈述。特别是因为您不熟悉数据库。越早开始使用这些,就越容易成为第二天性。
例如,当我开始使用数据库时,我不知道准备好的语句。当我与他们联系时,我经历了自己的僵局。因为我已经习惯了另一种做事方式。现在,这可能不是你自己的角色交易,但无论如何都要尽快开始。准备好的语句允许您在查询中使用占位符。然后,可以通过将这些占位符绑定到占位符来将这些占位符替换为实际值。这个绑定过程会自动转义值。
这是一个(简单的)PDO示例:
$db = new PDO( /* some database parameters */ );
$statement = $db->prepare( 'INSERT INTO table VALUES( :username, :password )' );
$statement->bindValue( ':username', $dirtyUsername );
$statement->bindValue( ':password', $dirtyPassword );
$result = $statement->execute();
// result checking ommited for brevity
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
......等等。
答案 1 :(得分:4)
不要担心逃避自己(你会搞砸它)。使用首先准备语句的数据库层,然后向其中添加数据。
在PHP中,您应该使用PDO。你写了
SELECT * FROM table WHERE key = :key AND value = :value
然后通过调用函数添加数据。
答案 2 :(得分:3)
如果您将database class与query bindings一起使用,则无需进行任何手动转义:
使用绑定的第二个好处 是值是自动的 逃脱,产生更安全的查询。您 不必记住手动 逃逸数据;引擎做到了 自动为你服务。
答案 3 :(得分:2)
如果数据是字符串,则必须始终转义。
但是,最好使用参数。
答案 4 :(得分:1)
如果有疑问,请逃避一切。不能太安全。
好吧,好吧。我懂了
始终退出
答案 5 :(得分:1)
如果您自己生成SQL而不是使用PDO之类的东西,那么您必须总是转义字符串。
转义字符串是SQL语言的基本要求。它允许你在字符串中使用像撇号或反斜杠这样的字符而不会出现任何问题。根本不存在不需要转义字符串的情况。
即使是非字符串也必须进行过滤,以确保它们确实是非字符串。
如果你正在学习,请认真考虑像其他许多人所说的那样学习像PDO这样的东西,而不是逃避你自己的字符串。
答案 6 :(得分:-1)
当任何字符串由用户输入组成时,您将转义MySQL查询字符串,例如:
PHP中的: $ username =; //来自USER INPUT的值
然后你的查询字符串是:
“INSERT INTO table
('username')VALUES(”。$ username。“)”
你必须要逃避这个mySQL查询,因为$ username变量可能会被客户端插入恶意代码注入你的数据库。
答案 7 :(得分:-2)
什么时候逃跑?一旦您的网站上线。