【问题标题】:Send post data in url and secure it在 url 中发送帖子数据并保护它
【发布时间】:2015-06-04 04:15:47
【问题描述】:

我想在 url 中发送一些信息,但我怎样才能以安全的方式对其进行加密?

这是我的网址,例如: http://www.domain.com/process/?var=1&variable=2

如果用户知道 url,他可以更改变量,这不是本意。

我必须对其进行加密,并在我认为的服务器上对其进行解密。但是有什么好的和安全的方法来做到这一点呢?

编辑更多信息

我要存档的是我的手机应用程序(在本例中为 IOS)通过使用 API 与我的网络应用程序(主要)通信。 URL 可能如下所示 http://www.website.com/api/my_secret_key/get/users,它将以 json 响应 还需要应用设置值,例如:http://www.website.com/api/my_secret_key/set/user/score/100

但是,使用上述 URL 调整值很容易,但不需要。如何使用安全的方法来做到这一点。

【问题讨论】:

  • 如果您发送的内容无论如何都是敏感的,那么将其传递到 URL 绝对是最后的手段。 POSTing 数据是不可能的吗?
  • 您可以使用cURL 发送POST 请求 - curl.haxx.se
  • How to Encrypt the URL的可能重复
  • @juxhin 请看我编辑的帖子,当使用 Curl 时使用该类型的 url 进行设置是安全的,最终用户无法调整 POST 值?
  • my_secret_key 用户特定的(在这种情况下它应该是一个秘密,不应该进入 URL),或者是你提供给你的应用程序的魔法密钥(在这种情况下你的安全模式是基于信任客户,这根本不起作用)?

标签: php security url encryption


【解决方案1】:

警告:以下是不安全的加密代码。 A better answer and solution already exists on StackOverflow.

class encryption{
        private $config;

        public function __construct( $options=array() ){
            $this->config=array_merge(
                array(
                    'cipher'    =>  MCRYPT_RIJNDAEL_256,
                    'mode'      =>  MCRYPT_MODE_ECB,
                    'key'       =>  FALSE,
                    'iv'        =>  FALSE,
                    'size'      =>  FALSE,
                    'base64'    =>  TRUE,
                    'salt'      =>  FALSE
                ),
                $options
            );
        }
        private function getivs( $config=object ){
            $config->size=mcrypt_get_iv_size( $config->cipher, $config->mode );
            $config->iv=mcrypt_create_iv( $config->size, MCRYPT_RAND );
        }
        public function encrypt( $data=NULL ){
            $config=(object)$this->config;
            $this->getivs( $config );
            $data=trim( $data );
            $module = mcrypt_module_open( $config->cipher, '', $config->mode, '' );
            mcrypt_generic_init( $module, $config->key, $config->iv );

            $output = $config->base64 ? base64_encode( mcrypt_generic( $module, $data ) ) : mcrypt_generic( $module, $data );

            mcrypt_generic_deinit( $module );
            mcrypt_module_close( $module );
            return $output;
        }
        public function decrypt( $data=NULL ){
            $config=(object)$this->config;
            $this->getivs( $config );
            mb_detect_order( 'auto' );
            $encoding=mb_detect_encoding( $data );
            if( !$data or is_null( $data ) or empty( $data ) or !$encoding or $data=='' or base64_decode( $data )=='' ) return FALSE;

            $module = mcrypt_module_open( $config->cipher, '', $config->mode, '' );
            mcrypt_generic_init( $module, $config->key, $config->iv );

            $output = $config->base64 ? rtrim( mdecrypt_generic( $module, base64_decode( $data ) ),"\0" ) : rtrim( mdecrypt_generic( $module, $data ),"\0" );

            mcrypt_generic_deinit( $module );
            mcrypt_module_close( $module );
            return urldecode( $output );
        }
}//end class




/* Prepare data for transmission */
$enc=new encryption(array('key'=>'s0m3v3ryr4nd0mt3xt'));
$payload=enc->encrypt('var1=value1&var2=value2&var3=value3');

$url='http://www.domain.com/process/?payload='.$payload;


/* to decrypt */
$payload=$_GET['payload'];
$decrypted=$enc->decrypt( $payload );

/* process querystring - explode, split whatever.. */

【讨论】:

  • 不明白为什么codeiv 相关,而构造函数中的模式是MCRYPT_MODE_ECB
  • 不知道为什么这被标记了 - 他要求对查询字符串参数进行加密/解密,这就是它的作用。
  • 我没有否决您的答案,但我认为 OP 需要一方(电话应用程序)加密 url,另一方(服务器)将解密它。 OP编辑了答案。
  • 当我回答时,关于手机应用程序的信息不在问题中,而且我还没有发展通灵能力 - 但没关系....
  • 这也遭受了“如果你在代码中输入字母 A-E-S,你做错了”中提到的几乎所有问题。避免。 (不过,mb_detect_encoding 是一个全新的怪事。恭喜!)
猜你喜欢
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多