Cli*_*ote 88 php sql-server escaping input-sanitization
我正在寻找mysql_real_escape_string()SQL Server 的替代方案.是addslashes()我最好的选择还是可以使用另一种替代功能?
编辑:替代品mysql_error()也很有用.
cha*_*aos 73
addslashes()不完全足够,但PHP的mssql包没有提供任何体面的选择.丑陋但完全通用的解决方案是将数据编码为十六进制字节串,即
$unpacked = unpack('H*hex', $data);
mssql_query('
INSERT INTO sometable (somecolumn)
VALUES (0x' . $unpacked['hex'] . ')
');
Run Code Online (Sandbox Code Playgroud)
抽象,那将是:
function mssql_escape($data) {
if(is_numeric($data))
return $data;
$unpacked = unpack('H*hex', $data);
return '0x' . $unpacked['hex'];
}
mssql_query('
INSERT INTO sometable (somecolumn)
VALUES (' . mssql_escape($somevalue) . ')
');
Run Code Online (Sandbox Code Playgroud)
mysql_error()相当于mssql_get_last_message().
gen*_*nio 40
function ms_escape_string($data) {
if ( !isset($data) or empty($data) ) return '';
if ( is_numeric($data) ) return $data;
$non_displayables = array(
'/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15
'/%1[0-9a-f]/', // url encoded 16-31
'/[\x00-\x08]/', // 00-08
'/\x0b/', // 11
'/\x0c/', // 12
'/[\x0e-\x1f]/' // 14-31
);
foreach ( $non_displayables as $regex )
$data = preg_replace( $regex, '', $data );
$data = str_replace("'", "''", $data );
return $data;
}
Run Code Online (Sandbox Code Playgroud)
这里的一些代码是从CodeIgniter中删除的.效果很好,是一个干净的解决方案.
编辑:上面的代码片段有很多问题.请不要在没有阅读评论的情况下使用它来了解它们是什么.更好的是,请不要使用它.参数化查询是您的朋友:http://php.net/manual/en/pdo.prepared-statements.php
Kon*_*tin 15
当你可以在查询中使用参数时,为什么还要麻烦逃避任何事情?!
sqlsrv_query(
$connection,
'UPDATE some_table SET some_field = ? WHERE other_field = ?',
array($_REQUEST['some_field'], $_REQUEST['id'])
)
Run Code Online (Sandbox Code Playgroud)
无论您的值参数是否合适,它都可以在选择,删除,更新中null正常工作.原则问题 - 不要连接SQL,你总是安全的,你的查询读得更好.
http://php.net/manual/en/function.sqlsrv-query.php
小智 5
另一种处理单引号和双引号的方法是
function mssql_escape($str)
{
if(get_magic_quotes_gpc())
{
$str = stripslashes($str);
}
return str_replace("'", "''", $str);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
109504 次 |
| 最近记录: |