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

时间:2011-09-22 18:58:21

标签: php database escaping

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

例如在PHP环境中:

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

2)数据库 - > 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命令转义(原始问题中的第1个例子)导致UTF-8字符制动并丢失了许多所需的HTML符号。

需要转义的内容来自WYSIWYG编辑器(SPAW),因此它包含很多引号,并且不时有UNIX命令,类似于我们的国家 - 拉脱维亚 - 货币。 “/ ls”,其中LS是货币。

网站由客户本身更新,而不是技术人员,它必须保持这种状态 - 我的意思是,我们无法接管内容编辑。另外,虽然我们可以告诉他们不要使用/ls,但是如果例如他们意外地到达/mkdir那可能类似于某些东西的识别符,则UNIX问题仍然存在。

他们是一家活跃的旅游公司,因此需要尽快修复。由于我们超越了他们的网站,他们知道系统已经坏了,但他们目前没有免费资金用于新网站/修复现有网站。我们得出的结论是,修复它会更难,因此比转移到我们的CMS更昂贵,但钱仍然是钱。

那么,如何从这个WYSIWYG编辑器的textarea中转义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它会起作用。一旦有这样的事情 - bam,死了!

最初有一个功能是为了清除所有错误(至少我想是这样,它的原始名称是 - 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的功能,因为我无法想到如何治愈所有这些混乱的另一种方式。

1 个答案:

答案 0 :(得分:1)

都不是。

使用 escapeshellcmd()mysqli_real_escape_string(),具体取决于您计划对$string执行的操作。

切勿同时使用两者。这没有意义。