在我的页面中,我创建了一个表单,我想做的是在 php 编码中发布字段值时,我想同时使用strip_tags
和mysql_real_escap_string
as :
$res = stript_tags(mysql_real_escape_string($_POST['name']));
上述编码对于安全提交输入字段名称是否正确,或者在提交时会产生任何问题。
在我的页面中,我创建了一个表单,我想做的是在 php 编码中发布字段值时,我想同时使用strip_tags
和mysql_real_escap_string
as :
$res = stript_tags(mysql_real_escape_string($_POST['name']));
上述编码对于安全提交输入字段名称是否正确,或者在提交时会产生任何问题。
就其本身而言,这应该可以正常工作。但就个人而言,我建议您根本不要使用mysql_real_escape_string
。我相信我认为您正在使用mysql_*
已弃用的扩展是正确的。帮自己一个忙,切换到PDO
或mysqli_*
,最好是 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
,看看这个帖子
首先: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 实体。
您应该考虑为此使用一些框架,而不是手动进行。查看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' ) );