0

この関数をMySQL関数として書き直して、MySQLで直接デコードできるようにする方法を教えてもらえますか?

const CHAR_MAP = 'abcdefghijklmnopqrstuvwxz0123456789';

function decode($encoded) {
    $elen = strlen($encoded);
    $cmlen = strlen(Mobile::CHAR_MAP);
    $offset = strpos(Mobile::CHAR_MAP, substr($encoded, 0, 1), 1);

    $decoded = '';
    $check = 0;
    for ($i=1;$i<$elen-1;$i++) {
        $a = strpos(Mobile::CHAR_MAP, substr($encoded, $i, 1), 1);
        $x = $a - $offset * $i;

        $x %= $cmlen;

        if ($x < 0) {
            $x = $cmlen + $x;
        }

        $decoded .= $x;

        $check += $x;

    }


    return $decoded;

}
4

1 に答える 1

2

さて、私のより良い判断に反して、私はあなたのために簡単なSQL関数を一緒にハックしました。

SOは、人々があなたのために全体の答えを書くサイトとしてではなく、あなたがあなた自身のために答えを書く方法を学ぶ場所として意図されていることに注意する必要があります。しかし、この場合、答えを出さないと教え方がわからなかったので、ここにあります。

ただし、注意してください:私はこれをまったくテストしていませ。私はそれをSO回答ボックスに直接入力しましたが、実際のmySQLサーバーの近くにはありませんでした。それが機能しない場合(これは可能性が高いです)、それ以上の助けを求める前に自分で修正してみてください(そしてそれがどのように機能するかを学ぶのを助けるための答えの一部としてそれを考慮してください)。

また、バグがある元のPHP関数についてのコメントで私が行った推測は正確であると仮定していることにも注意してください。このSQL関数は、文字列に対して文字シフト操作を実行します。役に立たない数字の文字列は出力されません。

delimiter ||
DROP FUNCTION IF EXISTS mydecode||
CREATE FUNCTION mydecode( x longtext) RETURNS longtext
LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA 
BEGIN
DECLARE len INT UNSIGNED;
DECLARE cpos INT UNSIGNED;
DECLARE output LONGTEXT;
DECLARE charmap LONGTEXT;
DECLARE cshift VARCHAR(1);
DECLARE thischar VARCHAR(1);
DECLARE thischarpos INT UNSIGNED;

SET charmap = 'abcdefghijklmnopqrstuvwxz0123456789abcdefghijklmnopqrstuvwxz0123456789';
SET len = LENGTH(x);
SET cpos = 1;
SET cshift = POSITION(SUBSTRING(x,len,1) IN charmap);

REPEAT
  SET thischar = SUBSTRING(x,cpos,1);
  SET thischarpos = POSITION(thischar IN charmap) + 35;
  SET output = CONCAT_WS(output,SUBSTRING(charmap,thischarpos-cshift,1));
  SET cpos = cpos + 1;
  UNTIL cpos >= len END REPEAT;
return output;
END;
||

これが些細な操作であるというコメントで私が述べたもう1つのポイントを繰り返します。このような単純な文字シフト操作は、実際にはかなり役に立ちません。どこが良いか考えられるシナリオはありません。特にセキュリティではありません。

この「エンコーダー」がセキュリティの一部と見なすものに使用されている場合は、非常に深刻な問題があります。

于 2013-01-02T15:24:15.833 に答える