在表单提交时在php中组合strip_tags和mysql_real_escape_string

时间:2012-11-28 12:14:06

标签: php

  

可能重复:
  Does mysql_real_escape_string() FULLY protect against SQL injection?

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

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

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

4 个答案:

答案 0 :(得分:2)

本身,这应该工作得很好。但就个人而言,我建议你完全使用mysql_real_escape_string。我相信我认为你正在使用mysql_*扩展名,这是正在被弃用的。帮个忙,切换到PDOmysqli_*,最好是PDO。

这些是更现代的扩展程序,支持准备好的语句
see my answer here以获取几个链接。另外,请参阅Bobby tables,了解为什么预备语句比手动转发数据更安全。

正如@ phant0m所说:mysql_real_escape_string的使用不是完全证明的(参见他评论中的链接)。使用strip_tags等特别是stripslashes等功能时也存在一些陷阱:当您处理数据时,在某些时候,数据包含Foo\'s Bar之类的内容并不是不可想象的,并且,正如文档所说:

  

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

尝试找出stripslashes(mysql_real_escape_string($data));的结果......

使用strip_tags时,请务必注意允许标记 保留其属性,其中可能包含斜杠,冒号,分号,短划线,引号以及您不希望看到的各种其他字符搞乱您的查询...
对于strip_tags的更多可能问题,请查看at this post

答案 1 :(得分:2)

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

  

不鼓励使用此扩展程序。

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

其次,你不应该在输入上使用strip_tags。为什么?因为如果用户在标签内输入内容,那么您将失去data integrity。就个人而言,我认为strip_tags应该仅用于输出。即,当您显示用户输入的数据时。

第三,strip_tags不会防范所有XSS攻击。就个人而言,防范XSS;我会去做类似的事情:

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

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

答案 2 :(得分:1)

您发布的代码将有效。但是,最好在最新时刻转义字符串。这将使您的变量保持干净,因为您不希望在实际查询之前使用转义字符串。

一个例子:

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

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

答案 3 :(得分: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' ) );