用utf-8字符转义shell /数据库


Escaping shell / database with utf-8 characters

转义字符的首选顺序是什么?

例如在PHP环境中:

1) shell -> database = return escapeshellcmd(mysqli_real_escape_string($string));

2) database -> shell = 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做什么。

不要同时使用两者。这没有意义。