TMN*_*ear 2 php mysql mysql-real-escape-string htmlspecialchars stripslashes
当我将变量发布到数据库时,我当然使用了mysql_real_escape_string.这样,特殊字符就像它应该的那样进入数据库.
当我从数据库中读取这个变量时,我再次使用mysql_real_escape_string stripslashes:
$var = stripslashes(mysql_real_escape_string($record['rowname']));
Run Code Online (Sandbox Code Playgroud)
否则它会在引号前给我斜线.
当我使用$var上面提到的这个并想要回应它时,我很简单,echo "$var"因为它已经被剥离并逃脱了,对吧?
另外,如果我在变量上使用stripslashes+ mysql_real_escape_string,那么在数据库中再次POST这个相同的变量就mysql_real_escape_string足够了吗?或者我是否还需要stripslashes这个变量?
总结如下:
据我所知,这是如何工作的:
mysql_real_escape 每一次:当通过变量读取查询时,就像将变量发布到数据库一样.stripslashes在回显转义变量时使用.stripslashes变量再次发布和转发到数据库,则无需再次将其删除.我想念htmlspecialchars吗?
编辑
所以这都错了?
while( $record=mysql_fetch_array($result) )
{
$custid=mysql_real_escape_string($record['custid']);
$custsurname=mysql_real_escape_string($record['custsurname']);
$custmidname=mysql_real_escape_string($record['custmidname']);
$custforename=mysql_real_escape_string($record['custforename']);
$custcountry=stripslashes(mysql_real_escape_string($record['custcountry'])); }
Run Code Online (Sandbox Code Playgroud)
我担心你做错了.关键点在于转义是上下文敏感的,你完全无视这一事实.
在每种数据格式中,都有格式规范中赋予特殊含义的单词或字符.例如,'SQL中的符号表示"字符串分隔符",?URL中的符号表示"起始查询字符串" <,HTML中的符号表示"起始标记".当您想要插入文字或字符时,您需要转义,即,您希望按原样插入并删除其特殊含义.
一旦意识到这一点,很明显语法因格式和上下文而异.<表示HTML中的"开始标记",但不表示SQL或URL.因此,您需要使用为目标格式构建的转义方法,并遵循格式规则.
如果您mysql_real_escape_string()对从数据库读取的数据执行操作,则说"转义我的数据,以便它可以作为SQL字符串内部注入".您的数据已准备好作为SQL字符串在内部使用,但在任何其他用法中都会被破坏.
在这个例子中,碰巧stripslashes()撤消大部分内容,mysql_real_escape_string()最终得到的输出基本不变.但那是纯粹的机会.
最后但并非最不重要的是,必须逐个转义数据库输入参数非常烦人.所有其他数据库扩展,但您正在使用的扩展1提供预准备语句.不要被一个不提供现代东西的弃用扩展卡住.
1注意:遗留的mysql扩展已经被弃用了好几年,当更好的替代品可用时,它不再是语言的一部分.
更新:一点澄清 - 逃避只是一种语法技巧.您不会改变目标引擎眼睛的输入,而目标引擎只能看到原始数据.因此,在检索输入时无需取消输入.