Php 我什么时候不应该使用mysql\u real\u escape\u字符串
我看到这个评论Php 我什么时候不应该使用mysql\u real\u escape\u字符串,php,mysql,Php,Mysql,我看到这个评论 并且开始怀疑为什么这是一个坏主意。对任何不会被放入SQL查询的数据。如果需要转义输出,请使用htmlspecialchars()(或类似工具)。数据库输入也是如此;只有在代码进入之前才能将其转义。从网站上专门针对该代码示例的评论判断,我认为他是在说,如果magic_quotes已关闭,并且您确定您只能在服务器上使用代码,如果(get_magic_quotes_gpc()),您可以编辑代码并删除。。。etc 一般来说,虽然它对包含在查询中的数据没有用处,但在查询中不使用引号-即ID
并且开始怀疑为什么这是一个坏主意。对任何不会被放入SQL查询的数据。如果需要转义输出,请使用htmlspecialchars()(或类似工具)。数据库输入也是如此;只有在代码进入之前才能将其转义。从网站上专门针对该代码示例的评论判断,我认为他是在说,如果magic_quotes已关闭,并且您确定您只能在服务器上使用代码,如果(get_magic_quotes_gpc()),您可以编辑代码并删除
。。。etc
一般来说,虽然它对包含在查询中的数据没有用处,但在查询中不使用引号-即ID的整数,需要检查它们的类型。理想情况下,在使用PDO准备的语句在查询中使用它之前,不必转义任何内容。底层库将为您处理转义 在实践中,如果不能/不想使用预处理语句,则应仅在构建查询字符串之前立即进行转义。不要盲目地去重新映射各种超全局的内容(GET、POST、REQUEST、COOKIES),假设所有内容都将进入数据库。考虑这样一种情况,您必须首先验证表单数据,但某些字段没有正确填写。现在,您必须将所有内容从“数据库模式”中取消,并重新转义到“html模式”,以便将良好的数据重新插入表单中
htmlentities/htmlspecialchars也是如此。在知道要输出到HTML/XML之前不要这样做。一旦你到处应用转义/编码/引用,你就会冒着双重编码的风险,最终得到像
”这样无用的结构;引用代码>出于以下几个原因,这是个坏主意:
- 首先,它假设您的输入
将始终进入
数据库,并单独输入数据库。
如果有什么东西要用呢
在HTML输出中?还是在电子邮件中?或
写入文件?或者其他很多
东西。。你的过滤应该总是
注意上下文
- 更重要的是,它鼓励
随意使用GET、POST等,因为
没有迹象表明他们已经
已被过滤。如果有人看见你
使用
echo$_POST['name']
在一页纸上,他们怎么知道是
被过滤了吗?甚至更糟。。。是
你确定是吗?那怎么办
其他应用程序?你知道,你是谁
刚刚交的?新开发人员会怎么做?他们会知道过滤很重要吗
当您希望转义要包含在将要到mysql数据库的sql查询中的字符串时,应该使用mysql\u real\u escape\u string-任何超出该范围的内容都将清楚地指示“何时不使用它:)
下面是一个详细的实现:
function clean( $p )
{
if( function_exists('mysql_real_escape_string') ) {
if( function_exists('get_magic_quotes_gpc') ) {
if( get_magic_quotes_gpc() ) {
$p = stripslashes( $p );
}
}
return mysql_real_escape_string( $p );
} else {
return $p;
}
}
只要你可以用它来代替。我的规则是,只在进入某一介质之前立即对该介质进行消毒。因此,只有在查询中使用字符串之前,才立即对字符串进行sql转义,而不是在HTTP->PHP转换时,如所讨论的PHP.net注释所示。