首页 > 解决方案 > PHP - 如何让 pack() 返回与常规字符串相同的字符串?

问题描述

我不确定问题是什么。我认为这是一个编码问题。我想要的是

pack('V', 0x41) == "A"

返回真。即使来自 mb_detect_encoding() 的编码为两者都返回 ASCII 并且在回显时都将“A”打印到屏幕上,但情况并非如此。真正的问题是,当打包字符串包含在 sql 查询中时:

 $sql = "SELECT item_name, item_description FROM items WHERE item_name LIKE '$querystr%'";

它无法执行查询,即使打印到屏幕上的字符串是等效的。这是针对我正在创建的 CTF 挑战,所以是的,该代码意味着容易受到注入。

标签: phpencodingpack

解决方案


中的 V 参数pack采用 32 位无符号值(小端字节顺序),因此您的调用看起来像

pack('V', 0x00000041) === "A\0\0\0"

您可以使用 trim 去除多余的空值,您可以使用其他选项,例如c

pack('c', 0x41) === "A"

推荐阅读