可能重复:
Does mysql_real_escape_string() FULLY protect against SQL injection?
在我的页面中,我创建了一个表单,我想要做的是在php编码中发布字段值时我想同时使用strip_tags
和mysql_real_escap_string
:
$res = stript_tags(mysql_real_escape_string($_POST['name']));
上述编码对于输入字段名称的安全提交是否正确,或者在提交时会产生任何问题。
答案 0 :(得分:2)
本身,这应该工作得很好。但就个人而言,我建议你不完全使用mysql_real_escape_string
。我相信我认为你正在使用mysql_*
扩展名,这是正在被弃用的。帮个忙,切换到PDO
或mysqli_*
,最好是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']) ."'";
答案 3 :(得分:1)
您应该考虑使用一些框架而不是手动执行。请查看Zend_Db或PDO(阅读准备好的陈述)。
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' ) );