转义字符的首选顺序是什么?
例如在PHP
环境中:
1) shell -> database = return escapeshellcmd(mysqli_real_escape_string($string));
return mysqli_real_escape_string(escapeshellcmd($string));
?
3)完全没有差异?
更新只是为了澄清,我目前正在尝试修复的网站,包含很多旧的,过时的功能,使用magic_quotes,基本上,从旧主机转移到当前主机后不可用,问题出现了。
第一个问题是MySQL转义,我用mysql_real_escape_string();
修复,但是,CLI/Socket
MySQL连接环境仍然存在问题。也就是说,当你在textarea
中有一个引用UNIX命令的值,前面有一个/
-正斜杠符号,然后你发布它时,Apache会导致501方法未实现。
所以,是的,我必须转义mysql
和转义shell
命令。但是,shell
命令转义(使用示例no。1从原来的问题)导致UTF-8字符制动和丢失了许多需要的HTML符号。
需要转义的内容来自WYSIWYG编辑器(SPAW),因此它包含许多引号和不时出现的UNIX命令,类似于我们的国家-拉脱维亚-货币。"/ls",其中ls为货币。
网站是由客户自己更新的,而不是技术人员,它必须保持这种方式-我的意思是,我们不能接管内容编辑。另外,虽然我们可以告诉他们不要使用/ls
,但是UNIX的问题仍然存在,例如,如果他们意外地使用了/mkdir
,它可能类似于某个东西的标识符。
他们是一家活跃的旅游公司,因此这个问题需要尽快解决。自从我们接管了他们的网站,他们意识到系统坏了,但他们现在没有闲钱花在一个新的网站/修复现有的。我们得出的结论是,修复它会比转移到我们的CMS更困难,因此更昂贵,但钱仍然是钱。
那么,我如何从这个所见即所得编辑器的文本区转义shell和数据库命令,这是一个单一的字符串,但是,同时保留我们的拉脱维亚字母的UTF-8编码- ā, š, č, ž
等?
也许我不需要逃避两者,这就是我问的原因。
提前感谢!
更新在Shrapnels的请求上,一个示例字符串(从SPAW的HTML视图复制)将导致Apache响应501:
<div>
<span style="color: rgb(0, 0, 128); " class="Apple-style-span">
<span style="font-size: 12px; " class="Apple-style-span">
/ls
</span>
</span>
</div>
SPAW自动添加所有这些愚蠢的元素,是的,如果/<command>
在字符串内,501!
这就是停止它所需要的,只是一个引用UNIX命令行函数的名称空间。就像在这种情况下/ls
,但可以是/rmdir
, /mkdir
等。你可以有20000个符号,没有/ls
,这是可行的。一旦有了这样的东西——砰,死定了!
最初有一个函数是用来清除所有错误的(至少我认为是这样的,它原来的名字是- removeShit();
):
$string = $_POST['wysiwyg_textarea']; // SPAW text area
function removeStuff($string){
return str_replace('/wysiwyg/empty.html', '', $txt);
}
文件/wysiwyg/empty.html
是0字节-完全空文件。
但这并不能解决mysql转义和/或UNIX shell命令识别问题。因此,我需要一个修复程序来逃避UNIX命令和任何MySQL有害的东西。
所以,我试着这样做:
return escapeshellcmd(mysqli_real_escape_string($string));
但是这一个去掉了所有的utf-8字符,加上,所有的新行符号被转换为简单的字符串"rn",我猜是'r'n
。
现在我正在寻找一个函数来逃避MySQL和Shell cmd的一个,因为我想不出另一种方法来解决所有这些混乱
都不是
使用 escapeshellcmd()
或mysqli_real_escape_string()
,取决于您计划对$string
做什么。
不要同时使用两者。这没有意义。