回答

收藏

什么是防止sql注入的最佳实践

技术问答 技术问答 274 人阅读 | 0 人回复 | 2023-09-12

我已经做了一些研究,但仍然感到困惑,这是我的研究成果。有人可以发表评论并提出建议,告诉我如何使它们变得更好,或者是否已有可以使用的坚如磐石的实施方案?
& M8 s2 L0 R2 V1 F: B4 J# M方法1:
+ |8 s3 o+ r9 z* e. larray_map('trim', $_GET);* q1 x% f9 |1 C' f( M
array_map('stripslashes', $_GET);
7 `" B9 N% l8 @: Xarray_map('mysql_real_escape_string', $_GET);
* p& q, }9 q8 P9 R  V: V方法2:
2 B) [0 r0 n3 c4 v- Y' M# _2 a2 }function filter($data) {# s0 K' Z* h9 N% @! g% @& k
    $data = trim(htmlentities(strip_tags($data)));
( Y0 }  q) T2 s    if (get_magic_quotes_gpc())* d6 o" X+ M8 L% I+ @( h7 S
        $data = stripslashes($data);6 b" e9 T) d/ J# V4 O
    $data = mysql_real_escape_string($data);
  ^; D  h8 i2 N; N3 Z& {' ?# [: ]1 ]    return $data;% |, U* a# U, @! `% T4 l
}1 ]2 A$ P9 W8 [. @7 E4 I) m
foreach($_GET as $key => $value) {% v; e' a& L5 M% J% p8 j
    $data[$key] = filter($value);, h/ W) c6 @2 [1 |* g8 y
}
" L3 @' j4 d; W: l                9 t( ^0 ]3 Z+ j! T5 j
解决方案:2 K* q4 r+ ?1 ?, T! D% J" T6 r
               
* P! V% g$ G! _$ Z8 g8 i7 q5 ?; Q& W* ?, n; E4 j! H3 u

- B' f/ N0 l4 f* Z5 H                您显示的两种方法都不可取
  M2 `" G/ M- a; z1 J) `: ^9 H一揽子“清理”数据会适得其反,因为需要根据数据的使用方式以不同的方式清理数据:在数据库查询中使用数据需要不同的清理方式,不同于以HTML输出或将其用作参数的方式。在命令行调用中,等等。
/ \/ a; O' s. C! e最好的卫生措施是在使用数据之前。这样,程序员可以轻松地查看是否所有数据实际上都已被清理。! u9 b. @& ?: G, _/ d
如果使用mysql_*函数系列,请mysql_real_escape_string()对查询中使用的每个参数执行“ a ”:* q& X  |8 G: W2 Z
$safe_name = mysql_real_escape_string($_POST["name"]);
$ N5 O1 B9 c6 L$safe_address = mysql_real_escape_string($_POST["address"]);( y# @2 j5 b* X! [
$result = mysql_query ("INSERT INTO table VALUES '$safe_name', '$safe_address'");
9 z: ^+ y% V- {( _如果使用PDO或mysqli函数系列,则可以使用参数化查询,这些查询可以消除大多数SQL注入问题-
# [( u; N+ r( K  f+ p. a每天都可以避免。4 b& c5 D6 T' _4 {: ^
完全可以使用编写安全查询mysql_*,也可以在PDO查询中引入安全漏洞,但是如果您是从头开始的话,请考虑立即使用PDO或mysqli。- D+ g; o  m# r' x
strip_tags()仅当您计划以HTML输出用户输入的数据时才使用;请注意,您需要执行其他操作htmlspecialchars()才能可靠地防止XSS攻击。4 G' x& v! h0 Y0 E1 x( N
唯一具有一定价值的全面卫生方法是
; `" V  `( w1 ]2 Z" s% Q if (get_magic_quotes_gpc()), F! m" ^0 L' S" e+ ^8 f
    $data = stripslashes($data);
/ O4 l% [. O! F9 Z7 f调用可过滤掉早期版本的PHP中现已弃用的“魔术引号”功能所增加的转义层。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则