【发布时间】:2011-09-22 18:58:21
【问题描述】:
转义字符的首选顺序是什么?
例如在PHP 环境中:
1) 外壳 -> 数据库 = 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 Method Not Implemented。
所以是的,我必须转义 mysql 和转义 shell 命令。但是,shell 命令转义(原始问题中的第 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,它会工作。一旦有这样的事情 - 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`s,因为我想不出另一种方法来解决所有这些混乱。
【问题讨论】:
-
我认为查看一些代码会有所帮助。我仍然无法弄清楚这里发生了什么。 (不过我今天必须签收)
-
@Pekka,稍后我将使用代码示例更新问题。我希望虽然我还没有这样做,但有人能够提供治疗或其他方法。
-
when you have a value inside a textarea that refers to a UNIX command, preceded by a / - forward slash symbol and you post it- Apache results in 501 Method Not Implemented.- 详细说明这一点。例子就好了。 -
“/
”出现在 HTML 输出中或在 HTTP 请求中提交时是否会导致问题?关于 MySQL 问题,切换到支持预处理语句的扩展(例如 mysqli)需要多长时间? -
在 HTTP 请求中提交时。问题不在于预准备语句的扩展。问题是,MySQL 在这里的 CLI 环境中工作。我已经逃脱了 MySQL——它运行良好。但是 CLI 环境以某种方式为
/ls提供了优先级,并且即使在mysql://调用中也会尝试执行它。