2

可能重复:
mysql_real_escape_string() 是否完全防止 SQL 注入?

在我的页面中,我创建了一个表单,我想做的是在 php 编码中发布字段值时,我想同时使用strip_tagsmysql_real_escap_stringas :

$res = stript_tags(mysql_real_escape_string($_POST['name']));

上述编码对于安全提交输入字段名称是否正确,或者在提交时会产生任何问题。

4

4 回答 4

2

就其本身而言,这应该可以正常工作。但就个人而言,我建议您根本不要使用mysql_real_escape_string。我相信我认为您正在使用mysql_*已弃用的扩展是正确的。帮自己一个忙,切换到PDOmysqli_*,最好是 PDO。

这些是更现代的扩展,支持准备好的语句,
请在此处查看我的答案以获得几个链接。此外,请参阅Bobby 表,了解为什么准备好的语句比手动转义数据更安全。

正如@phant0m 所说:使用mysql_real_escape_string并非完全证明(请参阅他评论中的链接)。使用函数时也有一些陷阱strip_tags,尤其是stripslashes:当你处理数据时,在某些时候,数据包含类似的东西并不是不可想象的Foo\'s Bar,并且,正如文档所说:

如果打开了magic_quotes_sybase,则不会删除反斜杠,而是将两个撇号替换为一个。

试着弄清楚结果stripslashes(mysql_real_escape_string($data));会是什么......

使用时strip_tags,重要的是要注意允许的标签保留它们的属性,其中可能包含斜杠、冒号、分号、破折号、引号和您不希望看到的各种其他字符会弄乱您的查询...
更多可能的问题和strip_tags,看看这个帖子

于 2012-11-28T12:20:49.937 回答
2

首先:mysql_real_escape_string函数将有助于防止 SQL 注入(在一定程度上),但这并不是保护数据库的最佳方法。当不正确使用不同的连接字符集时,该函数存在已知漏洞,更重要的是,不再推荐使用mysql 函数。引用 PHP.net:

不鼓励使用此扩展程序。

防止 SQL 注入的最好方法是使用准备好的语句。要使用准备好的语句,您应该切换到PDO对象或mysqli

其次,你不应该真的在输入上使用strip_tags 。为什么?因为如果用户在标签内输入一些内容,那么您将体验到数据完整性的损失。就个人而言,我认为 strip_tags 应该只用于输出。即当您显示用户输入的数据时。

第三,strip_tags 不会防范所有 XSS 攻击。个人而言,用于防范 XSS;我会选择类似的东西:

echo htmlspecialchars($stringToOutput, ENT_QUOTES, 'UTF-8');

htmlspecialchars会将所有特殊字符转换为其相关的 HTML 实体。

于 2012-11-28T12:23:13.110 回答
1

您发布的代码将起作用。但是,最好在可能的最晚时刻对字符串进行转义。这将使您的变量保持干净,因为您不想在实际查询之前使用转义字符串。

一个例子:

$query = "SELECT * FROM tablename WHERE column1 = '". mysql_real_escape_string($_POST['name']) ."'";

另请注意,不再维护 mysql_* 函数 - 您可以使用mysqli_*代替,但最好的方法是使用PDO准备好的语句

于 2012-11-28T12:20:35.047 回答
1

您应该考虑为此使用一些框架,而不是手动进行。查看Zend_DbPDO(阅读准备好的语句)。

PDO 的一个例子:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
$st = $dbh->prepare( '
    INSERT INTO fruits( name, colour )
    VALUES( :name, ":colour" )
';
$st->execute( array( ':name' => 'Apple', ':colour' => 'red' ) );
于 2012-11-28T12:22:03.313 回答