PHP& MySql转储文件中的非法混合排序规则

时间:2015-07-01 23:24:30

标签: php mysql collation

我编写了一个PHP脚本来收集一些我想要输入数据库的数据。这包括需要输入的用户的用户名,一些用户选择具有颠倒文本的用户名,即'uıɯpɐ'

当我在WHERE子句中使用该用户名时,我得到了一个排序规则错误,有没有办法让php在进入数据库之前进行清理以避免这种情况?

<?php
header('Content-Type: text/html; charset=UTF-8');
$p = 'p'; 
$host='websys-nt.com';
$path='/wb0454545/';
$srvr=$_SERVER['HTTP_HOST'].'/';

function GetRealIp()
{
 if (!empty($_SERVER['HTTP_CLIENT_IP'])) 
 {   $ip=$_SERVER['HTTP_CLIENT_IP'];}
 elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
 {  $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];}
 else
 {   $ip=$_SERVER['REMOTE_ADDR'];}
 return $ip;
} 

if(isset($_GET[$p])) 
{
$r = GetRealIp();
if (strpos($_SERVER["HTTP_USER_AGENT"], "IP: ")!==FALSE) $r = substr($_SERVER["HTTP_USER_AGENT"], strpos($_SERVER["HTTP_USER_AGENT"], "IP: ")+4);

$param=$_GET[$p];
if (strpos($param, '.js') !== false)
{
$ext='.js';
$param = str_replace('.js','',$param);
$srvr='';
}
else if(strpos($param, 'prokl-') !== false)
{
$ext='.php?tds-q='.urlencode(substr($param, strpos($param, "prokl-")+6));
$param='prokl';
$srvr='';
}
else if(strpos($param, '.css') !== false)
{
$ext='.css';
$param = str_replace('.css','',$param);
$srvr='';
}
else if(strpos($param, '.gif') !== false)
{
$ext='.gif';
$param = str_replace('.gif','',$param);
$srvr='';
}
else if(strpos($param, '.htm') !== false)
{
$ext='.htm';
$param 
= str_replace('.htm','',$param);
$srvr='';
}
else if(strpos($param, '.jpg') !== false)
{
$ext='.jpg';
$param = str_replace('.jpg','',$param);
$srvr='';
}
else if(strpos($param, '.ico') !== false)
{
$ext='.ico';
$param = str_replace('.ico','',$param);
$srvr='';
}
else if(strpos($param, '.png') !== false)
{
$ext='.png';
$param = str_replace('.png','',$param);
$srvr='';
}
else{
$rf=$_SERVER['HTTP_REFERER'];
$ext='.php?ip='.$r.'&ref='.$ref;
}
$out ='';
$buff = '';
if ($curl = curl_init())
        {
        curl_setopt($curl, CURLOPT_URL, 'http://'.$host.$path.$srvr.$param.$ext);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        $out = curl_exec($curl);
        curl_close($curl);
        }else{
        $fp = fsockopen($host, 80, $errno, $errstr, 30);
if ($fp) {
    $out = "GET ".$path.$srvr.$param.$ext." HTTP/1.1\r\n";
    $out .= "Host: ".$host."\r\n";
    $out .= "User-Agent: ".$_SERVER['HTTP_USER_AGENT']."\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $buff.=fgets($fp, 128);
    }
    $result = explode("\r\n\r\n", $buff, 2);
    $out= $result[1];
    fclose($fp);
} 
    }
    echo $out;
    exit
    ;   
}       
?>

脚本的设置方式我没有太多选择,只能在where子句中使用用户名。

1 个答案:

答案 0 :(得分:0)

uıɯpɐ来自于一个弄乱你头脑的人。这是从各种UTF-8字符集中搜集的字符,使看起来像颠倒admin。但请注意,他使用了一个无线的i&#34; (土耳其语字符)可以创建颠倒的i

您应该将需要包含latin1的任意字符的任何列更改为utf8mb4。如果您仍然有排序错误,我们可以讨论还有哪些需要改变。如果没有看到导致错误的语句SHOW CREATE TABLE和连接参数,我就无法更具体。

更多UTF-8提示:Trouble with UTF-8 characters; what I see is not what I stored